Uniswap código fonte revelado: 7 grandes dicas de desenvolvimento de contratos para ajudar os novatos em DeFi até à lua

robot
Geração do resumo em andamento

Dicas de desenvolvimento de contratos: aprendendo com o código-fonte do Uniswap

Recentemente, ao escrever um tutorial sobre o desenvolvimento de uma exchange descentralizada, referenciei a implementação do código do Uniswap V3 e aprendi muitos pontos de conhecimento valiosos. Como um desenvolvedor que está tentando desenvolver contratos DeFi pela primeira vez, essas dicas serão muito úteis para iniciantes que desejam aprender sobre desenvolvimento de contratos.

Aqui estão algumas dicas que aprendi, algumas das quais podem até ser consideradas truques engenhosos.

Web3 Novato Série: Dicas de desenvolvimento de contrato 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 aleatório, pois está relacionado ao nonce, tornando o endereço do contrato difícil de prever. No entanto, em certos cenários, precisamos ser capazes de deduzir o endereço do contrato a partir do par de transações e informações relacionadas. Isso é útil em situações como a avaliação de permissões de transação ou a obtenção de endereços de pools.

A Uniswap cria contratos usando o parâmetro salt e o método CREATE2, tornando o endereço do contrato criado previsível. A lógica de geração do endereço é: novo endereço = hash("0xFF", endereço do criador, salt, initcode).

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

Uso inteligente de funções de callback

Em certos cenários, o contrato A chama o método do contrato B, e B faz uma chamada de volta para A no método chamado, essa abordagem é muito prática.

Por exemplo, ao negociar chamando o método swap do contrato UniswapV3Pool, ele fará uma chamada de retorno swapCallback, passando o Token que foi calculado como necessário para a transação. O chamador precisa transferir o Token necessário para o UniswapV3Pool na chamada de retorno, em vez de dividir o método swap em duas partes para que o chamador o chame. 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.

Utilizar a transmissão de informações através de exceções, implementar a previsão de transações com try catch

No contrato Quoter do Uniswap, o método swap do UniswapV3Pool é executado envolto em try catch. Isso é feito para simular o método swap a fim de estimar os Tokens necessários para a transação. Como a estimativa não gera efetivamente a troca de Tokens, um erro é gerado. O Uniswap lança um erro especial na função de callback da transação e, em seguida, captura esse erro para extrair as informações necessárias a partir da mensagem de erro.

Esta abordagem pode parecer uma manobra fácil, mas é muito prática. Não é necessário adaptar o método swap para estimar a demanda de negociação, a lógica é mais simples.

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

Usando números grandes para resolver problemas de precisão

No código do Uniswap, há uma grande quantidade de lógica de cálculo, como calcular os tokens a serem trocados com base no preço atual e na liquidez. Para evitar a perda de precisão durante a operação de divisão, o processo de cálculo frequentemente utiliza a operação "<< FixedPoint96.RESOLUTION", que equivale a deslocar para a esquerda 96 bits, ou seja, multiplicar por 2^96. Depois do deslocamento para a esquerda, a operação de divisão é realizada, garantindo a precisão sob condições normais de negociação sem overflow.

Calcular os rendimentos com a forma Share

No Uniswap, é necessário registrar os ganhos de taxas dos provedores de liquidez LP(. É evidente que não é viável registrar as taxas de cada LP a cada transação, pois isso consumiria uma quantidade enorme de Gas.

A solução do Uniswap é registrar feeGrowthInside0LastX128 e feeGrowthInside1LastX128 na estrutura Position, representando as taxas devidas a cada liquidez na última retirada de taxa de cada posição. Basta registrar a taxa total e a taxa que cada liquidez deve receber, e ao retirar, o LP calcula a taxa que pode ser retirada com base na liquidez detida. Isso é semelhante a possuir ações de uma empresa, onde para retirar lucros, é necessário apenas conhecer o histórico de lucros por ação da empresa e os lucros da última retirada.

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

Informação não essencial não precisa ser obtida da blockchain

O armazenamento em blockchain é relativamente caro, e nem todas as informações precisam ser armazenadas na blockchain ou obtidas a partir dela. Muitos dos interfaces chamados pelo site front-end da Uniswap são interfaces tradicionais do Web2.

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

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

Divisão razoável de contratos, utilizando contratos padrão existentes

Um projeto pode conter vários contratos que foram realmente implementados. Mesmo que haja apenas um contrato realmente implementado, o código pode ser dividido em vários contratos para manutenção através de herança.

Por exemplo, o contrato NonfungiblePositionManager da Uniswap herda vários contratos. Ao verificar a implementação do contrato ERC721Permit, observa-se que ele utiliza diretamente o contrato @openzeppelin/contracts/token/ERC721/ERC721.sol. Isso facilita a gestão de posições por meio de NFTs e permite aproveitar os contratos padrão existentes para aumentar a eficiência do desenvolvimento.

Resumo

A prática é o melhor método de aprendizagem. Tentar implementar uma versão simplificada de uma bolsa de valores descentralizada pode ajudar a compreender mais profundamente a implementação do código do Uniswap e a aprender mais sobre pontos de conhecimento em projetos práticos.

![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(

Ver original
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.
  • Recompensa
  • 8
  • Compartilhar
Comentário
0/400
SchrodingerWalletvip
· 07-09 09:07
Muito básico, vou-me embora~
Ver originalResponder0
LiquidityWizardvip
· 07-08 13:06
É só copiar e colar.
Ver originalResponder0
PoolJumpervip
· 07-07 22:21
Contrato pro, socorro!
Ver originalResponder0
IntrovertMetaversevip
· 07-06 09:37
Já vem aí o contrato de rolagem novamente.
Ver originalResponder0
SerumSurfervip
· 07-06 09:37
Este código-fonte v3 é bastante impressionante.
Ver originalResponder0
FlyingLeekvip
· 07-06 09:36
看起来不错 期待被 fazer as pessoas de parvas
Ver originalResponder0
LiquidityWhisperervip
· 07-06 09:31
Finalmente consigo entender o código uniV3
Ver originalResponder0
GateUser-75ee51e7vip
· 07-06 09:10
Este código é interessante.
Ver originalResponder0
  • Marcar
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)