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.

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

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)

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

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.

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

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.

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

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!

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

UNI-2.94%
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
  • 5
  • Repostar
  • Compartilhar
Comentário
0/400
LayerZeroEnjoyervip
· 08-01 16:48
BTC já acabou e ainda estão pesquisando sobre defi.
Ver originalResponder0
degenwhisperervip
· 08-01 00:26
Cortar e copiar diretamente o código da uni.
Ver originalResponder0
GateUser-40edb63bvip
· 07-29 21:17
Este contrato inteligente é muito avançado.
Ver originalResponder0
PoetryOnChainvip
· 07-29 21:03
Na verdade, é só copiar o uni...
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)