7 grandes dicas de desenvolvimento de contratos: aprenda as melhores práticas de DeFi com o código DEX

Técnicas maravilhosas de desenvolvimento de contratos: experiências aprendidas com o código do Uniswap

Recentemente, ao escrever um tutorial sobre o desenvolvimento de uma exchange descentralizada, consultei a implementação de código de um DEX conhecido e aprendi bastante. Como um desenvolvedor que já criou contratos NFT simples, esta é a minha primeira tentativa de desenvolvimento de contratos DeFi, e acredito que essas pequenas dicas serão muito úteis para iniciantes que desejam aprender sobre desenvolvimento de contratos.

Vamos dar uma olhada nessas dicas interessantes, algumas das quais podem ser consideradas truques engenhosos.

Série para iniciantes em Web3: Dicas de desenvolvimento de contratos que aprendi com o código do Uniswap

Endereço de implantação de contrato previsível

Normalmente, o endereço obtido ao implantar um contrato parece ser aleatório, pois está relacionado com o nonce, por isso o endereço do contrato é difícil de prever. Mas em certos cenários, precisamos inferir o endereço do contrato através de pares de negociação e informações relacionadas. Isso é muito útil em muitos casos, como determinar permissões de negociação ou obter o endereço do pool de liquidez, entre outros.

É possível criar contratos utilizando o método CREATE2 adicionando o parâmetro salt, assim o endereço do contrato gerado é previsível. A lógica de geração do endereço é: novo endereço = hash("0xFF", endereço do criador, salt, initcode).

Web3 Novos usuários: Dicas de desenvolvimento de contratos que aprendi com o código do Uniswap

Utilizar bem as funções de callback

Em Solidity, os contratos podem chamar uns aos outros. Um cenário é que A chama um método em B, e B, no método chamado, faz uma chamada de retorno a A, o que é útil em certos cenários.

Por exemplo, quando você chama o método swap de um contrato DEX para realizar uma negociação, ele chamará swapCallback, passando o Token que foi calculado como necessário para esta negociação. A parte que chama precisa transferir o Token necessário para o contrato DEX dentro da callback, em vez de dividir o método swap em duas partes para que a parte que chama o execute. Isso garante a segurança do método swap, assegurando que toda a lógica seja executada de forma completa, sem a necessidade de registros de variáveis complicados para garantir a segurança.

Usar exceções para transmitir informações, implementar a estimativa de transação com try catch

Em alguns códigos de DEX, descobrimos que o método de swap é executado dentro de um bloco try catch. Por que isso acontece? Porque precisamos simular o método de swap para estimar os Tokens necessários para a transação, mas essa simulação não resulta em uma troca real de Tokens, portanto, ocorre um erro. Ele lança um erro especial na função de callback da transação e depois captura esse erro, extraindo as informações necessárias a partir da mensagem de erro.

Isto parece um pouco astuto, mas é muito prático. Assim, não é necessário modificar o método de swap para estimar a demanda de transações, e a lógica é mais simples.

Web3 Novato: Dicas de Desenvolvimento de Contratos que Aprendi com o Código do Uniswap

Resolver problemas de precisão com grandes números

No código do DEX, há muita lógica de cálculo, como calcular os Tokens a serem trocados com base no preço atual e na liquidez. Durante esse processo, devemos evitar a perda de precisão ao realizar operações de divisão. Em algumas implementações, o processo de cálculo frequentemente utiliza a operação "<< FixedPoint96.RESOLUTION", que representa um deslocamento à esquerda de 96 bits, equivalente a multiplicar por 2^96. Após o deslocamento à esquerda, realiza-se a operação de divisão, assim pode-se garantir a precisão em operações normais sem estouro, utilizando geralmente uint256, o que é suficiente para garantir a precisão.

Calcular lucros com o método Share

No DEX, precisamos registrar os ganhos de taxa de serviço do fornecedor de liquidez LP(. É evidente que não podemos registrar as taxas de cada LP a cada transação, isso consumiria uma grande quantidade de Gas. Como devemos lidar com isso?

Pode-se definir uma estrutura que inclui feeGrowthInside0LastX128 e feeGrowthInside1LastX128 na posição, que registam a taxa de comissão que cada liquidez deve receber na última retirada de taxas de cada posição.

Em termos simples, basta registrar a taxa total de transação e a taxa que deve ser atribuída a cada liquidez. Quando os LPs retiram as taxas, a taxa que pode ser retirada é calculada com base na liquidez que possuem. Isso é semelhante a ter ações de uma empresa; ao retirar os lucros das ações, você só precisa saber o lucro por ação histórico da empresa e o lucro da última retirada.

![Web3 Novato: Dicas de Desenvolvimento de Contratos que Aprendi com o Código do Uniswap])https://img-cdn.gateio.im/webp-social/moments-45e66af69435e6d4412ae506e77ab893.webp(

Nem todas as informações precisam ser obtidas da cadeia

O armazenamento em cadeia é relativamente caro, por isso nem todas as informações devem ser colocadas na cadeia ou obtidas a partir dela. Por exemplo, muitas das interfaces chamadas por certos sites front-end de DEX são interfaces tradicionais do Web2.

A lista de pools de negociação, informações sobre os pools de negociação, etc., podem ser armazenadas em um banco de dados comum, alguns podem precisar ser sincronizados periodicamente da cadeia, mas não é necessário chamar em tempo real a interface RPC fornecida pelos serviços de cadeia ou nó para obter dados relacionados.

Claro, as transações chave devem ser realizadas na blockchain.

Aprenda a dividir contratos, utilizando contratos padrão existentes

Um projeto pode conter vários contratos realmente implementados. Mesmo que apenas um contrato esteja realmente implementado, podemos dividir o contrato em vários contratos para manutenção através de herança.

Além disso, é possível usar diretamente contratos padrão como @openzeppelin/contracts/token/ERC721/ERC721.sol. Assim, por um lado, é possível gerenciar posições através de NFTs, e por outro lado, também pode-se aumentar a eficiência de desenvolvimento utilizando contratos padrão existentes.

Resumo

A prática de desenvolver uma versão simplificada de uma exchange descentralizada permitirá que você compreenda melhor a implementação do código DEX e aprenda mais pontos de conhecimento em projetos reais. Quer você esteja interessado em desenvolver projetos de Web3 ou DeFi, a experiência prática será de grande ajuda para você.

![Série para iniciantes em Web3: Dicas de desenvolvimento de contratos que aprendi com o código do Uniswap])https://img-cdn.gateio.im/webp-social/moments-f95ddc9d89809cf11dbe65b9bafda157.webp(

DEFI-0.14%
Ver original
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.
  • Recompensa
  • 6
  • Compartilhar
Comentário
0/400
rekt_but_resilientvip
· 07-31 11:05
O endereço do contrato é realmente incrível.
Ver originalResponder0
AltcoinMarathonervip
· 07-31 06:49
Mergulhando fundo em contratos inteligentes
Ver originalResponder0
ZkSnarkervip
· 07-31 03:30
Vale a pena fazer uma pesquisa.
Ver originalResponder0
LiquidityNinjavip
· 07-28 11:40
Aprendi uma nova coisa.
Ver originalResponder0
OldLeekNewSicklevip
· 07-28 11:40
Código é dinheiro.
Ver originalResponder0
WhaleWatchervip
· 07-28 11:38
Os detalhes foram muito bem abordados
Ver originalResponder0
Faça trade de criptomoedas em qualquer lugar e a qualquer hora
qrCode
Escaneie o código para baixar o app da Gate
Comunidade
Português (Brasil)
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)