Analyse du code Uniswap V3 : 7 astuces pratiques pour le développement de contrats

Petits conseils de développement de contrats appris du code d'Uniswap

Récemment, en rédigeant un tutoriel sur le développement d'un échange décentralisé, j'ai consulté l'implémentation du code de Uniswap V3 et j'ai appris de nombreux points précieux. En tant que développeur qui n'avait auparavant développé que des contrats NFT simples, cette tentative de développement de contrats Defi m'a apporté de nouvelles connaissances. Je suis convaincu que ces petites astuces seront très utiles pour les débutants qui souhaitent apprendre le développement de contrats.

Voyons maintenant ces astuces de développement pratiques, dont certaines peuvent même être qualifiées de techniques ingénieuses.

Web3 Nouveaux venus : Les petites astuces de développement de contrats que j'ai apprises à partir du code Uniswap

Adresse de déploiement de contrat prévisible

Lors du déploiement d'un contrat, l'adresse obtenue semble aléatoire, car elle est liée au nonce, rendant ainsi l'adresse du contrat difficile à prédire. Cependant, dans certains cas, nous devons inférer l'adresse du contrat à partir des échanges et des informations connexes, par exemple pour déterminer les autorisations de transaction ou obtenir l'adresse d'un pool.

Uniswap crée des contrats en utilisant la méthode CREATE2 avec l'ajout du paramètre salt, ce qui rend l'adresse du contrat créée prévisible. La logique de génération de l'adresse est la suivante : nouvelle adresse = hash("0xFF", adresse du créateur, salt, initcode).

Web3 Série pour débutants : les petites astuces de développement de contrats que j'ai apprises du code d'Uniswap

Utiliser judicieusement les fonctions de rappel

Dans Solidity, les contrats peuvent s'appeler mutuellement. Dans certains scénarios, il est utile que A appelle la méthode de B, et que B rappelle A dans la méthode appelée.

Dans Uniswap, lors de l'appel de la méthode swap du contrat UniswapV3Pool pour effectuer une transaction, celle-ci va rappeler swapCallback, qui transmettra le Token réellement requis pour cette transaction. L'appelant doit transférer le Token requis pour la transaction dans UniswapV3Pool lors du rappel, plutôt que de diviser la méthode swap en deux parties à faire appeler par l'appelant. Cela garantit la sécurité de la méthode swap, en s'assurant que toute la logique est exécutée intégralement, sans avoir besoin de tenir des enregistrements de variables compliqués pour garantir la sécurité.

Utiliser les exceptions pour transmettre des informations, implémenter l'estimation des transactions avec try catch

Dans certains contrats d'Uniswap, la méthode swap du UniswapV3Pool est exécutée en étant enveloppée dans un try catch. Cela sert à simuler la méthode swap pour estimer les tokens nécessaires pour la transaction. Étant donné qu'aucun échange de tokens réel n'a lieu pendant l'estimation, une erreur se produit. Uniswap lance une erreur spéciale dans la fonction de rappel de la transaction, puis capture cette erreur pour extraire les informations nécessaires à partir du message d'erreur.

Cette méthode semble un peu astucieuse, mais elle est très pratique. Il n'est pas nécessaire de modifier la méthode swap pour estimer la demande de transaction, et la logique est également plus simple.

Web3 Nouvel utilisateur série : Les astuces de développement de contrats que j'ai apprises du code Uniswap

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

Dans le code d'Uniswap, il y a une grande quantité de logique de calcul, comme le calcul des tokens échangés en fonction du prix actuel et de la liquidité. Pour éviter la perte de précision causée par les opérations de division, l'opération << FixedPoint96.RESOLUTION est souvent utilisée dans le processus de calcul, c'est-à-dire un décalage à gauche de 96 bits, ce qui équivaut à multiplier par 2^96. Après le décalage à gauche, la division est effectuée, garantissant la précision tant que les transactions normales ne débordent pas.

Bien qu'il y ait théoriquement toujours une perte de précision, il s'agit généralement d'une perte au niveau des plus petites unités, ce qui est acceptable.

Calculer les gains avec le mode Share

Il est nécessaire d'enregistrer les revenus de frais pour les LP (fournisseurs de liquidité) dans Uniswap. Évidemment, il n'est pas possible d'enregistrer les frais de chaque LP à chaque transaction, car cela consommerait une quantité importante de Gas.

La solution d'Uniswap consiste à définir feeGrowthInside0LastX128 et feeGrowthInside1LastX128 dans la structure Position, enregistrant les frais dus à chaque liquidité lors de la dernière extraction de frais pour chaque position.

En résumé, il suffit d'enregistrer les frais de transaction totaux et les frais de transaction à attribuer à chaque liquidité. Lorsque les LP retirent des frais, les frais récupérables sont calculés en fonction de la liquidité détenue. Cela ressemble à la détention d'actions d'une entreprise, où pour retirer les bénéfices des actions, il suffit de connaître le bénéfice par action historique de l'entreprise et le bénéfice lors du dernier retrait.

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

Toutes les informations ne doivent pas être obtenues sur la chaîne.

Le stockage sur la chaîne est relativement coûteux, et toutes les informations ne nécessitent pas d'être sur la chaîne ou d'être récupérées depuis la chaîne. Par exemple, de nombreuses interfaces appelées par le site Web front-end d'Uniswap sont des interfaces Web2 traditionnelles.

La liste des pools de trading, les informations sur les pools de trading, etc. peuvent être stockées dans une base de données ordinaire, certaines pouvant nécessiter une synchronisation périodique depuis la chaîne, mais il n'est pas nécessaire d'appeler en temps réel les interfaces RPC fournies par la chaîne ou les services de nœuds pour obtenir les données pertinentes.

Bien sûr, les transactions clés doivent être effectuées sur la chaîne.

Apprenez à diviser les contrats, en utilisant les contrats standard existants

Un projet peut contenir plusieurs contrats déployés en réalité. Même si un seul contrat est effectivement déployé, nous pouvons le diviser en plusieurs contrats en utilisant l'héritage pour le maintenir.

Par exemple, certains contrats dans Uniswap héritent de plusieurs contrats. Lors de la mise en œuvre, le contrat @openzeppelin/contracts/token/ERC721/ERC721.sol a été utilisé directement, ce qui facilite la gestion des positions par le biais de NFT et permet d'utiliser des contrats standard existants pour améliorer l'efficacité du développement.

Résumé

Développer soi-même permet de mieux comprendre que de lire des articles. Essayer de réaliser un échange décentralisé simplifié vous permettra de mieux comprendre l'implémentation du code de Uniswap et d'apprendre davantage de points de connaissance dans des projets réels.

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

Voir l'original
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
  • Récompense
  • 4
  • Partager
Commentaire
0/400
BearMarketGardenervip
· Il y a 17h
Petit novice, commence par la fabrication d'élixirs.
Voir l'originalRépondre0
MissedAirdropAgainvip
· Il y a 17h
On recommence à faire des rouleaux ? Ce n'est pas suffisant d'avoir juste terminé le rouleau NFT.
Voir l'originalRépondre0
Web3Educatorvip
· Il y a 17h
ok étudiants, laissez-moi expliquer cela rapidement...
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)