Uniswap : 7 astuces de développement de contrat : de l'adresse prévisible à l'équilibre on-chain off-chain

robot
Création du résumé en cours

Astuces pour le développement de contrats : leçons tirées du code d'Uniswap

Récemment, en rédigeant un tutoriel sur une bourse décentralisée, j'ai consulté la mise en œuvre d'Uniswap V3 et appris beaucoup de points intéressants. En tant que novice dans le développement de contrats Defi, ces techniques m'ont beaucoup inspiré et je suis convaincu qu'elles seront également utiles pour d'autres amis qui souhaitent apprendre le développement de contrats intelligents.

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

Adresse de contrat prévisible

Les adresses des contrats déployés semblent généralement aléatoires, car elles sont liées au nonce. Cependant, dans certaines situations, nous devons déduire l'adresse du contrat à partir des informations sur la paire de transactions, par exemple pour déterminer les autorisations de transaction ou obtenir l'adresse de la piscine.

Uniswap crée des contrats en utilisant CREATE2 et a ajouté un paramètre salt. L'adresse du contrat générée de cette manière est prévisible, suivant la logique "nouvelle adresse = hash('0xFF', adresse du créateur, salt, initcode)".

Utilisation astucieuse des fonctions de rappel

Dans Solidity, les contrats peuvent s'appeler mutuellement. Parfois, le contrat A appelle une méthode du contrat B, puis B rappelle la méthode de A, ce qui est utile dans certaines situations.

Par exemple, dans le processus de transaction d'Uniswap, lorsque la méthode swap du contrat UniswapV3Pool est appelée, elle rappelle swapCallback, en transmettant le nombre de Token réellement requis. L'appelant doit transférer le Token requis dans le rappel, ce qui garantit l'intégrité et la sécurité de l'ensemble de la logique de transaction.

Web3 Débutant Série : Les petits trucs de développement de contrats que j'ai appris du code Uniswap

Utiliser les exceptions pour transmettre des informations, implémenter une estimation de transaction avec try catch

Dans le contrat Quoter d'Uniswap, la méthode swap de UniswapV3Pool est exécutée à l'intérieur d'un try catch. Cela est fait pour simuler l'estimation des tokens nécessaires pour une transaction, mais aucune échange de tokens n'est effectué lors de l'estimation, ce qui entraîne une erreur.

Uniswap lève des erreurs spéciales dans la fonction de rappel de transaction, puis capture cette erreur et analyse les informations. Cette méthode peut sembler astucieuse, mais elle est très pratique, évitant ainsi de devoir modifier spécifiquement la méthode de swap pour estimer la demande.

Problèmes de précision dans le traitement des grands nombres

Le code Uniswap implique de nombreux calculs, tels que le calcul du nombre de tokens échangés en fonction du prix actuel et de la liquidité. Pour éviter la perte de précision lors des opérations de division, le processus de calcul utilise souvent l'opération "<< FixedPoint96.RESOLUTION", ce qui équivaut à multiplier par 2^96.

Cette méthode garantit que les transactions normales ne débordent pas (généralement calculé avec uint256), tout en assurant la précision. Bien qu'il puisse théoriquement y avoir une perte de précision au niveau de l'unité minimale, cela reste acceptable.

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

Calcul des gains par la méthode Share

Uniswap doit enregistrer les revenus de frais des fournisseurs de liquidité (LP). Pour éviter d'enregistrer les frais pour chaque LP à chaque transaction (ce qui consomme beaucoup de Gas), Uniswap a utilisé une méthode ingénieuse.

Dans la structure Position, feeGrowthInside0LastX128 et feeGrowthInside1LastX128 sont définis pour enregistrer les frais de transaction dus par unité de liquidité lors du dernier retrait de frais pour chaque position. Cela permet simplement d'enregistrer le total des frais et la répartition par unité de liquidité, et lors du retrait par le LP, les frais pouvant être retirés sont calculés en fonction de la liquidité détenue.

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

L'équilibre entre l'obtention d'informations on-chain et off-chain

Le stockage sur la chaîne est relativement coûteux, et toutes les informations n'ont pas besoin d'être sur la chaîne ou obtenues à partir de la chaîne. Par exemple, de nombreuses interfaces appelées par le 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 classique, et synchronisées régulièrement à partir de la blockchain. Il n'est pas nécessaire d'appeler en temps réel l'interface RPC des services de la blockchain ou des nœuds pour obtenir des données pertinentes.

Certains fournisseurs de RPC blockchain offrent des interfaces avancées pour obtenir des données plus rapidement et à moindre coût. Ces interfaces améliorent souvent les performances et l'efficacité grâce au cache.

Fractionnement des contrats et utilisation des contrats standard

Un projet peut contenir plusieurs contrats déployés en réalité. Même si un seul contrat est déployé, le code peut être maintenu en étant divisé en plusieurs contrats par héritage.

Par exemple, le contrat NonfungiblePositionManager d'Uniswap hérite de plusieurs contrats. Le contrat ERC721Permit utilise directement le contrat standard ERC721 d'OpenZeppelin, ce qui facilite la gestion des positions sous forme de NFT et améliore l'efficacité du développement.

Conclusion

La pratique est la meilleure méthode d'apprentissage. En essayant de réaliser une version simplifiée d'un échange décentralisé, on peut mieux comprendre l'implémentation du code d'Uniswap et apprendre davantage de points de connaissance pratiques sur des projets réels. J'espère que ces expériences pourront aider ceux qui aspirent à développer des projets Web3 et Defi.

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

UNI3.26%
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
StableNomadvip
· Il y a 20h
statistiquement parlant, uniswap a toujours la base de code la plus propre... juste dire
Voir l'originalRépondre0
StablecoinAnxietyvip
· Il y a 21h
L'adresse peut prédire cela, c'est trop crucial !
Voir l'originalRépondre0
PumpStrategistvip
· Il y a 21h
Zut, le DEX joue aussi avec des astuces d'Oracle Machine, la jouabilité pour les gros capitaux augmente encore.
Voir l'originalRépondre0
ZkProofPuddingvip
· Il y a 21h
Le contrat du pro est vraiment compris.
Voir l'originalRépondre0
ILCollectorvip
· Il y a 21h
Ne copie pas Uni, c'est le champion des Rug Pull.
Voir l'originalRépondre0
FudVaccinatorvip
· Il y a 21h
informations précieuses ont été fiables
Voir l'originalRépondre0
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)