Partilha de Dicas para Desenvolvimento de Contratos
Recentemente, ao participar de um projeto de desenvolvimento de uma exchange descentralizada, consultei a implementação de código de um DEX conhecido e aprendi várias técnicas práticas de desenvolvimento de contratos. Como um desenvolvedor que anteriormente se dedicava principalmente ao desenvolvimento de contratos NFT, esta é a minha primeira tentativa de desenvolver contratos DeFi. Aqui estão algumas dicas que podem ser úteis para desenvolvedores novatos.
Endereço de contrato previsível
Normalmente, o endereço obtido ao implantar um contrato parece aleatório, pois está relacionado com o nonce. Mas em certos cenários, precisamos inferir o endereço do contrato a partir das informações da transação, o que é útil para determinar permissões de transação ou obter o endereço do pool.
Uma maneira é usar o CREATE2 para criar um contrato, tornando o endereço gerado previsível ao adicionar o parâmetro salt. A fórmula para calcular o novo endereço é:
Novo endereço = hash("0xFF", endereço do criador, sal, initcode)
Uso Inteligente de Funções de Retorno
Os contratos em Solidity podem chamar uns aos outros. Em certos cenários, o método A chama o método B, e B, ao ser chamado, faz um callback para A. Esse padrão é muito útil.
Por exemplo, ao negociar em um determinado DEX, o método swap do contrato pool chamará swapCallback, passando a quantidade real de tokens necessária. O chamador deve transferir os tokens na callback, em vez de dividir o swap em várias chamadas. Isso garante a integridade e a segurança do método swap.
Usar exceções para transmitir informações
No código de um determinado DEX, utiliza-se um bloco try-catch para envolver o método swap do contrato pool a fim de simular a negociação e estimar os Tokens necessários. Como não ocorre a troca real de Tokens durante a estimativa, um erro será lançado. Ao lançar um erro especial na chamada de retorno e, em seguida, capturar e analisar a informação do erro, é possível obter o resultado da estimativa.
Esta técnica evita a necessidade de adaptar o método de swap especificamente para estimar a demanda, mantendo a lógica simples.
Problema de precisão no processamento de grandes números
Ao lidar com o cálculo de preços e liquidez, para evitar a perda de precisão nas operações de divisão, pode-se primeiro deslocar à esquerda 96 bits (, o que equivale a multiplicar por 2^96), e depois realizar a operação. Assim, em condições normais de negociação, sem estouro, pode-se garantir a precisão.
Cálculo de Lucros do Modo de Compartilhamento
Ao registrar os rendimentos das taxas de LP, não é possível registrar cada LP a cada transação, pois isso consumiria uma grande quantidade de Gas. Uma solução é registrar a taxa total e a taxa que deve ser alocada a cada unidade de liquidez. Quando os LPs retiram, as taxas que podem ser retiradas são calculadas com base na liquidez mantida, semelhante a um dividendo de ações.
Combinação de dados on-chain e off-chain
Nem todas as informações precisam ser registradas na blockchain ou obtidas a partir dela. Por exemplo, listas de pools de negociação, informações sobre pools, etc., podem ser armazenadas em um banco de dados comum e sincronizadas periodicamente com a blockchain. Isso pode melhorar o desempenho e a eficiência. Claro, transações críticas ainda precisam ser realizadas na blockchain.
Divisão e Reutilização de Contratos
Grandes projetos podem incluir múltiplos contratos implementados na prática. Mesmo que apenas um contrato seja implementado, ele pode ser dividido em vários contratos através de herança para facilitar a manutenção. Ao mesmo tempo, aprender a utilizar contratos padrão existentes como o ERC721 pode aumentar a eficiência do desenvolvimento.
A prática é a melhor forma de aprender. Ao implementar uma versão simplificada de um DEX, é possível entender mais profundamente a implementação de código de certos projetos complexos e aprender mais sobre pontos de conhecimento em projetos reais. Espero que essas pequenas dicas ajudem os novatos que desejam aprender desenvolvimento de contratos.
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.
20 Curtidas
Recompensa
20
10
Repostar
Compartilhar
Comentário
0/400
DiamondHands
· 12h atrás
create2 moeda direta
Ver originalResponder0
UnluckyMiner
· 08-07 07:50
Envie mais trechos de código
Ver originalResponder0
BridgeJumper
· 08-07 04:50
Citar também é uma arte.
Ver originalResponder0
nft_widow
· 08-06 21:36
Bom texto deve ser apoiado
Ver originalResponder0
LiquidityWizard
· 08-05 23:03
Endereço previsão é muito importante.
Ver originalResponder0
ImpermanentLossFan
· 08-05 23:01
As letras são muito poucas, não dá para ver o suficiente.
Sete dicas essenciais para o desenvolvimento de contratos DEX Leitura obrigatória para novatos
Partilha de Dicas para Desenvolvimento de Contratos
Recentemente, ao participar de um projeto de desenvolvimento de uma exchange descentralizada, consultei a implementação de código de um DEX conhecido e aprendi várias técnicas práticas de desenvolvimento de contratos. Como um desenvolvedor que anteriormente se dedicava principalmente ao desenvolvimento de contratos NFT, esta é a minha primeira tentativa de desenvolver contratos DeFi. Aqui estão algumas dicas que podem ser úteis para desenvolvedores novatos.
Endereço de contrato previsível
Normalmente, o endereço obtido ao implantar um contrato parece aleatório, pois está relacionado com o nonce. Mas em certos cenários, precisamos inferir o endereço do contrato a partir das informações da transação, o que é útil para determinar permissões de transação ou obter o endereço do pool.
Uma maneira é usar o CREATE2 para criar um contrato, tornando o endereço gerado previsível ao adicionar o parâmetro salt. A fórmula para calcular o novo endereço é:
Novo endereço = hash("0xFF", endereço do criador, sal, initcode)
Uso Inteligente de Funções de Retorno
Os contratos em Solidity podem chamar uns aos outros. Em certos cenários, o método A chama o método B, e B, ao ser chamado, faz um callback para A. Esse padrão é muito útil.
Por exemplo, ao negociar em um determinado DEX, o método swap do contrato pool chamará swapCallback, passando a quantidade real de tokens necessária. O chamador deve transferir os tokens na callback, em vez de dividir o swap em várias chamadas. Isso garante a integridade e a segurança do método swap.
Usar exceções para transmitir informações
No código de um determinado DEX, utiliza-se um bloco try-catch para envolver o método swap do contrato pool a fim de simular a negociação e estimar os Tokens necessários. Como não ocorre a troca real de Tokens durante a estimativa, um erro será lançado. Ao lançar um erro especial na chamada de retorno e, em seguida, capturar e analisar a informação do erro, é possível obter o resultado da estimativa.
Esta técnica evita a necessidade de adaptar o método de swap especificamente para estimar a demanda, mantendo a lógica simples.
Problema de precisão no processamento de grandes números
Ao lidar com o cálculo de preços e liquidez, para evitar a perda de precisão nas operações de divisão, pode-se primeiro deslocar à esquerda 96 bits (, o que equivale a multiplicar por 2^96), e depois realizar a operação. Assim, em condições normais de negociação, sem estouro, pode-se garantir a precisão.
Cálculo de Lucros do Modo de Compartilhamento
Ao registrar os rendimentos das taxas de LP, não é possível registrar cada LP a cada transação, pois isso consumiria uma grande quantidade de Gas. Uma solução é registrar a taxa total e a taxa que deve ser alocada a cada unidade de liquidez. Quando os LPs retiram, as taxas que podem ser retiradas são calculadas com base na liquidez mantida, semelhante a um dividendo de ações.
Combinação de dados on-chain e off-chain
Nem todas as informações precisam ser registradas na blockchain ou obtidas a partir dela. Por exemplo, listas de pools de negociação, informações sobre pools, etc., podem ser armazenadas em um banco de dados comum e sincronizadas periodicamente com a blockchain. Isso pode melhorar o desempenho e a eficiência. Claro, transações críticas ainda precisam ser realizadas na blockchain.
Divisão e Reutilização de Contratos
Grandes projetos podem incluir múltiplos contratos implementados na prática. Mesmo que apenas um contrato seja implementado, ele pode ser dividido em vários contratos através de herança para facilitar a manutenção. Ao mesmo tempo, aprender a utilizar contratos padrão existentes como o ERC721 pode aumentar a eficiência do desenvolvimento.
A prática é a melhor forma de aprender. Ao implementar uma versão simplificada de um DEX, é possível entender mais profundamente a implementação de código de certos projetos complexos e aprender mais sobre pontos de conhecimento em projetos reais. Espero que essas pequenas dicas ajudem os novatos que desejam aprender desenvolvimento de contratos.