Recentemente, ao desenvolver uma exchange descentralizada, consultei a implementação de código de uma DEX famosa e aprendi várias técnicas úteis de desenvolvimento de contratos. Como um novato que acaba de entrar no desenvolvimento de contratos DeFi, essas técnicas me inspiraram muito e acredito que também ajudarão outros amigos que desejam aprender o desenvolvimento de contratos.
Endereço de contrato previsível
Normalmente, os endereços obtidos ao implantar um contrato parecem aleatórios e são difíceis de prever. Mas em certos cenários, precisamos inferir o endereço do contrato através de informações equivalentes de transação, como avaliar permissões de transação ou obter o endereço de um pool.
Isto pode ser realizado utilizando o método CREATE2 para criar contratos. A abordagem específica é adicionar o parâmetro salt ao criar o contrato:
solidez
pool = address(new UniswapV3Pool{salt: keccak256(abi.encode(token0, token1, fee))}());
O endereço do contrato criado dessa forma é previsível, e a lógica de geração é:
Novo endereço = hash("0xFF", endereço do criador, salt, initcode)
Utilizando funções de callback
Em certos cenários, a chamada mútua entre contratos é muito útil. Por exemplo, A chama o método de B, e B, no método chamado, faz um callback para A.
Tomando a negociação como exemplo, ao chamar o método swap do contrato de pool, ele retornará a função swapCallback, passando a quantidade real de Token necessária calculada. O chamador deve transferir o Token para o contrato de pool na callback, o que garante a execução completa e a segurança do método swap, sem a necessidade de registros complicados de variáveis.
Transmitir informações por exceção
Na estimativa de negociação, precisamos simular o método swap, mas não trocar realmente os Tokens. Podemos lançar um erro especial na função de callback da negociação e, em seguida, capturar esse erro e extrair as informações necessárias.
Este método pode parecer uma saída fácil, mas é muito prático. Não é necessário modificar especificamente o método de swap para estimar transações, a lógica é mais simples.
A Grande Números Resolvem Problemas de Precisão
Ao lidar com cálculos de preços e liquidez, para evitar a perda de precisão nas operações de divisão, pode-se usar a operação de deslocamento à esquerda ( que é equivalente a multiplicar por 2^96).
Desta forma, é possível garantir a precisão sem exceder na negociação normal. Embora ainda haja uma pequena perda de precisão em teoria, já é aceitável.
Cálculo de lucros através de compartilhamento
Para evitar que todas as LP registrem taxas de transação a cada vez, pode-se usar o método Share.
Basta registar a taxa total de transação e a taxa que deve ser atribuída a cada liquidez. Quando o LP retira, a taxa que pode ser retirada é calculada com base na liquidez detida, semelhante aos dividendos de ações.
Uso razoável de dados off-chain
Nem todas as informações precisam ser armazenadas na blockchain ou obtidas dela. Informações como listas de pools de transações, informações básicas, etc., podem ser armazenadas em bancos de dados comuns e sincronizadas periodicamente.
Algumas interfaces RPC avançadas também oferecem métodos de obtenção de dados otimizados para cache, o que pode melhorar o desempenho e a eficiência.
Divisão e Reutilização de Contratos
Grandes projetos podem ser divididos em vários contratos que são implementados na prática, ou podem ser divididos em vários contratos de manutenção através da herança.
Ao mesmo tempo, é possível reutilizar contratos padrão existentes como o ERC721, aumentando a eficiência do desenvolvimento. Por exemplo:
solidez
contrato NonfungiblePositionManager é
INonfungiblePositionManager,
EstadoImutávelPeriférico,
PoolInitializer,
Gestão de Liquidez,
Validação de Periferia,
Multicall,
ERC721Permit,
PeripheryPayments,
NFTDescriptor
{
// ...
}
Estudar a implementação de código de projetos excelentes e tentar desenvolver por conta própria pode proporcionar uma compreensão mais profunda das exchanges descentralizadas. Espero que estas pequenas dicas sejam úteis para o seu desenvolvimento de contratos!
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
5
Repostar
Compartilhar
Comentário
0/400
LayerZeroEnjoyer
· 08-01 16:48
BTC já acabou e ainda estão pesquisando sobre defi.
7 dicas práticas de desenvolvimento de contratos para ajudar projetos DEX
Dicas de Desenvolvimento de Contratos
Recentemente, ao desenvolver uma exchange descentralizada, consultei a implementação de código de uma DEX famosa e aprendi várias técnicas úteis de desenvolvimento de contratos. Como um novato que acaba de entrar no desenvolvimento de contratos DeFi, essas técnicas me inspiraram muito e acredito que também ajudarão outros amigos que desejam aprender o desenvolvimento de contratos.
Endereço de contrato previsível
Normalmente, os endereços obtidos ao implantar um contrato parecem aleatórios e são difíceis de prever. Mas em certos cenários, precisamos inferir o endereço do contrato através de informações equivalentes de transação, como avaliar permissões de transação ou obter o endereço de um pool.
Isto pode ser realizado utilizando o método CREATE2 para criar contratos. A abordagem específica é adicionar o parâmetro salt ao criar o contrato:
solidez pool = address(new UniswapV3Pool{salt: keccak256(abi.encode(token0, token1, fee))}());
O endereço do contrato criado dessa forma é previsível, e a lógica de geração é:
Novo endereço = hash("0xFF", endereço do criador, salt, initcode)
Utilizando funções de callback
Em certos cenários, a chamada mútua entre contratos é muito útil. Por exemplo, A chama o método de B, e B, no método chamado, faz um callback para A.
Tomando a negociação como exemplo, ao chamar o método swap do contrato de pool, ele retornará a função swapCallback, passando a quantidade real de Token necessária calculada. O chamador deve transferir o Token para o contrato de pool na callback, o que garante a execução completa e a segurança do método swap, sem a necessidade de registros complicados de variáveis.
Transmitir informações por exceção
Na estimativa de negociação, precisamos simular o método swap, mas não trocar realmente os Tokens. Podemos lançar um erro especial na função de callback da negociação e, em seguida, capturar esse erro e extrair as informações necessárias.
Este método pode parecer uma saída fácil, mas é muito prático. Não é necessário modificar especificamente o método de swap para estimar transações, a lógica é mais simples.
A Grande Números Resolvem Problemas de Precisão
Ao lidar com cálculos de preços e liquidez, para evitar a perda de precisão nas operações de divisão, pode-se usar a operação de deslocamento à esquerda ( que é equivalente a multiplicar por 2^96).
Por exemplo:
solidez numerator1 = FullMath.mulDiv(liquidity << FixedPoint96.RESOLUTION, sqrtRatioBX96 - sqrtRatioAX96, sqrtRatioBX96);
Desta forma, é possível garantir a precisão sem exceder na negociação normal. Embora ainda haja uma pequena perda de precisão em teoria, já é aceitável.
Cálculo de lucros através de compartilhamento
Para evitar que todas as LP registrem taxas de transação a cada vez, pode-se usar o método Share.
Basta registar a taxa total de transação e a taxa que deve ser atribuída a cada liquidez. Quando o LP retira, a taxa que pode ser retirada é calculada com base na liquidez detida, semelhante aos dividendos de ações.
Uso razoável de dados off-chain
Nem todas as informações precisam ser armazenadas na blockchain ou obtidas dela. Informações como listas de pools de transações, informações básicas, etc., podem ser armazenadas em bancos de dados comuns e sincronizadas periodicamente.
Algumas interfaces RPC avançadas também oferecem métodos de obtenção de dados otimizados para cache, o que pode melhorar o desempenho e a eficiência.
Divisão e Reutilização de Contratos
Grandes projetos podem ser divididos em vários contratos que são implementados na prática, ou podem ser divididos em vários contratos de manutenção através da herança.
Ao mesmo tempo, é possível reutilizar contratos padrão existentes como o ERC721, aumentando a eficiência do desenvolvimento. Por exemplo:
solidez contrato NonfungiblePositionManager é INonfungiblePositionManager, EstadoImutávelPeriférico, PoolInitializer, Gestão de Liquidez, Validação de Periferia, Multicall, ERC721Permit, PeripheryPayments, NFTDescriptor { // ... }
Estudar a implementação de código de projetos excelentes e tentar desenvolver por conta própria pode proporcionar uma compreensão mais profunda das exchanges descentralizadas. Espero que estas pequenas dicas sejam úteis para o seu desenvolvimento de contratos!