Développement de contrats intelligents avancé : 7 conseils pratiques pour aider les projets DeFi

robot
Création du résumé en cours

Partage d'astuces et d'expériences en développement de contrats

Récemment, lors du développement d'une bourse décentralisée, j'ai consulté l'implémentation du code d'Uniswap V3 et appris de nombreuses techniques pratiques de développement de contrats. En tant que développeur ayant déjà créé des contrats NFT simples, cette tentative de développement de contrats DeFi m'a beaucoup apporté. Ces techniques devraient être très utiles pour les débutants souhaitant apprendre le développement de contrats.

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

Adresse de contrat prévisible

Lors du déploiement d'un contrat, une adresse apparemment aléatoire est généralement obtenue, car elle est liée au nonce. Cependant, dans certaines situations, nous devons inférer l'adresse du contrat à partir des informations d'équivalence des transactions, par exemple pour déterminer les autorisations de transaction ou pour obtenir l'adresse d'un pool.

Une méthode pratique consiste à utiliser CREATE2 pour créer des contrats. En ajoutant le paramètre salt, l'adresse du contrat créé devient prévisible. La logique de génération de la nouvelle adresse est : hash("0xFF", adresse du créateur, salt, initcode). Cette méthode nous permet de connaître l'adresse du contrat avant de le créer.

Web3 Nouveaux venus série : Les petites astuces de développement de contrats que j'ai apprises du code Uniswap

Utilisation astucieuse des fonctions de rappel

Dans Solidity, les contrats peuvent s'appeler les uns les autres. Dans certains scénarios, A appelle la méthode de B, et B rappelle A dans la méthode appelée, ce modèle est très utile.

Par exemple, lors des transactions, le contrat de pool appellera swapCallback, en passant le nombre de Tokens réellement nécessaires pour cette transaction. L'appelant doit transférer les Tokens dans le contrat de pool lors de l'appel. Cette méthode garantit la sécurité et l'intégrité de la méthode swap, sans avoir besoin d'enregistrements de variables compliqués.

Utiliser les exceptions pour transmettre des informations, utiliser try-catch pour estimer les transactions

Lors de l'estimation d'une transaction, nous devons simuler la méthode swap sans réellement échanger de Token. Une approche astucieuse consiste à lever une erreur spéciale dans le rappel de la transaction, puis à capturer cette erreur et à en extraire les informations nécessaires. Cette méthode évite de devoir modifier spécialement la méthode swap pour l'estimation de la transaction, rendant la logique plus claire.

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

Résoudre les problèmes de précision des grands nombres

Lorsqu'il s'agit de calculer les prix et la liquidité, afin d'éviter la perte de précision due aux opérations de division, on peut utiliser l'opération de décalage à gauche ( équivalente à multiplier par 2^96). Cela permet de garantir la précision tant que les transactions normales ne débordent pas. Bien qu'il y ait encore une légère perte de précision en théorie, cela est déjà acceptable.

Calcul des bénéfices par le biais du partage

Pour le calcul des revenus de frais de transaction pour les LP, il n'est pas possible d'enregistrer chaque LP à chaque transaction, car cela consommerait beaucoup de Gas. Une bonne méthode consiste à enregistrer les frais totaux et les frais à attribuer par unité de liquidité. Lors du retrait des LP, les frais récupérables sont calculés en fonction de la liquidité détenue, similaire au principe des dividendes d'actions.

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

Combinaison des données on-chain et off-chain

Toutes les informations ne nécessitent pas d'être enregistrées sur la chaîne ou d'être récupérées à partir de celle-ci. Des informations comme la liste des pools de transactions, les informations sur les pools, etc. peuvent être stockées dans une base de données ordinaire et synchronisées régulièrement avec la chaîne. Cela peut améliorer les performances et l'efficacité, tout en réduisant les coûts. Bien sûr, les transactions clés doivent toujours être effectuées sur la chaîne.

Division de contrat et réutilisation de contrat standard

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

En même temps, l'utilisation des contrats standard existants ( comme ERC721) peut améliorer l'efficacité du développement. Par exemple, utiliser ERC721 pour gérer les positions est à la fois pratique et permet de réutiliser du code mature.

Résumé

Le développement pratique est la meilleure façon d'apprendre. Essayer de réaliser une version simplifiée d'une bourse décentralisée vous permettra de mieux comprendre l'implémentation du code d'Uniswap et d'apprendre davantage de points de connaissance dans des projets concrets. J'espère que ces partages d'expérience vous seront utiles.

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

Voir l'original
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
  • Récompense
  • 3
  • Partager
Commentaire
0/400
gas_fee_traumavip
· Il y a 11h
Les contrats sont difficiles à gérer, mon frère.
Voir l'originalRépondre0
SchrodingerAirdropvip
· Il y a 11h
Renaissance, je suis réincarné dans un échange anormal.
Voir l'originalRépondre0
degenwhisperervip
· Il y a 11h
v3 n'est finalement pas assez flexible
Voir l'originalRépondre0
  • Épingler
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)