Astuces de développement de contrats : expériences apprises du code d'Uniswap
Récemment, en participant à un projet de tutoriel sur le développement d'un échange décentralisé, j'ai consulté l'implémentation du code d'un DEX connu et j'ai appris de nombreux points intéressants. En tant que débutant qui n'avait auparavant développé que des contrats NFT simples, cette tentative de développer un contrat DeFi m'a été très bénéfique. Ci-dessous, je vais partager quelques astuces pratiques qui, je suis sûr, seront très utiles pour les débutants souhaitant apprendre le développement de contrats.
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 certains cas, nous devons déduire l'adresse du contrat à partir des informations sur les transactions, par exemple pour déterminer les droits de transaction ou obtenir l'adresse du pool.
Une méthode de mise en œuvre consiste à utiliser CREATE2 pour créer un contrat. En ajoutant un paramètre salt, l'adresse du contrat généré devient prévisible. La logique de génération de la nouvelle adresse est : hash("0xFF", adresse du créateur, salt, initcode).
Utiliser habilement les fonctions de rappel
Dans Solidity, les contrats peuvent s'appeler mutuellement. Un scénario courant est que A appelle la méthode de B, et B rappelle A dans la méthode appelée. Cela peut être très utile dans certaines situations.
Par exemple, dans un certain DEX, lorsque vous appelez la méthode swap du contrat de pool pour effectuer une transaction, elle rappellera swapCallback, en passant le montant de jetons réellement nécessaire pour cette transaction. L'appelant doit transférer les jetons requis dans le contrat de pool lors du rappel, plutôt que de diviser la méthode swap. Cela garantit la sécurité de la méthode swap et l'exécution complète, sans avoir besoin d'enregistrements de variables compliqués.
Utiliser des exceptions pour transmettre des informations, réaliser une estimation de transaction avec try-catch
Dans certaines situations, nous devons simuler la méthode swap pour estimer la quantité de jetons requise pour la transaction, mais lors de l'estimation, nous ne procéderons pas réellement à l'échange des jetons, ce qui entraînera une erreur. Une manière astucieuse de traiter cela est de lancer une erreur spéciale dans la fonction de rappel de la transaction, puis de capturer cette erreur et d'extraire les informations nécessaires à partir du message d'erreur.
Cette méthode semble quelque peu astucieuse, mais elle est très pratique. Elle évite de modifier la méthode swap pour estimer la demande de transactions, rendant la logique plus simple.
Résoudre les problèmes de précision avec de grands nombres
Dans les scénarios impliquant le calcul des prix et de la liquidité, nous devons éviter la perte de précision causée par les opérations de division. Une technique courante consiste à décaler à gauche de 96 bits (équivalent à multiplier par 2^96), puis à effectuer l'opération de division. Cela permet de garantir la précision sans débordement lors des transactions normales.
Bien qu'il y ait théoriquement une légère perte de précision, il s'agit généralement d'une perte de la plus petite unité, ce qui est acceptable.
Calcul des bénéfices par Share
Pour les scénarios nécessitant l'enregistrement des revenus de frais de transaction des fournisseurs de liquidité (LP), nous ne pouvons pas enregistrer les frais pour chaque LP à chaque transaction, car cela consommerait beaucoup de gas. Une méthode efficace consiste à enregistrer les frais totaux et les frais à attribuer par unité de liquidité.
Lors de l'extraction des frais de LP, il suffit de calculer les frais pouvant être extraits en fonction de la liquidité détenue. Cela ressemble à la façon dont les actionnaires calculent les bénéfices pouvant être extraits actuellement en fonction des bénéfices historiques par action de l'entreprise et des bénéfices lors de la dernière extraction.
Utilisation raisonnable des données hors chaîne
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 d'être récupérées depuis la chaîne. Par exemple, la liste des pools de transactions, les informations sur les pools, etc. peuvent être stockées dans une base de données traditionnelle et synchronisées régulièrement depuis la chaîne.
De nombreux fournisseurs de RPC blockchain proposent également des interfaces avancées qui permettent d'accéder plus rapidement et économiquement à certaines données. Ces interfaces utilisent généralement le caching pour améliorer les performances et l'efficacité.
Apprendre à diviser les contrats et à utiliser les contrats standards
Un projet peut contenir plusieurs contrats déployés en réalité. Même si un seul contrat est déployé, nous pouvons maintenir le code en le divisant en plusieurs contrats par le biais de l'héritage.
De plus, l'utilisation de contrats standards existants (comme l'ERC721) peut améliorer l'efficacité du développement. Par exemple, un contrat ERC721 peut être utilisé pour gérer des positions de liquidité, ce qui est à la fois pratique et permet d'améliorer l'efficacité du développement.
Résumé
La pratique est la meilleure méthode d'apprentissage. Essayer de réaliser une version simplifiée d'une bourse décentralisée peut vous aider à comprendre plus en profondeur la mise en œuvre du code DEX et à acquérir davantage de connaissances pratiques sur les projets. Que vous soyez intéressé par le développement de projets Web3 ou DeFi, vous impliquer personnellement sera une expérience d'apprentissage précieuse.
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.
16 J'aime
Récompense
16
5
Reposter
Partager
Commentaire
0/400
StablecoinEnjoyer
· 08-09 08:07
Pas étonnant que DEX soit compréhensible, create2 est vraiment génial~
Voir l'originalRépondre0
OnchainArchaeologist
· 08-09 07:19
Adresse prédiction ce domaine doit encore compter sur create2
Voir l'originalRépondre0
Layer2Observer
· 08-09 07:17
Techniquement, CREATE2 est effectivement élégant, mais il présente des risques de sécurité.
Voir l'originalRépondre0
WenMoon42
· 08-09 07:08
Il y a beaucoup de subtilités dans Create2.
Voir l'originalRépondre0
DegenMcsleepless
· 08-09 06:58
Héhé, ça fait déjà deux ans que je veille sur le BTC~
7 grandes astuces de développement de contrats : apprendre des pratiques DeFi à partir du code DEX
Astuces de développement de contrats : expériences apprises du code d'Uniswap
Récemment, en participant à un projet de tutoriel sur le développement d'un échange décentralisé, j'ai consulté l'implémentation du code d'un DEX connu et j'ai appris de nombreux points intéressants. En tant que débutant qui n'avait auparavant développé que des contrats NFT simples, cette tentative de développer un contrat DeFi m'a été très bénéfique. Ci-dessous, je vais partager quelques astuces pratiques qui, je suis sûr, seront très utiles pour les débutants souhaitant apprendre le développement de contrats.
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 certains cas, nous devons déduire l'adresse du contrat à partir des informations sur les transactions, par exemple pour déterminer les droits de transaction ou obtenir l'adresse du pool.
Une méthode de mise en œuvre consiste à utiliser CREATE2 pour créer un contrat. En ajoutant un paramètre salt, l'adresse du contrat généré devient prévisible. La logique de génération de la nouvelle adresse est : hash("0xFF", adresse du créateur, salt, initcode).
Utiliser habilement les fonctions de rappel
Dans Solidity, les contrats peuvent s'appeler mutuellement. Un scénario courant est que A appelle la méthode de B, et B rappelle A dans la méthode appelée. Cela peut être très utile dans certaines situations.
Par exemple, dans un certain DEX, lorsque vous appelez la méthode swap du contrat de pool pour effectuer une transaction, elle rappellera swapCallback, en passant le montant de jetons réellement nécessaire pour cette transaction. L'appelant doit transférer les jetons requis dans le contrat de pool lors du rappel, plutôt que de diviser la méthode swap. Cela garantit la sécurité de la méthode swap et l'exécution complète, sans avoir besoin d'enregistrements de variables compliqués.
Utiliser des exceptions pour transmettre des informations, réaliser une estimation de transaction avec try-catch
Dans certaines situations, nous devons simuler la méthode swap pour estimer la quantité de jetons requise pour la transaction, mais lors de l'estimation, nous ne procéderons pas réellement à l'échange des jetons, ce qui entraînera une erreur. Une manière astucieuse de traiter cela est de lancer une erreur spéciale dans la fonction de rappel de la transaction, puis de capturer cette erreur et d'extraire les informations nécessaires à partir du message d'erreur.
Cette méthode semble quelque peu astucieuse, mais elle est très pratique. Elle évite de modifier la méthode swap pour estimer la demande de transactions, rendant la logique plus simple.
Résoudre les problèmes de précision avec de grands nombres
Dans les scénarios impliquant le calcul des prix et de la liquidité, nous devons éviter la perte de précision causée par les opérations de division. Une technique courante consiste à décaler à gauche de 96 bits (équivalent à multiplier par 2^96), puis à effectuer l'opération de division. Cela permet de garantir la précision sans débordement lors des transactions normales.
Bien qu'il y ait théoriquement une légère perte de précision, il s'agit généralement d'une perte de la plus petite unité, ce qui est acceptable.
Calcul des bénéfices par Share
Pour les scénarios nécessitant l'enregistrement des revenus de frais de transaction des fournisseurs de liquidité (LP), nous ne pouvons pas enregistrer les frais pour chaque LP à chaque transaction, car cela consommerait beaucoup de gas. Une méthode efficace consiste à enregistrer les frais totaux et les frais à attribuer par unité de liquidité.
Lors de l'extraction des frais de LP, il suffit de calculer les frais pouvant être extraits en fonction de la liquidité détenue. Cela ressemble à la façon dont les actionnaires calculent les bénéfices pouvant être extraits actuellement en fonction des bénéfices historiques par action de l'entreprise et des bénéfices lors de la dernière extraction.
Utilisation raisonnable des données hors chaîne
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 d'être récupérées depuis la chaîne. Par exemple, la liste des pools de transactions, les informations sur les pools, etc. peuvent être stockées dans une base de données traditionnelle et synchronisées régulièrement depuis la chaîne.
De nombreux fournisseurs de RPC blockchain proposent également des interfaces avancées qui permettent d'accéder plus rapidement et économiquement à certaines données. Ces interfaces utilisent généralement le caching pour améliorer les performances et l'efficacité.
Apprendre à diviser les contrats et à utiliser les contrats standards
Un projet peut contenir plusieurs contrats déployés en réalité. Même si un seul contrat est déployé, nous pouvons maintenir le code en le divisant en plusieurs contrats par le biais de l'héritage.
De plus, l'utilisation de contrats standards existants (comme l'ERC721) peut améliorer l'efficacité du développement. Par exemple, un contrat ERC721 peut être utilisé pour gérer des positions de liquidité, ce qui est à la fois pratique et permet d'améliorer l'efficacité du développement.
Résumé
La pratique est la meilleure méthode d'apprentissage. Essayer de réaliser une version simplifiée d'une bourse décentralisée peut vous aider à comprendre plus en profondeur la mise en œuvre du code DEX et à acquérir davantage de connaissances pratiques sur les projets. Que vous soyez intéressé par le développement de projets Web3 ou DeFi, vous impliquer personnellement sera une expérience d'apprentissage précieuse.
Selon ta personnalité, voici mon commentaire:
Ne fais pas semblant, copie de Uni.