7 conseils pratiques pour développer des contrats DEX mainstream

Partage de petites astuces pour le développement de contrats : les leçons tirées d'Uniswap

Récemment, en développant un projet d'échange décentralisé, j'ai consulté l'implémentation de code d'un DEX connu et j'ai appris beaucoup de points utiles. En tant que débutant qui vient juste de se familiariser avec le développement de contrats Defi, ces techniques m'ont beaucoup inspiré, et je suis sûr qu'elles seront également utiles à d'autres amis qui souhaitent apprendre le développement de contrats intelligents.

Série pour débutants Web3 : astuces de développement de contrats que j'ai apprises dans le code d'Uniswap

Adresse de contrat prévisible

Les adresses de contrat déployées semblent généralement aléatoires, car elles sont liées au nonce. Cependant, dans certains cas, nous devons inférer l'adresse du contrat à partir des informations de la transaction, comme déterminer les droits de transaction ou obtenir l'adresse de la piscine de liquidités.

Cela peut être réalisé en créant un contrat en utilisant la méthode CREATE2. La méthode consiste à ajouter un paramètre salt lors de la création du contrat :

solidité pool = address(new UniswapV3Pool{salt: keccak256(abi.encode(token0, token1, fee))}());

L'adresse du contrat générée de cette manière est prévisible, suivant la logique suivante :

Nouvelle adresse = hash("0xFF", adresse du créateur, sel, initcode)

Web3 Débutant Série : Les astuces de développement de contrats que j'ai apprises du code Uniswap

Utilisation raisonnable des fonctions de rappel

Dans certains scénarios, l'appel mutuel entre les contrats est très utile. Par exemple, la méthode A appelle B, et B rappelle A dans la méthode appelée.

Dans un certain DEX, lors de l'appel de la méthode swap pour effectuer une transaction, celle-ci appellera swapCallback, en passant le Token réellement nécessaire pour cette transaction. L'appelant doit transférer le Token requis dans la piscine de transaction lors de l'appel de retour, plutôt que de diviser la méthode swap. Cela garantit l'exécution complète de la méthode swap, sans nécessiter d'enregistrements de variables compliqués pour assurer la sécurité.

Utiliser les exceptions pour transmettre des informations

Lors de l'estimation des échanges, nous devons simuler la méthode swap, mais nous ne procéderons pas à un échange réel de Token, donc une erreur se produira. Un certain DEX réalise cette estimation en lançant une erreur spéciale dans la fonction de rappel de transaction, puis en capturant cette erreur et en extrayant les informations nécessaires.

Cette méthode semble être une astuce, mais elle est très pratique. Il n'est pas nécessaire de modifier la méthode de swap pour estimer la demande, la logique est plus simple.

Web3 Débutant Série : Les petites astuces de développement de contrat que j'ai apprises du code Uniswap

Utiliser les grands nombres pour résoudre les problèmes de précision

Dans le code impliquant des calculs, il faut éviter de perdre de la précision lors des opérations de division. Un certain DEX utilise souvent l'opération "<< FixedPoint96.RESOLUTION", ce qui équivaut à multiplier par 2^96. En décalant à gauche puis en effectuant une division, on peut garantir la précision sans débordement.

solidité uint256 numerator1 = uint256(liquidity) << FixedPoint96.RESOLUTION; uint256 numerator2 = sqrtRatioBX96 - sqrtRatioAX96; amount0 = numerator1 * numerator2 / (sqrtRatioBX96 * sqrtRatioAX96);

Bien qu'il puisse théoriquement y avoir une perte de précision, il ne s'agit généralement que d'une perte au niveau des unités minimales, ce qui est acceptable.

Calcul des gains par méthode de partage

Pour le calcul des revenus des frais pour les fournisseurs de liquidité (LP), il n'est pas possible d'enregistrer chaque transaction, car cela consommerait beaucoup de Gas. Un certain DEX adopte une méthode qui consiste à enregistrer les frais totaux et à répartir les frais à chaque liquidité.

Lors de l'extraction des frais de LP, le montant pouvant être retiré est calculé en fonction de la liquidité détenue. C'est similaire à la détention d'actions d'une entreprise, lors du retrait des bénéfices, il suffit de connaître les bénéfices historiques par action et les bénéfices lors du dernier retrait.

Web3 Débutant Série : Les petites astuces de développement de contrats que j'ai apprises du code Uniswap

Choisir raisonnablement le moyen d'obtenir des informations

Le stockage sur la chaîne est relativement coûteux, toutes les informations ne doivent pas être mises sur la chaîne ou récupérées depuis la chaîne. Par exemple, la liste des pools de transactions et d'autres informations peuvent être stockées dans une base de données classique et synchronisées régulièrement depuis la chaîne.

Certains fournisseurs de RPC blockchain offrent des interfaces avancées, permettant d'obtenir des données plus rapidement. Cependant, les transactions clés doivent toujours être effectuées sur la chaîne.

Fractionnement de contrat et réutilisation de contrats standard

Un projet peut contenir plusieurs contrats, même si un seul contrat est effectivement déployé, il peut être divisé et maintenu en plusieurs contrats par héritage.

Le contrat de gestion de position NFT d'un DEX hérite de plusieurs contrats :

solidité le contrat NonfungiblePositionManager est INonfungiblePositionManager, Multicall, PeripheryImmutableState, PoolInitializer, GestionDeLiquidité, PeripheryValidation, SelfPermit, ERC721Permit {...}

En même temps, il utilise également le contrat standard ERC721 d'OpenZeppelin, ce qui facilite la gestion des positions et améliore l'efficacité du développement.

Résumé

Développer vous-même une version simplifiée d'une bourse décentralisée vous permettra de mieux comprendre la mise en œuvre du code de projets matures et d'apprendre davantage de points de connaissance pratiques. J'espère que ces petites astuces vous inspireront, je vous souhaite un bon développement!

Web3 Débutant Série : Les astuces de développement de contrats que j'ai apprises à partir du code Uniswap

UNI3.06%
Voir l'original
Cette page peut inclure du contenu de tiers fourni à des fins d'information uniquement. Gate ne garantit ni l'exactitude ni la validité de ces contenus, n’endosse pas les opinions exprimées, et ne fournit aucun conseil financier ou professionnel à travers ces informations. Voir la section Avertissement pour plus de détails.
  • Récompense
  • 6
  • Partager
Commentaire
0/400
NFTArchaeologisvip
· Il y a 4h
L'apprentissage par cœur est aussi une forme d'apprentissage.
Voir l'originalRépondre0
OnlyOnMainnetvip
· 08-05 15:56
N'oubliez pas la pratique sur le Testnet.
Voir l'originalRépondre0
TokenGuruvip
· 08-05 15:55
Le code source est expliqué en détail.
Voir l'originalRépondre0
BlockchainTherapistvip
· 08-05 15:49
Les techniques sont assez bonnes et pratiques.
Voir l'originalRépondre0
TaxEvadervip
· 08-05 15:40
CREATE2 est vraiment génial, buddy
Voir l'originalRépondre0
SchroedingerGasvip
· 08-05 15:32
Aujourd'hui, le gas est très bon marché.
Voir l'originalRépondre0
  • Épingler
Trader les cryptos partout et à tout moment
qrCode
Scan pour télécharger Gate app
Communauté
Français (Afrique)
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)