Les astuces ingénieuses dans le développement de contrats
Récemment, en étudiant le processus de développement des échanges décentralisés, j'ai consulté le code de certains projets connus et appris beaucoup de points intéressants. En tant que développeur qui essaie pour la première fois de développer des contrats Defi, ces petites astuces sont très utiles pour les débutants qui souhaitent apprendre le développement de contrats.
Voyons ensemble ces astuces ingénieuses, certaines peuvent même être qualifiées de techniques extraordinaires.
adresse de déploiement de contrat prévisible
Les adresses obtenues lors du déploiement de contrats semblent aléatoires, car elles sont liées au nonce. Cependant, dans certaines situations, nous devons inférer l'adresse du contrat à partir des informations de transaction, comme déterminer les droits de transaction ou obtenir l'adresse de la piscine.
Une méthode consiste à utiliser CREATE2 pour créer un contrat, en ajoutant le paramètre salt : pool = address(new UniswapV3Pool{salt: keccak256(abi.encode(token0, token1, fee))}()); . L'adresse du contrat créée de cette manière est prévisible, la logique de génération est nouvelle adresse = hash("0xFF", adresse du créateur, salt, initcode).
Utilisation astucieuse des fonctions de rappel
Dans Solidity, les contrats peuvent s'appeler mutuellement. Un modèle est que A appelle la méthode de B, et B rappelle A dans la méthode appelée, ce qui est utile dans certaines situations.
Par exemple, lorsque vous effectuez un échange en appelant la méthode swap du contrat UniswapV3Pool, elle rappellera swapCallback, en transmettant le Token réellement nécessaire pour cette transaction. L'appelant doit transférer le Token requis pour la transaction dans UniswapV3Pool lors du rappel, au lieu de diviser la méthode swap en deux parties. Cela garantit la sécurité de la méthode swap et son exécution complète, sans avoir besoin de tenir des enregistrements de variables encombrants.
utiliser des exceptions pour transmettre des informations, utiliser try catch pour réaliser une estimation de transaction
Dans certains contrats, l'estimation des transactions est réalisée en lançant des erreurs spéciales dans la fonction de rappel de transaction, puis en capturant cette erreur et en analysant les informations nécessaires à partir du message d'erreur. Cette méthode semble être un raccourci, mais elle est très pratique, car elle ne nécessite pas de modifier la méthode swap pour estimer les besoins en transactions, ce qui rend la logique plus simple.
Résolution des problèmes de précision des grands nombres
Dans les scénarios impliquant des calculs intensifs, comme le calcul des Tokens échangés en fonction du prix actuel et de la liquidité, il est nécessaire d'éviter la perte de précision due aux opérations de division. Une méthode consiste à utiliser une opération de décalage à gauche, comme << FixedPoint96.RESOLUTION, équivalente à multiplier par 2^96. Après le décalage à gauche, effectuer l'opération de division garantit la précision tant qu'il n'y a pas de débordement dans les transactions normales.
Calcul des gains par la méthode Share
Dans le cas où il est nécessaire d'enregistrer les revenus de frais de transaction des fournisseurs de liquidité LP( pour ), il n'est pas possible d'enregistrer les frais pour chaque LP à chaque transaction, car cela consommerait beaucoup de Gas.
Une solution consiste à enregistrer le total des frais de transaction et les frais de transaction à attribuer à chaque fournisseur de liquidité. Lorsque les LP retirent des frais de transaction, les frais extractibles sont calculés en fonction de la liquidité détenue. Cela ressemble au mécanisme par lequel les actionnaires retirent des dividendes.
Équilibre d'acquisition d'informations en ligne et hors ligne
Toutes les informations n'ont pas besoin d'être récupérées sur la chaîne. Le stockage sur la chaîne est relativement coûteux, de nombreuses informations peuvent être stockées dans des bases de données traditionnelles, comme les listes de pools de transactions, les informations sur les pools de transactions, etc. Ces données peuvent être synchronisées régulièrement depuis la chaîne, sans avoir besoin d'appeler en temps réel l'interface RPC des services de la chaîne ou des nœuds.
Certains fournisseurs de RPC blockchain proposent des interfaces avancées, permettant d'accéder plus rapidement et de manière plus économique à certaines données. Ces interfaces utilisent généralement la mise en cache pour améliorer les performances et l'efficacité.
Fractionnement des contrats et utilisation des contrats standards
Un projet peut contenir plusieurs contrats réellement déployés. Même s'il n'y a qu'un seul contrat réellement déployé, le code peut être divisé en plusieurs contrats à maintenir par héritage.
De plus, l'utilisation de contrats standard existants, tels que l'ERC721, peut améliorer l'efficacité du développement des contrats. Cela facilite non seulement la gestion, mais permet également d'utiliser des normes établies pour augmenter la vitesse et la sécurité du développement.
résumé
Le développement pratique est le moyen le plus efficace d'apprendre le développement de contrats. Essayer de réaliser une version simplifiée d'un échange décentralisé vous permettra de mieux comprendre l'implémentation du code des projets connus, et vous pourrez également apprendre davantage de points de connaissances issus de projets réels. La pratique, j'en suis sûr, vous sera bénéfique.
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.
18 J'aime
Récompense
18
6
Reposter
Partager
Commentaire
0/400
ServantOfSatoshi
· 08-12 16:04
Techniques astucieuses, c'est bien ce qu'on appelle des mouvements audacieux.
Voir l'originalRépondre0
mev_me_maybe
· 08-11 22:32
Les débutants en café ont découvert quel grand secret ? Ce ne sont que des choses déjà entendues.
Voir l'originalRépondre0
CommunityLurker
· 08-11 16:39
Débutant est-ce ? Je vous suggère de commencer par un hello world.
Voir l'originalRépondre0
Blockwatcher9000
· 08-10 12:50
Dire les choses de manière agréable, c'est une technique, en réalité ce sont toutes sortes d'astuces.
Voir l'originalRépondre0
OnChainDetective
· 08-10 12:46
J'ai étudié le déploiement de create2 depuis longtemps. Cette méthode n'est-elle pas utilisée pour poser des mines... Ceux qui comprennent savent.
Voir l'originalRépondre0
ContractExplorer
· 08-10 12:42
Découvrir une nouvelle vulnérabilité est le plus excitant, c'est comme courir après une vulnérabilité.
7 astuces pratiques pour maîtriser le développement des smart contracts
Les astuces ingénieuses dans le développement de contrats
Récemment, en étudiant le processus de développement des échanges décentralisés, j'ai consulté le code de certains projets connus et appris beaucoup de points intéressants. En tant que développeur qui essaie pour la première fois de développer des contrats Defi, ces petites astuces sont très utiles pour les débutants qui souhaitent apprendre le développement de contrats.
Voyons ensemble ces astuces ingénieuses, certaines peuvent même être qualifiées de techniques extraordinaires.
adresse de déploiement de contrat prévisible
Les adresses obtenues lors du déploiement de contrats semblent aléatoires, car elles sont liées au nonce. Cependant, dans certaines situations, nous devons inférer l'adresse du contrat à partir des informations de transaction, comme déterminer les droits de transaction ou obtenir l'adresse de la piscine.
Une méthode consiste à utiliser CREATE2 pour créer un contrat, en ajoutant le paramètre salt : pool = address(new UniswapV3Pool{salt: keccak256(abi.encode(token0, token1, fee))}()); . L'adresse du contrat créée de cette manière est prévisible, la logique de génération est nouvelle adresse = hash("0xFF", adresse du créateur, salt, initcode).
Utilisation astucieuse des fonctions de rappel
Dans Solidity, les contrats peuvent s'appeler mutuellement. Un modèle est que A appelle la méthode de B, et B rappelle A dans la méthode appelée, ce qui est utile dans certaines situations.
Par exemple, lorsque vous effectuez un échange en appelant la méthode swap du contrat UniswapV3Pool, elle rappellera swapCallback, en transmettant le Token réellement nécessaire pour cette transaction. L'appelant doit transférer le Token requis pour la transaction dans UniswapV3Pool lors du rappel, au lieu de diviser la méthode swap en deux parties. Cela garantit la sécurité de la méthode swap et son exécution complète, sans avoir besoin de tenir des enregistrements de variables encombrants.
utiliser des exceptions pour transmettre des informations, utiliser try catch pour réaliser une estimation de transaction
Dans certains contrats, l'estimation des transactions est réalisée en lançant des erreurs spéciales dans la fonction de rappel de transaction, puis en capturant cette erreur et en analysant les informations nécessaires à partir du message d'erreur. Cette méthode semble être un raccourci, mais elle est très pratique, car elle ne nécessite pas de modifier la méthode swap pour estimer les besoins en transactions, ce qui rend la logique plus simple.
Résolution des problèmes de précision des grands nombres
Dans les scénarios impliquant des calculs intensifs, comme le calcul des Tokens échangés en fonction du prix actuel et de la liquidité, il est nécessaire d'éviter la perte de précision due aux opérations de division. Une méthode consiste à utiliser une opération de décalage à gauche, comme << FixedPoint96.RESOLUTION, équivalente à multiplier par 2^96. Après le décalage à gauche, effectuer l'opération de division garantit la précision tant qu'il n'y a pas de débordement dans les transactions normales.
Calcul des gains par la méthode Share
Dans le cas où il est nécessaire d'enregistrer les revenus de frais de transaction des fournisseurs de liquidité LP( pour ), il n'est pas possible d'enregistrer les frais pour chaque LP à chaque transaction, car cela consommerait beaucoup de Gas.
Une solution consiste à enregistrer le total des frais de transaction et les frais de transaction à attribuer à chaque fournisseur de liquidité. Lorsque les LP retirent des frais de transaction, les frais extractibles sont calculés en fonction de la liquidité détenue. Cela ressemble au mécanisme par lequel les actionnaires retirent des dividendes.
Équilibre d'acquisition d'informations en ligne et hors ligne
Toutes les informations n'ont pas besoin d'être récupérées sur la chaîne. Le stockage sur la chaîne est relativement coûteux, de nombreuses informations peuvent être stockées dans des bases de données traditionnelles, comme les listes de pools de transactions, les informations sur les pools de transactions, etc. Ces données peuvent être synchronisées régulièrement depuis la chaîne, sans avoir besoin d'appeler en temps réel l'interface RPC des services de la chaîne ou des nœuds.
Certains fournisseurs de RPC blockchain proposent des interfaces avancées, permettant d'accéder plus rapidement et de manière plus économique à certaines données. Ces interfaces utilisent généralement la mise en cache pour améliorer les performances et l'efficacité.
Fractionnement des contrats et utilisation des contrats standards
Un projet peut contenir plusieurs contrats réellement déployés. Même s'il n'y a qu'un seul contrat réellement déployé, le code peut être divisé en plusieurs contrats à maintenir par héritage.
De plus, l'utilisation de contrats standard existants, tels que l'ERC721, peut améliorer l'efficacité du développement des contrats. Cela facilite non seulement la gestion, mais permet également d'utiliser des normes établies pour augmenter la vitesse et la sécurité du développement.
résumé
Le développement pratique est le moyen le plus efficace d'apprendre le développement de contrats. Essayer de réaliser une version simplifiée d'un échange décentralisé vous permettra de mieux comprendre l'implémentation du code des projets connus, et vous pourrez également apprendre davantage de points de connaissances issus de projets réels. La pratique, j'en suis sûr, vous sera bénéfique.