Dicas e experiências sobre desenvolvimento de contratos
Recentemente, durante o desenvolvimento de uma troca descentralizada, referenciei a implementação do código do Uniswap V3 e aprendi várias técnicas úteis de desenvolvimento de contratos. Como um desenvolvedor que já criou contratos NFT simples, esta tentativa de desenvolvimento de contratos Defi foi muito enriquecedora para mim. Essas técnicas devem ser muito úteis para iniciantes que desejam aprender a desenvolver contratos.
Endereço de contrato previsível
Normalmente, a implantação de um contrato resulta em um endereço que parece aleatório, pois está relacionado ao nonce. Mas em certos cenários, precisamos inferir o endereço do contrato através de informações relacionadas à transação, como determinar permissões de transação ou obter o endereço do pool.
Uma abordagem prática é usar CREATE2 para criar contratos. Ao adicionar o parâmetro salt, é possível tornar o endereço do contrato criado previsível. A lógica de geração do novo endereço é: hash("0xFF", endereço do criador, salt, initcode). Essa abordagem nos permite saber o endereço antes de criar o contrato.
Uso inteligente de funções de callback
Os contratos em Solidity podem chamar uns aos outros. Em certas situações, A chama o método de B, e B faz uma chamada de retorno para A no método chamado; esse padrão é muito útil.
Por exemplo, durante a negociação, o contrato do pool chamará swapCallback, passando a quantidade real de Tokens necessária para esta transação. A parte chamadora precisa transferir os Tokens para o contrato do pool durante o callback. Este método garante a segurança e integridade do método swap, sem a necessidade de registros de variáveis complexos.
Usar exceções para transmitir informações, usar try-catch para estimar transações
Ao estimar uma transação, precisamos simular o método swap, mas não trocar realmente os Tokens. Uma abordagem inteligente é lançar um erro especial no callback da transação e, em seguida, capturar esse erro e extrair as informações necessárias dele. Essa abordagem evita a necessidade de adaptar o método swap especificamente para a estimativa da transação, tornando a lógica mais simples.
A grande numeração resolve o problema de precisão
Quando se trata de cálculos de preços e liquidez, para evitar a perda de precisão nas operações de divisão, pode-se utilizar a operação de deslocamento à esquerda ( que equivale a multiplicar por 2^96). Desta forma, é possível garantir a precisão durante transações normais sem estouros. Embora teoricamente ainda haja uma pequena perda de precisão, ela já é aceitável.
Cálculo de lucros pelo método Share
Para o cálculo da receita de taxas de transação dos LPs, não é viável registrar cada LP em cada transação, pois isso consumiria uma quantidade significativa de Gas. Uma boa abordagem é registrar a taxa total e a taxa que deve ser alocada por unidade de liquidez. Quando os LPs retiram, as taxas que podem ser retiradas são calculadas com base na liquidez mantida, semelhante ao princípio dos dividendos de ações.
Combinação de dados on-chain e off-chain
Nem toda a informação precisa ser colocada na blockchain ou obtida a partir dela. Informações como listas de pools, detalhes dos pools, etc., podem ser armazenadas em bancos de dados comuns e sincronizadas periodicamente a partir da blockchain. Isso pode melhorar o desempenho e a eficiência, reduzindo os custos. Claro que transações críticas ainda precisam ser realizadas na blockchain.
Divisão de Contrato e Reutilização de Contratos Padrão
Um projeto pode conter vários contratos realmente implantados. Mesmo que apenas um contrato seja implantado, o código pode ser mantido dividindo-o em vários contratos por meio da herança.
Ao mesmo tempo, utilizar contratos padrão existentes ( como o ERC721) pode aumentar a eficiência do desenvolvimento. Por exemplo, usar o ERC721 para gerenciar posições é conveniente e permite a reutilização de código maduro.
Resumo
A prática de desenvolvimento é a melhor maneira de aprender. Tentar implementar uma versão simplificada de uma bolsa descentralizada pode ajudá-lo a entender melhor a implementação do código do Uniswap e aprender mais sobre pontos de conhecimento em projetos práticos. Espero que essas experiências compartilhadas sejam úteis para você.
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
12 Curtidas
Recompensa
12
3
Compartilhar
Comentário
0/400
gas_fee_trauma
· 12h atrás
Os contratos são difíceis de lidar, irmão.
Ver originalResponder0
SchrodingerAirdrop
· 12h atrás
Renascentista, eu renasci em uma negociação anômala
Desenvolvimento de Contratos Inteligentes Avançado: 7 Dicas Práticas para Ajudar Projetos DeFi
Dicas e experiências sobre desenvolvimento de contratos
Recentemente, durante o desenvolvimento de uma troca descentralizada, referenciei a implementação do código do Uniswap V3 e aprendi várias técnicas úteis de desenvolvimento de contratos. Como um desenvolvedor que já criou contratos NFT simples, esta tentativa de desenvolvimento de contratos Defi foi muito enriquecedora para mim. Essas técnicas devem ser muito úteis para iniciantes que desejam aprender a desenvolver contratos.
Endereço de contrato previsível
Normalmente, a implantação de um contrato resulta em um endereço que parece aleatório, pois está relacionado ao nonce. Mas em certos cenários, precisamos inferir o endereço do contrato através de informações relacionadas à transação, como determinar permissões de transação ou obter o endereço do pool.
Uma abordagem prática é usar CREATE2 para criar contratos. Ao adicionar o parâmetro salt, é possível tornar o endereço do contrato criado previsível. A lógica de geração do novo endereço é: hash("0xFF", endereço do criador, salt, initcode). Essa abordagem nos permite saber o endereço antes de criar o contrato.
Uso inteligente de funções de callback
Os contratos em Solidity podem chamar uns aos outros. Em certas situações, A chama o método de B, e B faz uma chamada de retorno para A no método chamado; esse padrão é muito útil.
Por exemplo, durante a negociação, o contrato do pool chamará swapCallback, passando a quantidade real de Tokens necessária para esta transação. A parte chamadora precisa transferir os Tokens para o contrato do pool durante o callback. Este método garante a segurança e integridade do método swap, sem a necessidade de registros de variáveis complexos.
Usar exceções para transmitir informações, usar try-catch para estimar transações
Ao estimar uma transação, precisamos simular o método swap, mas não trocar realmente os Tokens. Uma abordagem inteligente é lançar um erro especial no callback da transação e, em seguida, capturar esse erro e extrair as informações necessárias dele. Essa abordagem evita a necessidade de adaptar o método swap especificamente para a estimativa da transação, tornando a lógica mais simples.
A grande numeração resolve o problema de precisão
Quando se trata de cálculos de preços e liquidez, para evitar a perda de precisão nas operações de divisão, pode-se utilizar a operação de deslocamento à esquerda ( que equivale a multiplicar por 2^96). Desta forma, é possível garantir a precisão durante transações normais sem estouros. Embora teoricamente ainda haja uma pequena perda de precisão, ela já é aceitável.
Cálculo de lucros pelo método Share
Para o cálculo da receita de taxas de transação dos LPs, não é viável registrar cada LP em cada transação, pois isso consumiria uma quantidade significativa de Gas. Uma boa abordagem é registrar a taxa total e a taxa que deve ser alocada por unidade de liquidez. Quando os LPs retiram, as taxas que podem ser retiradas são calculadas com base na liquidez mantida, semelhante ao princípio dos dividendos de ações.
Combinação de dados on-chain e off-chain
Nem toda a informação precisa ser colocada na blockchain ou obtida a partir dela. Informações como listas de pools, detalhes dos pools, etc., podem ser armazenadas em bancos de dados comuns e sincronizadas periodicamente a partir da blockchain. Isso pode melhorar o desempenho e a eficiência, reduzindo os custos. Claro que transações críticas ainda precisam ser realizadas na blockchain.
Divisão de Contrato e Reutilização de Contratos Padrão
Um projeto pode conter vários contratos realmente implantados. Mesmo que apenas um contrato seja implantado, o código pode ser mantido dividindo-o em vários contratos por meio da herança.
Ao mesmo tempo, utilizar contratos padrão existentes ( como o ERC721) pode aumentar a eficiência do desenvolvimento. Por exemplo, usar o ERC721 para gerenciar posições é conveniente e permite a reutilização de código maduro.
Resumo
A prática de desenvolvimento é a melhor maneira de aprender. Tentar implementar uma versão simplificada de uma bolsa descentralizada pode ajudá-lo a entender melhor a implementação do código do Uniswap e aprender mais sobre pontos de conhecimento em projetos práticos. Espero que essas experiências compartilhadas sejam úteis para você.