Dicas de desenvolvimento de contratos: experiências valiosas aprendidas com o código do Uniswap
Recentemente, ao desenvolver um tutorial sobre uma exchange descentralizada, consultei a implementação de código de uma DEX conhecida e aprendi muitos pontos interessantes. Como um novato que só havia desenvolvido contratos NFT simples antes, esta é a minha primeira tentativa de desenvolver contratos DeFi, e essas dicas devem ser muito úteis para desenvolvedores que desejam começar.
Vamos dar uma olhada nessas dicas úteis, algumas das quais podem ser consideradas truques engenhosos.
Endereço de implantação de contrato previsível
Os endereços de contratos normalmente implantados parecem aleatórios, pois estão relacionados com o nonce. No entanto, em certos cenários, precisamos inferir o endereço do contrato com base nas informações das transações, o que é útil para determinar permissões de transação ou obter o endereço da pool.
Pode-se criar contratos utilizando o método CREATE2 adicionando o parâmetro salt, assim o endereço gerado é previsível. A lógica de geração do endereço é: novo endereço = hash("0xFF", endereço do criador, salt, initcode).
Utilização inteligente de funções de callback
Em Solidity, os contratos podem chamar uns aos outros. Às vezes, o método A chama o B, e o B faz uma chamada de volta ao A no método chamado, o que é útil em certos cenários.
Por exemplo, ao negociar, o método swap do contrato pool fará uma chamada de retorno swapCallback, passando a quantidade real de Token necessária. A parte chamadora deve transferir o Token no retorno da chamada, em vez de dividir o swap em duas etapas. Isso garante a execução completa e a segurança do método swap.
Usar exceções para transmitir informações, implementar a estimativa de transação com try-catch
Na estimativa de transações, precisamos simular a troca, mas sem realmente trocar Tokens. Podemos lançar um erro especial no callback e, em seguida, capturá-lo e analisar os dados necessários a partir da mensagem de erro. Assim, não é necessário modificar o método de troca para a necessidade de estimativa, tornando a lógica mais simples.
Usando grandes números para resolver problemas de precisão
Em cálculos complexos, para evitar a perda de precisão na divisão, pode-se primeiro deslocar à esquerda 96 bits. ( equivale a multiplicar por 2^96). Após o cálculo, pode-se deslocar à direita. Dessa forma, é possível garantir a precisão sem transbordo. A perda de precisão na unidade mínima geralmente é aceitável.
Cálculo de rendimentos usando o Share
Para o cálculo dos lucros de LP, não é necessário registrar a cada transação. Pode-se registrar a taxa total e a parte que cada liquidez deve receber, e no momento da retirada do LP, calcula-se com base na liquidez mantida. Semelhante a um dividendo de ações, basta conhecer a história do lucro por ação e o último momento de retirada.
Armazenamento fora da cadeia de informações
O armazenamento em cadeia é relativamente caro, nem todas as informações precisam estar em cadeia. Por exemplo, listas de pools de transações e informações podem existir em um banco de dados comum, sincronizando periodicamente a partir da cadeia. Algumas interfaces RPC avançadas também oferecem formas de obtenção de dados mais rápidas e baratas.
Divisão razoável de contratos, utilizando padrões existentes
Um projeto pode conter vários contratos efetivamente implantados. Mesmo que apenas um seja implantado, ele pode ser dividido em vários contratos através da herança para manutenção. Ao mesmo tempo, é possível utilizar contratos padrão existentes como o ERC721 para aumentar a eficiência do desenvolvimento.
Resumo
Implementar manualmente uma versão simplificada de um DEX pode ajudar a entender melhor a implementação do código e aprender mais sobre pontos de conhecimento em projetos práticos. Recomendo que amigos interessados tentem seguir tutoriais relacionados passo a passo, acreditando que terão grandes ganhos.
Esta página pode conter conteúdo de terceiros, que é fornecido apenas para fins informativos (não para representações/garantias) e não deve ser considerada como um endosso de suas opiniões pela Gate nem como aconselhamento financeiro ou profissional. Consulte a Isenção de responsabilidade para obter detalhes.
12 Curtidas
Recompensa
12
5
Compartilhar
Comentário
0/400
SelfSovereignSteve
· 07-20 03:12
Novato, não force o código-fonte.
Ver originalResponder0
TooScaredToSell
· 07-20 03:09
Para que serve aprender isso, se ainda se perde dinheiro?
Ver originalResponder0
ChainMaskedRider
· 07-20 03:08
A boa nova para os novatos da DEX chegou
Ver originalResponder0
OnchainUndercover
· 07-20 02:53
Estudar U é tão fácil quanto copiar o dever de casa.
Análise do código-fonte do Uniswap: 7 dicas de desenvolvimento de contratos para ajudar na entrada no DEX
Dicas de desenvolvimento de contratos: experiências valiosas aprendidas com o código do Uniswap
Recentemente, ao desenvolver um tutorial sobre uma exchange descentralizada, consultei a implementação de código de uma DEX conhecida e aprendi muitos pontos interessantes. Como um novato que só havia desenvolvido contratos NFT simples antes, esta é a minha primeira tentativa de desenvolver contratos DeFi, e essas dicas devem ser muito úteis para desenvolvedores que desejam começar.
Vamos dar uma olhada nessas dicas úteis, algumas das quais podem ser consideradas truques engenhosos.
Endereço de implantação de contrato previsível
Os endereços de contratos normalmente implantados parecem aleatórios, pois estão relacionados com o nonce. No entanto, em certos cenários, precisamos inferir o endereço do contrato com base nas informações das transações, o que é útil para determinar permissões de transação ou obter o endereço da pool.
Pode-se criar contratos utilizando o método CREATE2 adicionando o parâmetro salt, assim o endereço gerado é previsível. A lógica de geração do endereço é: novo endereço = hash("0xFF", endereço do criador, salt, initcode).
Utilização inteligente de funções de callback
Em Solidity, os contratos podem chamar uns aos outros. Às vezes, o método A chama o B, e o B faz uma chamada de volta ao A no método chamado, o que é útil em certos cenários.
Por exemplo, ao negociar, o método swap do contrato pool fará uma chamada de retorno swapCallback, passando a quantidade real de Token necessária. A parte chamadora deve transferir o Token no retorno da chamada, em vez de dividir o swap em duas etapas. Isso garante a execução completa e a segurança do método swap.
Usar exceções para transmitir informações, implementar a estimativa de transação com try-catch
Na estimativa de transações, precisamos simular a troca, mas sem realmente trocar Tokens. Podemos lançar um erro especial no callback e, em seguida, capturá-lo e analisar os dados necessários a partir da mensagem de erro. Assim, não é necessário modificar o método de troca para a necessidade de estimativa, tornando a lógica mais simples.
Usando grandes números para resolver problemas de precisão
Em cálculos complexos, para evitar a perda de precisão na divisão, pode-se primeiro deslocar à esquerda 96 bits. ( equivale a multiplicar por 2^96). Após o cálculo, pode-se deslocar à direita. Dessa forma, é possível garantir a precisão sem transbordo. A perda de precisão na unidade mínima geralmente é aceitável.
Cálculo de rendimentos usando o Share
Para o cálculo dos lucros de LP, não é necessário registrar a cada transação. Pode-se registrar a taxa total e a parte que cada liquidez deve receber, e no momento da retirada do LP, calcula-se com base na liquidez mantida. Semelhante a um dividendo de ações, basta conhecer a história do lucro por ação e o último momento de retirada.
Armazenamento fora da cadeia de informações
O armazenamento em cadeia é relativamente caro, nem todas as informações precisam estar em cadeia. Por exemplo, listas de pools de transações e informações podem existir em um banco de dados comum, sincronizando periodicamente a partir da cadeia. Algumas interfaces RPC avançadas também oferecem formas de obtenção de dados mais rápidas e baratas.
Divisão razoável de contratos, utilizando padrões existentes
Um projeto pode conter vários contratos efetivamente implantados. Mesmo que apenas um seja implantado, ele pode ser dividido em vários contratos através da herança para manutenção. Ao mesmo tempo, é possível utilizar contratos padrão existentes como o ERC721 para aumentar a eficiência do desenvolvimento.
Resumo
Implementar manualmente uma versão simplificada de um DEX pode ajudar a entender melhor a implementação do código e aprender mais sobre pontos de conhecimento em projetos práticos. Recomendo que amigos interessados tentem seguir tutoriais relacionados passo a passo, acreditando que terão grandes ganhos.