Ce que les développeurs Web3 doivent savoir : précieuses leçons tirées des contrats Uniswap
Récemment, en rédigeant un tutoriel sur le développement d'une plateforme d'échange décentralisée, j'ai approfondi l'étude du code de mise en œuvre d'Uniswap V3 et j'ai beaucoup appris. En tant que novice dans le développement de contrats Defi, ces techniques ont sans aucun doute été une révélation pour moi. Je suis convaincu que ces expériences seront également très bénéfiques pour d'autres amis qui souhaitent se lancer dans le développement de contrats intelligents.
Astuce pour prédire l'adresse des contrats à terme
En général, l'adresse obtenue après le déploiement d'un contrat semble aléatoire et difficile à prédire. Cependant, dans Uniswap, nous pouvons déduire l'adresse du contrat à partir des paires de trading et des informations connexes. Cela est très utile dans des situations telles que le jugement des autorisations de transaction ou l'obtention de l'adresse d'un pool.
Uniswap utilise la méthode CREATE2 pour créer des contrats, en ajoutant un paramètre "salt" pour rendre l'adresse générée prévisible. La logique de génération d'adresse spécifique est : nouvelle adresse = hash("0xFF", adresse du créateur, salt, initcode).
Utilisation astucieuse des fonctions de rappel
Dans certains cas, l'appel mutuel entre contrats est très utile. Par exemple, la méthode A appelle B, et B rappelle A dans la méthode appelée.
Dans Uniswap, lorsque vous appelez la méthode swap du contrat UniswapV3Pool pour effectuer une transaction, elle rappellera swapCallback, en passant le nombre réel de tokens requis calculé. L'appelant doit transférer les tokens requis dans UniswapV3Pool lors du rappel. Ce design garantit la sécurité et l'intégrité logique de la méthode swap, sans nécessiter un enregistrement complexe des variables.
Transmission d'informations d'exception, estimation de transaction via try-catch
Dans le contrat Quoter d'Uniswap, la méthode swap de UniswapV3Pool est exécutée à l'aide d'un bloc try-catch. Cela sert à simuler un swap afin d'estimer les tokens nécessaires pour la transaction. Comme il ne s'agit pas d'un échange réel de tokens lors de l'estimation, une erreur est déclenchée. Uniswap lance une erreur spéciale dans la fonction de rappel de la transaction, puis capture cette erreur et en extrait les informations nécessaires.
Cette méthode semble astucieuse, mais elle est très pratique. Il n'est pas nécessaire de modifier spécialement la méthode swap pour estimer la demande de transaction, la logique est plus simple.
Les calculs de grands nombres résolvent le problème de précision
Le code Uniswap implique une grande quantité de logique de calcul, comme le calcul du nombre de tokens échangés en fonction du prix actuel et de la liquidité. Pour éviter la perte de précision due aux opérations de division, le processus de calcul utilise fréquemment l'opération "<< FixedPoint96.RESOLUTION", c'est-à-dire un décalage à gauche de 96 bits, équivalant à multiplier par 2^96. Sous la condition que les transactions normales ne débordent pas, ( est généralement calculé avec uint256, cette méthode permet de garantir efficacement la précision.
![Web3 Débutant Série : Petits conseils de développement de contrats que j'ai appris du code Uniswap])https://img-cdn.gateio.im/webp-social/moments-b0c3d4eb7e8ca88cc4cfc9476a34437a.webp(
Calcul des bénéfices du mécanisme de partage
Uniswap doit enregistrer les revenus de frais des fournisseurs de liquidité LP). Évidemment, il est impossible d'enregistrer séparément les frais pour chaque LP à chaque transaction, ce qui consommerait beaucoup de Gas.
La solution d'Uniswap consiste à définir feeGrowthInside0LastX128 et feeGrowthInside1LastX128 dans la structure Position, enregistrant les frais que chaque position devait recevoir par unité de liquidité lors du dernier retrait des frais.
Cette méthode nécessite seulement d'enregistrer les frais totaux et les frais qui doivent être alloués par unité de liquidité. Lors du retrait des LP, les frais pouvant être retirés peuvent être calculés en fonction de la liquidité détenue. Cela est similaire à la manière dont les actionnaires calculent les bénéfices pouvant être retirés en fonction des bénéfices par action historiques de l'entreprise et des bénéfices lors du dernier retrait.
Équilibre de l'obtention d'informations on-chain
Le stockage sur la chaîne est relativement coûteux et toutes les informations ne nécessitent pas d'être mises 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. Il n'est pas nécessaire d'appeler en temps réel l'interface RPC des services de la chaîne ou des nœuds pour obtenir des données connexes.
Bien sûr, les transactions clés doivent être effectuées sur la chaîne. De nombreux fournisseurs de RPC blockchain proposent maintenant des interfaces avancées pour obtenir certaines données plus rapidement et à moindre coût.
Fractionnement de contrat et réutilisation de contrats standards
Un projet peut contenir plusieurs contrats réellement déployés. Même s'il n'y a qu'un seul contrat déployé, nous pouvons également diviser le code en plusieurs contrats pour la maintenance grâce à l'héritage.
Par exemple, le contrat NonfungiblePositionManager d'Uniswap hérite de plusieurs contrats. De plus, le contrat ERC721Permit utilise directement le contrat standard ERC721 d'OpenZeppelin. Cela facilite non seulement la gestion des positions via des NFT, mais permet également d'améliorer l'efficacité du développement en utilisant des contrats standards existants.
Conclusion
La pratique mène à la connaissance. Participer au développement d'une version simplifiée d'un échange décentralisé vous permettra de mieux comprendre l'implémentation du code d'Uniswap, tout en apprenant davantage de points de connaissance issus de projets pratiques. Si vous êtes intéressé par le développement de projets Web3 et DeFi, n'hésitez pas à consulter des cours pratiques connexes et à réaliser étape par étape un échange simplifié. Je suis sûr que cela sera très bénéfique pour votre apprentissage.
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.
6 J'aime
Récompense
6
4
Partager
Commentaire
0/400
AirdropHunter9000
· 08-04 14:09
Defi n'est-ce pas un jeu de chute à zéro... ceux qui comprennent, comprennent.
Voir l'originalRépondre0
TokenAlchemist
· 08-04 14:09
lmao imagine ne pas savoir que CREATE2 permet des adresses déterministes... ngmi tbh
Voir l'originalRépondre0
RugpullAlertOfficer
· 08-04 14:08
C'est clairement un tutoriel pour débutants sans aucune base.
Voir l'originalRépondre0
AllTalkLongTrader
· 08-04 14:02
Ne pas regarder le code, mais l'adresse. Est-ce de la paresse ou de la hauteur ?
7 techniques pour analyser les smart contracts Uniswap : à lire absolument pour les développeurs Web3
Ce que les développeurs Web3 doivent savoir : précieuses leçons tirées des contrats Uniswap
Récemment, en rédigeant un tutoriel sur le développement d'une plateforme d'échange décentralisée, j'ai approfondi l'étude du code de mise en œuvre d'Uniswap V3 et j'ai beaucoup appris. En tant que novice dans le développement de contrats Defi, ces techniques ont sans aucun doute été une révélation pour moi. Je suis convaincu que ces expériences seront également très bénéfiques pour d'autres amis qui souhaitent se lancer dans le développement de contrats intelligents.
Astuce pour prédire l'adresse des contrats à terme
En général, l'adresse obtenue après le déploiement d'un contrat semble aléatoire et difficile à prédire. Cependant, dans Uniswap, nous pouvons déduire l'adresse du contrat à partir des paires de trading et des informations connexes. Cela est très utile dans des situations telles que le jugement des autorisations de transaction ou l'obtention de l'adresse d'un pool.
Uniswap utilise la méthode CREATE2 pour créer des contrats, en ajoutant un paramètre "salt" pour rendre l'adresse générée prévisible. La logique de génération d'adresse spécifique est : nouvelle adresse = hash("0xFF", adresse du créateur, salt, initcode).
Utilisation astucieuse des fonctions de rappel
Dans certains cas, l'appel mutuel entre contrats est très utile. Par exemple, la méthode A appelle B, et B rappelle A dans la méthode appelée.
Dans Uniswap, lorsque vous appelez la méthode swap du contrat UniswapV3Pool pour effectuer une transaction, elle rappellera swapCallback, en passant le nombre réel de tokens requis calculé. L'appelant doit transférer les tokens requis dans UniswapV3Pool lors du rappel. Ce design garantit la sécurité et l'intégrité logique de la méthode swap, sans nécessiter un enregistrement complexe des variables.
Transmission d'informations d'exception, estimation de transaction via try-catch
Dans le contrat Quoter d'Uniswap, la méthode swap de UniswapV3Pool est exécutée à l'aide d'un bloc try-catch. Cela sert à simuler un swap afin d'estimer les tokens nécessaires pour la transaction. Comme il ne s'agit pas d'un échange réel de tokens lors de l'estimation, une erreur est déclenchée. Uniswap lance une erreur spéciale dans la fonction de rappel de la transaction, puis capture cette erreur et en extrait les informations nécessaires.
Cette méthode semble astucieuse, mais elle est très pratique. Il n'est pas nécessaire de modifier spécialement la méthode swap pour estimer la demande de transaction, la logique est plus simple.
Les calculs de grands nombres résolvent le problème de précision
Le code Uniswap implique une grande quantité de logique de calcul, comme le calcul du nombre de tokens échangés en fonction du prix actuel et de la liquidité. Pour éviter la perte de précision due aux opérations de division, le processus de calcul utilise fréquemment l'opération "<< FixedPoint96.RESOLUTION", c'est-à-dire un décalage à gauche de 96 bits, équivalant à multiplier par 2^96. Sous la condition que les transactions normales ne débordent pas, ( est généralement calculé avec uint256, cette méthode permet de garantir efficacement la précision.
![Web3 Débutant Série : Petits conseils de développement de contrats que j'ai appris du code Uniswap])https://img-cdn.gateio.im/webp-social/moments-b0c3d4eb7e8ca88cc4cfc9476a34437a.webp(
Calcul des bénéfices du mécanisme de partage
Uniswap doit enregistrer les revenus de frais des fournisseurs de liquidité LP). Évidemment, il est impossible d'enregistrer séparément les frais pour chaque LP à chaque transaction, ce qui consommerait beaucoup de Gas.
La solution d'Uniswap consiste à définir feeGrowthInside0LastX128 et feeGrowthInside1LastX128 dans la structure Position, enregistrant les frais que chaque position devait recevoir par unité de liquidité lors du dernier retrait des frais.
Cette méthode nécessite seulement d'enregistrer les frais totaux et les frais qui doivent être alloués par unité de liquidité. Lors du retrait des LP, les frais pouvant être retirés peuvent être calculés en fonction de la liquidité détenue. Cela est similaire à la manière dont les actionnaires calculent les bénéfices pouvant être retirés en fonction des bénéfices par action historiques de l'entreprise et des bénéfices lors du dernier retrait.
Équilibre de l'obtention d'informations on-chain
Le stockage sur la chaîne est relativement coûteux et toutes les informations ne nécessitent pas d'être mises 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. Il n'est pas nécessaire d'appeler en temps réel l'interface RPC des services de la chaîne ou des nœuds pour obtenir des données connexes.
Bien sûr, les transactions clés doivent être effectuées sur la chaîne. De nombreux fournisseurs de RPC blockchain proposent maintenant des interfaces avancées pour obtenir certaines données plus rapidement et à moindre coût.
Fractionnement de contrat et réutilisation de contrats standards
Un projet peut contenir plusieurs contrats réellement déployés. Même s'il n'y a qu'un seul contrat déployé, nous pouvons également diviser le code en plusieurs contrats pour la maintenance grâce à l'héritage.
Par exemple, le contrat NonfungiblePositionManager d'Uniswap hérite de plusieurs contrats. De plus, le contrat ERC721Permit utilise directement le contrat standard ERC721 d'OpenZeppelin. Cela facilite non seulement la gestion des positions via des NFT, mais permet également d'améliorer l'efficacité du développement en utilisant des contrats standards existants.
Conclusion
La pratique mène à la connaissance. Participer au développement d'une version simplifiée d'un échange décentralisé vous permettra de mieux comprendre l'implémentation du code d'Uniswap, tout en apprenant davantage de points de connaissance issus de projets pratiques. Si vous êtes intéressé par le développement de projets Web3 et DeFi, n'hésitez pas à consulter des cours pratiques connexes et à réaliser étape par étape un échange simplifié. Je suis sûr que cela sera très bénéfique pour votre apprentissage.