Les astuces de développement de contrats apprises en lisant le code d'Uniswap sont bien plus intéressantes que les manuels.



Récemment, en enseignant le développement d'une plateforme d'échange décentralisée, j'ai approfondi la mise en œuvre d'Uniswap V3 et découvert des techniques vraiment ingénieuses. Je n'avais écrit que des contrats NFT simples auparavant, c'était la première fois que je m'attaquais sérieusement au code de contrats DeFi, et j'ai trouvé beaucoup de choses à partager avec ceux qui veulent apprendre Uniswap.

Je vais commencer par ce qui m'a le plus surpris — l'adresse du contrat peut-elle vraiment être prédite ?

En général, l'adresse d'un contrat déployé semble aléatoire, mais Uniswap utilise une méthode astucieuse. Il utilise le paramètre salt lors de la création du contrat avec l'opcode CREATE2, ce qui permet de rendre l'adresse générée prévisible. La méthode spécifique est « pool = address(new UniswapV3Pool{salt: keccak256(abi.encode(token0, token1, fee))}()); ». Avec ce code, dès qu'on connaît la paire de tokens et les frais, on peut calculer l'adresse du pool sans déployer réellement le contrat. Cela est très utile pour vérifier les permissions ou localiser rapidement un pool.

La conception des fonctions de rappel (callback) est aussi très ingénieuse.

Dans Uniswap, lorsque vous appelez la méthode swap pour échanger, il y a une fonction swapCallback qui est appelée en retour, transmettant la quantité de tokens nécessaire. Ensuite, vous transférez les tokens dans cette fonction de rappel. Cela permet d'exécuter toute la logique de transaction de manière cohérente, sans devoir la diviser en plusieurs étapes ou utiliser des variables complexes pour la sécurité. En résumé, A appelle B, puis B rappelle A, formant une boucle fermée.

La méthode d'estimation des transactions est aussi très « hacky » — elle utilise une exception pour transmettre des informations.

Puisqu'une estimation ne réalise pas réellement l'échange de tokens, elle va échouer. La solution d'Uniswap consiste à lancer une erreur spéciale dans le callback, puis à la capturer avec try-catch, en analysant le message d'erreur pour en extraire les données nécessaires. Cela peut sembler un peu brutal, mais c'est très pratique, car cela permet d'ajouter une estimation sans modifier la méthode swap.

Une solution pour la précision est aussi très instructive.

Lors du calcul de l'échange de tokens, faire une division directe peut entraîner une perte de précision. Uniswap multiplie d'abord par 2^96 (décalage à gauche de 96 bits), puis divise, et enfin annule ce décalage dans le calcul. Cela garantit une précision suffisante dans le uint256 sans risque de dépassement. Les variables sqrtRatioAX96 et sqrtRatioBX96 illustrent cette approche — cela paraît complexe, mais la logique est claire.

Le calcul des revenus de frais de transaction est aussi très intelligent.

Au lieu d'enregistrer chaque frais pour chaque LP à chaque transaction (ce qui consommerait beaucoup de gas), il est plus efficace de suivre le total des frais accumulés et la part de chaque LP. Lorsqu’un LP retire ses fonds, il multiplie sa liquidité par le total historique des frais par action pour calculer ses gains, comme un dividende basé sur la part. Cette méthode de partage est largement utilisée dans de nombreux projets.

Il est aussi crucial de ne pas tout mettre sur la blockchain.

Les listes de pools, les informations de base, etc., peuvent tout à fait être stockées dans une base de données classique, puis synchronisées périodiquement avec la chaîne. Il n’est pas nécessaire d’appeler en temps réel des interfaces RPC. Beaucoup de fournisseurs de services blockchain proposent aujourd’hui des API avancées pour accéder rapidement et à moindre coût aux données — c’est la même idée.

Enfin, la façon dont le code est organisé.

Un projet complexe divise souvent ses contrats en plusieurs modules pour la maintenance. Uniswap hérite de plusieurs contrats, ce qui facilite la gestion. Il faut aussi exploiter les standards existants, comme utiliser directement OpenZeppelin ERC721 pour gérer les positions, ce qui augmente la productivité et garantit la qualité du code.

Honnêtement, lire des articles ne vaut pas le fait de coder soi-même. En réalisant une version simplifiée d’une plateforme d’échange décentralisée, on comprend vraiment pourquoi Uniswap est conçu ainsi. Le cours WTF-DApp repose sur cette idée, vous guidant étape par étape pour réaliser un projet pratique basé sur Uniswap, ce qui sera sûrement très utile pour votre développement de contrats.
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.
  • Récompense
  • Commentaire
  • Reposter
  • Partager
Commentaire
Ajouter un commentaire
Ajouter un commentaire
Aucun commentaire
  • Épingler