As técnicas de desenvolvimento de contratos que aprendi ao ler o código do Uniswap são muito mais interessantes do que os livros didáticos



Recentemente, ao fazer um tutorial de desenvolvimento de exchanges descentralizadas, estudei profundamente a implementação do Uniswap V3 e descobri que algumas abordagens são realmente geniais. Antes, só tinha escrito contratos simples de NFT, e desta vez foi a primeira vez que realmente mergulhei no código de contratos DeFi, descobrindo várias coisas que quero compartilhar com quem quer aprender Uniswap.

Vou começar com uma das coisas que mais me surpreenderam — o endereço do contrato pode ser até previsto?

Normalmente, o endereço de um contrato implantado parece aleatório, mas o Uniswap usou uma estratégia inteligente. Ele, ao criar o contrato, adiciona um parâmetro salt, usando a operação CREATE2, para tornar o endereço gerado previsível. A implementação específica é algo como: “pool = address(new UniswapV3Pool{salt: keccak256(abi.encode(token0, token1, fee))}());” nesse trecho de código. Essa abordagem permite que, apenas conhecendo os tokens e a taxa de comissão, se calcule o endereço do pool sem precisar realmente implantá-lo. Isso é especialmente útil para verificar permissões de transação ou localizar rapidamente pools.

O design da função de callback também é bastante engenhoso.

No Uniswap, ao chamar o método swap para fazer uma troca, ele faz uma chamada de retorno para swapCallback, passando a quantidade de tokens necessária, e você, na callback, transfere os tokens. Assim, toda a lógica da troca é executada de forma completa, sem precisar dividir em várias etapas ou usar variáveis complexas para garantir segurança. Em resumo, é como se A chamasse B, e B, ao ser chamado, chamasse A de volta, formando um ciclo fechado.

O método de estimativa de troca também é bem hackeado — usando exceções para transmitir informações.

Como a estimativa de troca não realiza realmente a troca de tokens, ela gera uma exceção. A abordagem do Uniswap é lançar um erro especial na callback, e usar try-catch para capturar e analisar essa mensagem de erro, extraindo os dados necessários. Parece um pouco bruto, mas é bastante prático, permitindo implementar a estimativa sem precisar modificar o método swap.

A solução para problemas de precisão também merece atenção.

Ao calcular a troca de tokens, fazer uma divisão direta pode perder precisão. O Uniswap resolve isso ao deslocar o valor 96 bits à esquerda (equivalente a multiplicar por 2^96), fazer a divisão, e depois ajustar o resultado removendo o fator 2^96. Assim, dentro do intervalo de uint256, consegue-se manter a precisão sem overflow. As variáveis sqrtRatioAX96 e sqrtRatioBX96 no código representam essa lógica, que parece complexa, mas é bem clara na sua ideia.

A forma inteligente de calcular os ganhos de taxas também é interessante.

Em vez de registrar as taxas de cada LP a cada troca — o que consumiria muito gás —, eles mantêm o total de taxas acumuladas e a proporção de participação de cada um. Quando o LP retira seus fundos, basta multiplicar sua liquidez pela taxa acumulada por ação, como um dividendo proporcional. Essa abordagem de cálculo de shares é bastante comum em vários projetos.

Outro ponto importante é que nem toda informação precisa estar na blockchain.

Listas de pools, informações básicas, etc., podem estar em bancos de dados tradicionais, sincronizados periodicamente com a cadeia, sem precisar fazer chamadas RPC em tempo real. Muitos provedores de serviços blockchain oferecem APIs avançadas para obter dados de forma mais rápida e barata, seguindo essa mesma lógica.

Por fim, a organização do código.

Projetos complexos geralmente dividem contratos em várias partes para facilitar manutenção, e o Uniswap faz isso também. Além disso, é importante aproveitar contratos padrão existentes, como usar o ERC721 do OpenZeppelin para gerenciar posições, o que aumenta a eficiência do desenvolvimento e garante qualidade no código.

Para ser honesto, nada substitui a prática. Implementar uma versão simples de uma exchange descentralizada ajuda a entender por que o Uniswap foi projetado assim. O curso WTF-DApp é baseado nessa ideia, guiando você passo a passo na construção de um projeto prático inspirado no Uniswap, o que certamente ajudará bastante no seu desenvolvimento de contratos.
Ver original
Esta página pode conter conteúdos de terceiros, que são fornecidos apenas para fins informativos (sem representações/garantias) e não devem ser considerados como uma aprovação dos seus pontos de vista pela Gate, nem como aconselhamento financeiro ou profissional. Consulte a Declaração de exoneração de responsabilidade para obter mais informações.
  • Recompensa
  • Comentar
  • Republicar
  • Partilhar
Comentar
Adicionar um comentário
Adicionar um comentário
Nenhum comentário
  • Fixar