O que todo desenvolvedor Web3 deve saber: lições valiosas aprendidas com os contratos da Uniswap
Recentemente, enquanto escrevia um tutorial de desenvolvimento de uma exchange descentralizada, estudei em profundidade a implementação do código do Uniswap V3 e aprendi bastante. Como um novato que acabou de entrar no desenvolvimento de contratos Defi, essas dicas foram, sem dúvida, uma revelação para mim. Acredito que essas experiências também serão muito úteis para outros amigos que desejam começar no desenvolvimento de contratos inteligentes.
Dicas para prever o endereço do contrato
Em geral, o endereço obtido após a implantação de um contrato parece aleatório e é difícil de prever. Mas no Uniswap, podemos deduzir o endereço do contrato através dos pares de negociação e das informações relacionadas. Isso é muito útil em cenários como a verificação de permissões de negociação ou a obtenção do endereço do pool.
A Uniswap utiliza o método CREATE2 para criar contratos, adicionando o parâmetro "salt" para que o endereço gerado seja previsível. A lógica específica de geração de endereços é a seguinte: novo endereço = hash("0xFF", endereço do criador, salt, initcode).
Uso inteligente de funções de retorno
Em certos cenários, a chamada mútua entre contratos é muito útil. Por exemplo, o método A chama B, e B faz uma chamada de retorno para A no método chamado.
No Uniswap, quando o método swap do contrato UniswapV3Pool é chamado para realizar uma negociação, ele chamará o swapCallback, passando a quantidade real de tokens necessária calculada. A parte que chama deve transferir os tokens necessários para o UniswapV3Pool durante a chamada de retorno. Este design garante a segurança e a integridade lógica do método swap, eliminando a necessidade de registros de variáveis complicados.
Transmissão de informações anormais, implementação de previsão de transação com try-catch
No contrato Quoter da Uniswap, utiliza-se o try-catch para envolver a execução do método swap do UniswapV3Pool. Isso é feito para simular a troca e estimar os Tokens necessários para a transação. Como a estimativa não realiza a troca de Tokens, um erro será acionado. A Uniswap lança um erro especial na função de callback da transação, e então captura esse erro para extrair as informações necessárias.
Este método pode parecer uma manobra, mas é muito prático. Não é necessário adaptar o método swap especificamente para estimar a demanda de negociação, a lógica é mais simples.
Cálculo de Grandes Números para Resolver Problemas de Precisão
O código do Uniswap envolve uma grande quantidade de lógica de cálculo, como calcular a quantidade de Token a ser trocada com base no preço atual e na liquidez. Para evitar a perda de precisão devido a operações de divisão, o processo de cálculo utiliza frequentemente a operação "<< FixedPoint96.RESOLUTION", ou seja, deslocando para a esquerda 96 bits, o que equivale a multiplicar por 2^96. Sob a premissa de que as transações normais não transbordam, ( geralmente é calculado usando uint256, esse método pode garantir efetivamente a precisão.
![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-b0c3d4eb7e8ca88cc4cfc9476a34437a.webp(
Cálculo de ganhos do mecanismo de compartilhamento
A Uniswap precisa registrar os ganhos com taxas dos provedores de liquidez LP). É evidente que não se pode registrar as taxas para cada LP individualmente a cada transação, pois isso consumiria uma quantidade enorme de Gas.
A solução da Uniswap é definir feeGrowthInside0LastX128 e feeGrowthInside1LastX128 na estrutura Position, registrando a taxa de crescimento das taxas de cada posição na última vez que as taxas foram retiradas, para cada unidade de liquidez que deveria ser recebida.
Este método requer apenas o registo da taxa total de serviço e da taxa de serviço a ser atribuída por unidade de liquidez. Quando os LPs retiram, a taxa de serviço que podem retirar pode ser calculada com base na liquidez detida. Isso é semelhante a como os acionistas calculam os rendimentos disponíveis com base nos lucros históricos por ação da empresa e nos rendimentos da última retirada.
Compromissos na obtenção de informações em blockchain
O armazenamento em cadeia é relativamente caro, e nem todas as informações precisam ser armazenadas em cadeia ou obtidas a partir da cadeia. Por exemplo, muitas das interfaces chamadas pelo site front-end da Uniswap são interfaces tradicionais da 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, sendo que alguns podem precisar ser sincronizados periodicamente da cadeia. Não é necessário chamar em tempo real a interface RPC de serviços de cadeia ou nós para obter dados relevantes.
Claro, as transações chave devem ser realizadas na cadeia. Agora, muitos fornecedores de RPC de blockchain oferecem interfaces avançadas que permitem obter certos dados de forma mais rápida e econômica.
Divisão de contratos e reutilização de contratos padrão
Um projeto pode conter vários contratos realmente implementados. Mesmo que haja apenas um contrato implementado, podemos dividir o código em vários contratos para manutenção por meio de herança.
Por exemplo, o contrato NonfungiblePositionManager da Uniswap herda vários contratos. Além disso, o contrato ERC721Permit utiliza diretamente o contrato padrão ERC721 da OpenZeppelin. Isso não só facilita a gestão de posições através de NFTs, mas também aproveita os contratos padrão existentes para aumentar a eficiência do desenvolvimento.
Conclusão
A prática traz o verdadeiro conhecimento. Participar pessoalmente do desenvolvimento de uma versão simplificada de uma exchange descentralizada permitirá que você entenda mais profundamente a implementação do código do Uniswap, ao mesmo tempo em que aprende mais sobre pontos de conhecimento em projetos reais. Se você está interessado no desenvolvimento de projetos Web3 e DeFi, pode considerar cursos práticos relacionados, completando passo a passo uma exchange simplificada. Acreditamos que isso será muito benéfico para o seu aprendizado.
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.
7 gostos
Recompensa
7
4
Partilhar
Comentar
0/400
AirdropHunter9000
· 08-04 14:09
Defi não é um jogo de cair para zero... quem entende, entende.
Ver originalResponder0
TokenAlchemist
· 08-04 14:09
lmao imagina não saber sobre CREATE2 para endereços determinísticos... ngmi tbh
Ver originalResponder0
RugpullAlertOfficer
· 08-04 14:08
Isso é definitivamente um tutorial para novatos sem experiência.
Ver originalResponder0
AllTalkLongTrader
· 08-04 14:02
Não olhar o código, olhar o endereço. Será preguiça ou superioridade?
7 grandes técnicas para analisar contratos inteligentes Uniswap: leitura obrigatória para desenvolvedores Web3
O que todo desenvolvedor Web3 deve saber: lições valiosas aprendidas com os contratos da Uniswap
Recentemente, enquanto escrevia um tutorial de desenvolvimento de uma exchange descentralizada, estudei em profundidade a implementação do código do Uniswap V3 e aprendi bastante. Como um novato que acabou de entrar no desenvolvimento de contratos Defi, essas dicas foram, sem dúvida, uma revelação para mim. Acredito que essas experiências também serão muito úteis para outros amigos que desejam começar no desenvolvimento de contratos inteligentes.
Dicas para prever o endereço do contrato
Em geral, o endereço obtido após a implantação de um contrato parece aleatório e é difícil de prever. Mas no Uniswap, podemos deduzir o endereço do contrato através dos pares de negociação e das informações relacionadas. Isso é muito útil em cenários como a verificação de permissões de negociação ou a obtenção do endereço do pool.
A Uniswap utiliza o método CREATE2 para criar contratos, adicionando o parâmetro "salt" para que o endereço gerado seja previsível. A lógica específica de geração de endereços é a seguinte: novo endereço = hash("0xFF", endereço do criador, salt, initcode).
Uso inteligente de funções de retorno
Em certos cenários, a chamada mútua entre contratos é muito útil. Por exemplo, o método A chama B, e B faz uma chamada de retorno para A no método chamado.
No Uniswap, quando o método swap do contrato UniswapV3Pool é chamado para realizar uma negociação, ele chamará o swapCallback, passando a quantidade real de tokens necessária calculada. A parte que chama deve transferir os tokens necessários para o UniswapV3Pool durante a chamada de retorno. Este design garante a segurança e a integridade lógica do método swap, eliminando a necessidade de registros de variáveis complicados.
Transmissão de informações anormais, implementação de previsão de transação com try-catch
No contrato Quoter da Uniswap, utiliza-se o try-catch para envolver a execução do método swap do UniswapV3Pool. Isso é feito para simular a troca e estimar os Tokens necessários para a transação. Como a estimativa não realiza a troca de Tokens, um erro será acionado. A Uniswap lança um erro especial na função de callback da transação, e então captura esse erro para extrair as informações necessárias.
Este método pode parecer uma manobra, mas é muito prático. Não é necessário adaptar o método swap especificamente para estimar a demanda de negociação, a lógica é mais simples.
Cálculo de Grandes Números para Resolver Problemas de Precisão
O código do Uniswap envolve uma grande quantidade de lógica de cálculo, como calcular a quantidade de Token a ser trocada com base no preço atual e na liquidez. Para evitar a perda de precisão devido a operações de divisão, o processo de cálculo utiliza frequentemente a operação "<< FixedPoint96.RESOLUTION", ou seja, deslocando para a esquerda 96 bits, o que equivale a multiplicar por 2^96. Sob a premissa de que as transações normais não transbordam, ( geralmente é calculado usando uint256, esse método pode garantir efetivamente a precisão.
![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-b0c3d4eb7e8ca88cc4cfc9476a34437a.webp(
Cálculo de ganhos do mecanismo de compartilhamento
A Uniswap precisa registrar os ganhos com taxas dos provedores de liquidez LP). É evidente que não se pode registrar as taxas para cada LP individualmente a cada transação, pois isso consumiria uma quantidade enorme de Gas.
A solução da Uniswap é definir feeGrowthInside0LastX128 e feeGrowthInside1LastX128 na estrutura Position, registrando a taxa de crescimento das taxas de cada posição na última vez que as taxas foram retiradas, para cada unidade de liquidez que deveria ser recebida.
Este método requer apenas o registo da taxa total de serviço e da taxa de serviço a ser atribuída por unidade de liquidez. Quando os LPs retiram, a taxa de serviço que podem retirar pode ser calculada com base na liquidez detida. Isso é semelhante a como os acionistas calculam os rendimentos disponíveis com base nos lucros históricos por ação da empresa e nos rendimentos da última retirada.
Compromissos na obtenção de informações em blockchain
O armazenamento em cadeia é relativamente caro, e nem todas as informações precisam ser armazenadas em cadeia ou obtidas a partir da cadeia. Por exemplo, muitas das interfaces chamadas pelo site front-end da Uniswap são interfaces tradicionais da 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, sendo que alguns podem precisar ser sincronizados periodicamente da cadeia. Não é necessário chamar em tempo real a interface RPC de serviços de cadeia ou nós para obter dados relevantes.
Claro, as transações chave devem ser realizadas na cadeia. Agora, muitos fornecedores de RPC de blockchain oferecem interfaces avançadas que permitem obter certos dados de forma mais rápida e econômica.
Divisão de contratos e reutilização de contratos padrão
Um projeto pode conter vários contratos realmente implementados. Mesmo que haja apenas um contrato implementado, podemos dividir o código em vários contratos para manutenção por meio de herança.
Por exemplo, o contrato NonfungiblePositionManager da Uniswap herda vários contratos. Além disso, o contrato ERC721Permit utiliza diretamente o contrato padrão ERC721 da OpenZeppelin. Isso não só facilita a gestão de posições através de NFTs, mas também aproveita os contratos padrão existentes para aumentar a eficiência do desenvolvimento.
Conclusão
A prática traz o verdadeiro conhecimento. Participar pessoalmente do desenvolvimento de uma versão simplificada de uma exchange descentralizada permitirá que você entenda mais profundamente a implementação do código do Uniswap, ao mesmo tempo em que aprende mais sobre pontos de conhecimento em projetos reais. Se você está interessado no desenvolvimento de projetos Web3 e DeFi, pode considerar cursos práticos relacionados, completando passo a passo uma exchange simplificada. Acreditamos que isso será muito benéfico para o seu aprendizado.