Récemment, en développant une bourse décentralisée, j'ai consulté l'implémentation du code d'un DEX connu et j'ai appris de nombreuses techniques pratiques de développement de contrats. En tant que novice qui vient juste de découvrir le développement de contrats Defi, ces techniques m'ont beaucoup inspiré et je suis sûr qu'elles seront également utiles à d'autres amis qui souhaitent apprendre le développement de contrats.
Adresse de contrat prévisible
Les adresses de contrat déployées semblent généralement aléatoires et sont difficiles à prédire. Cependant, dans certaines situations, nous devons déduire l'adresse du contrat à partir des informations sur les paires de transaction, par exemple pour juger des droits de transaction ou obtenir l'adresse de la piscine.
Cela peut être réalisé en créant un contrat en utilisant la méthode CREATE2. La démarche consiste à ajouter un paramètre salt lors de la création du contrat :
solidité
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, sel, initcode)
Utiliser des fonctions de rappel
Dans certains cas, l'appel mutuel entre contrats est très utile. Par exemple, A appelle la méthode de B, et B appelle A dans la méthode appelée.
Prenons l'exemple d'une transaction, lorsque la méthode swap du contrat de pool est appelée, elle rappellera swapCallback, en passant la quantité réelle de tokens requise calculée. L'appelant doit transférer les tokens dans le contrat de pool lors du rappel, ce qui garantit l'exécution complète et la sécurité de la méthode swap, sans enregistrement fastidieux de variables.
Transmission d'informations par exception
Lors de l'estimation des transactions, nous devons simuler la méthode swap sans échanger réellement de Token. Nous pouvons lancer une erreur spéciale dans la fonction de rappel de la transaction, puis capturer cette erreur et en extraire les informations nécessaires.
Cette méthode semble être un raccourci, mais elle est très pratique. Il n'est pas nécessaire de modifier spécifiquement la méthode de swap pour estimer les transactions, la logique est plus simple.
La grande numération résout le problème de précision
Lorsqu'il s'agit de calculer les prix et la liquidité, pour éviter la perte de précision due aux opérations de division, on peut utiliser l'opération de décalage à gauche, ( équivaut à multiplier par 2^96).
Cela permet de garantir la précision sans débordement lors des transactions normales. Bien qu'il y ait encore une légère perte de précision en théorie, elle est désormais acceptable.
Calcul des bénéfices par méthode de partage
Pour éviter d'enregistrer des frais pour tous les LP à chaque transaction, il est possible d'utiliser la méthode Share.
Il suffit d'enregistrer le total des frais de transaction et les frais de transaction à attribuer à chaque liquidité. Lors du retrait des LP, les frais de transaction pouvant être retirés sont calculés en fonction de la liquidité détenue, similaire à un dividende d'actions.
Utilisation raisonnable des données hors chaîne
Toutes les informations ne nécessitent pas d'être mises sur la chaîne ou récupérées de la chaîne. Par exemple, la liste des pools de transactions et les informations de base peuvent être stockées dans une base de données ordinaire et synchronisées régulièrement.
Certaines interfaces RPC avancées offrent également des méthodes d'acquisition de données optimisées par le cache, ce qui peut améliorer les performances et l'efficacité.
Fractionnement et réutilisation des contrats
Les grands projets peuvent être divisés en plusieurs contrats déployés en pratique, ou divisés en plusieurs contrats à maintenir par héritage.
En même temps, des contrats standards existants tels que ERC721 peuvent être réutilisés, ce qui améliore l'efficacité du développement. Par exemple:
Étudier l'implémentation du code de projets excellents et essayer de développer par soi-même peut vous donner une compréhension plus approfondie des échanges décentralisés. J'espère que ces petites astuces vous aideront dans le développement de vos contrats!
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.
20 J'aime
Récompense
20
5
Reposter
Partager
Commentaire
0/400
LayerZeroEnjoyer
· 08-01 16:48
BTC sont tous explosés et vous étudiez encore le defi ?
Voir l'originalRépondre0
degenwhisperer
· 08-01 00:26
Copier directement le code de uni
Voir l'originalRépondre0
GateUser-40edb63b
· 07-29 21:17
Ce crochet de smart contracts est vraiment avancé.
7 conseils pratiques pour le développement de contrats intelligents afin de soutenir les projets DEX
Résumé des astuces de développement de contrats
Récemment, en développant une bourse décentralisée, j'ai consulté l'implémentation du code d'un DEX connu et j'ai appris de nombreuses techniques pratiques de développement de contrats. En tant que novice qui vient juste de découvrir le développement de contrats Defi, ces techniques m'ont beaucoup inspiré et je suis sûr qu'elles seront également utiles à d'autres amis qui souhaitent apprendre le développement de contrats.
Adresse de contrat prévisible
Les adresses de contrat déployées semblent généralement aléatoires et sont difficiles à prédire. Cependant, dans certaines situations, nous devons déduire l'adresse du contrat à partir des informations sur les paires de transaction, par exemple pour juger des droits de transaction ou obtenir l'adresse de la piscine.
Cela peut être réalisé en créant un contrat en utilisant la méthode CREATE2. La démarche consiste à ajouter un paramètre salt lors de la création du contrat :
solidité 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, sel, initcode)
Utiliser des fonctions de rappel
Dans certains cas, l'appel mutuel entre contrats est très utile. Par exemple, A appelle la méthode de B, et B appelle A dans la méthode appelée.
Prenons l'exemple d'une transaction, lorsque la méthode swap du contrat de pool est appelée, elle rappellera swapCallback, en passant la quantité réelle de tokens requise calculée. L'appelant doit transférer les tokens dans le contrat de pool lors du rappel, ce qui garantit l'exécution complète et la sécurité de la méthode swap, sans enregistrement fastidieux de variables.
Transmission d'informations par exception
Lors de l'estimation des transactions, nous devons simuler la méthode swap sans échanger réellement de Token. Nous pouvons lancer une erreur spéciale dans la fonction de rappel de la transaction, puis capturer cette erreur et en extraire les informations nécessaires.
Cette méthode semble être un raccourci, mais elle est très pratique. Il n'est pas nécessaire de modifier spécifiquement la méthode de swap pour estimer les transactions, la logique est plus simple.
La grande numération résout le problème de précision
Lorsqu'il s'agit de calculer les prix et la liquidité, pour éviter la perte de précision due aux opérations de division, on peut utiliser l'opération de décalage à gauche, ( équivaut à multiplier par 2^96).
Par exemple:
solidité numerator1 = FullMath.mulDiv(liquidity << FixedPoint96.RESOLUTION, sqrtRatioBX96 - sqrtRatioAX96, sqrtRatioBX96);
Cela permet de garantir la précision sans débordement lors des transactions normales. Bien qu'il y ait encore une légère perte de précision en théorie, elle est désormais acceptable.
Calcul des bénéfices par méthode de partage
Pour éviter d'enregistrer des frais pour tous les LP à chaque transaction, il est possible d'utiliser la méthode Share.
Il suffit d'enregistrer le total des frais de transaction et les frais de transaction à attribuer à chaque liquidité. Lors du retrait des LP, les frais de transaction pouvant être retirés sont calculés en fonction de la liquidité détenue, similaire à un dividende d'actions.
Utilisation raisonnable des données hors chaîne
Toutes les informations ne nécessitent pas d'être mises sur la chaîne ou récupérées de la chaîne. Par exemple, la liste des pools de transactions et les informations de base peuvent être stockées dans une base de données ordinaire et synchronisées régulièrement.
Certaines interfaces RPC avancées offrent également des méthodes d'acquisition de données optimisées par le cache, ce qui peut améliorer les performances et l'efficacité.
Fractionnement et réutilisation des contrats
Les grands projets peuvent être divisés en plusieurs contrats déployés en pratique, ou divisés en plusieurs contrats à maintenir par héritage.
En même temps, des contrats standards existants tels que ERC721 peuvent être réutilisés, ce qui améliore l'efficacité du développement. Par exemple:
solidité contrat NonfungiblePositionManager est INonfungiblePositionManager, PeripheryImmutableState, PoolInitializer, GestionDeLiquidité, PeripheryValidation, Multicall, ERC721Permit, PeripheryPayments, NFTDescriptor { // ... }
Étudier l'implémentation du code de projets excellents et essayer de développer par soi-même peut vous donner une compréhension plus approfondie des échanges décentralisés. J'espère que ces petites astuces vous aideront dans le développement de vos contrats!