7 dicas para o desenvolvimento de contratos Uniswap: aumentar a eficiência e segurança dos projetos de Finanças Descentralizadas

robot
Geração do resumo em andamento

Dicas de Desenvolvimento de Contratos: Experiências Valiosas Aprendidas com o Código do Uniswap

Recentemente, ao escrever um tutorial sobre o desenvolvimento de exchanges descentralizadas, aprendi várias técnicas de desenvolvimento de contratos estudando a implementação do código do Uniswap V3. Como um novato que acaba de entrar no desenvolvimento de contratos Defi, essas pequenas dicas foram muito inspiradoras para mim e acredito que também ajudarão outros novatos que desejam aprender sobre desenvolvimento de contratos.

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 aleatório, sendo difícil de prever. No entanto, em certos cenários, precisamos inferir o endereço do contrato através de pares de negociação e informações relacionadas, como determinar permissões de transação ou obter o endereço de um pool, entre outros.

A Uniswap utiliza o método CREATE2 para criar contratos, adicionando um parâmetro "salt" para 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). Este método é muito prático em muitas situações.

Web3 Novato Série: 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-se uns aos outros. Às vezes, A chama o método de B, e B faz uma chamada de volta a A no método que foi chamado, o que é útil em certos cenários.

Por exemplo, no método swap do Uniswap, o contrato UniswapV3Pool chamará o swapCallback, passando o Token que a transação realmente requer. O chamador deve transferir o Token necessário para o UniswapV3Pool na callback, em vez de desmembrar o método swap. Isso garante a segurança e a execução completa do método swap, sem a necessidade de registros de variáveis complicadas.

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

No contrato Quoter do Uniswap, o método swap do UniswapV3Pool é encapsulado em um bloco try catch. Isso é feito para simular a troca e estimar os tokens necessários para a transação. Durante a estimativa, os tokens não são realmente trocados, portanto, um erro é gerado. O Uniswap lança um erro especial na função de callback, que é então capturado e as informações necessárias são extraídas.

Este método pode parecer uma solução fácil, mas é muito prático. Não é necessário modificar 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 contrato que aprendi com o código do Uniswap

Grande número resolve problemas de precisão

O código do Uniswap envolve muitas lógicas 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 nas operações 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. Após o deslocamento, a divisão é feita, garantindo a precisão em condições normais de negociação sem estouro.

Embora haja ainda uma ligeira perda de precisão em teoria, já é aceitável.

Cálculo de ganhos através do Share

A Uniswap precisa registrar os ganhos de taxa dos provedores de liquidez LP(. É evidente que não se pode registrar a taxa de cada LP em cada transação, pois isso consumiria uma grande quantidade de Gas.

A estrutura Position do Uniswap contém feeGrowthInside0LastX128 e feeGrowthInside1LastX128, que registram a taxa de comissão que cada posição deve receber na última extração de taxas.

Basta registrar a taxa total de transação e a taxa de transação que deve ser atribuída a cada liquidez. Ao retirar os LPs, a taxa de transação que pode ser retirada é calculada com base na liquidez detida. Semelhante a ter ações de uma empresa, ao retirar os lucros, basta saber o lucro por ação histórico e o lucro da última retirada.

![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-45e66af69435e6d4412ae506e77ab893.webp(

Informação não crítica não precisa ser registrada na cadeia

O armazenamento em cadeia é relativamente caro, e nem toda a informação precisa estar na cadeia ou ser obtida a partir da cadeia. Por exemplo, muitas interfaces chamadas pela interface frontal do Uniswap são interfaces tradicionais do Web2.

A lista de pools de negociação, informações, etc., pode ser armazenada em um banco de dados comum, com parte dos dados necessitando ser sincronizada periodicamente da blockchain. Não é necessário chamar em tempo real a interface RPC dos serviços da blockchain ou nós para obter os dados relevantes.

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

Divisão de Contratos e Utilização de Contratos Padrão

Um projeto pode conter vários contratos efetivamente implementados. Mesmo que haja apenas um contrato efetivamente implementado, ele pode ser dividido em vários contratos para manutenção por meio de herança.

O contrato NonfungiblePositionManager da Uniswap herda vários contratos. O ERC721Permit utiliza diretamente o contrato ERC721 da OpenZeppelin, facilitando a gestão de posições através de NFTs e aumentando a eficiência do desenvolvimento.

Conclusão

A prática de desenvolver uma versão simplificada de uma bolsa descentralizada pode ajudá-lo a entender mais profundamente a implementação do código do Uniswap e aprender mais pontos de conhecimento de projetos reais. Ler muitos artigos não é tão eficaz quanto colocar a mão na massa; espero que essas experiências sejam úteis para os novatos que desejam aprender a desenvolver contratos.

![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-f95ddc9d89809cf11dbe65b9bafda157.webp(

UNI-2.08%
DEFI-0.43%
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
  • 10
  • Repostar
  • Compartilhar
Comentário
0/400
GasGuzzlervip
· 07-18 21:18
Não brinque tão a fundo com novatos.
Ver originalResponder0
LowCapGemHuntervip
· 07-17 14:17
Dicas indispensáveis para os desenvolvedores veteranos!
Ver originalResponder0
SmartMoneyWalletvip
· 07-15 22:24
na cadeia transações não escapam aos meus olhos
Ver originalResponder0
WalletDetectivevip
· 07-15 22:24
v3 é tão simples? Depois de olhar, percebi que não entendo nada.
Ver originalResponder0
gas_guzzlervip
· 07-15 22:21
又在凭本事Cupões de Recorte
Ver originalResponder0
AllInDaddyvip
· 07-15 21:55
O código da V3 é realmente sólido.
Ver originalResponder0
SleepyValidatorvip
· 07-15 21:55
Falar tão detalhadamente não é melhor do que pegar o código-fonte e fazer você mesmo.
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)