Passer au contenu principal
Change page

Norme de jeton ERC-20

Introduction

Qu'est-ce qu'un jeton ?

Les jetons peuvent représenter pratiquement n'importe quoi sur Ethereum :

  • des points de réputation sur une plateforme en ligne
  • les compétences d'un personnage dans un jeu
  • des actifs financiers comme une action dans une entreprise
  • une monnaie fiduciaire comme l'USD
  • une once d'or
  • et bien plus encore...

Une fonctionnalité aussi puissante d'Ethereum doit être gérée par une norme robuste, n'est-ce pas ? C'est exactement là que l'ERC-20 joue son rôle ! Cette norme permet aux développeurs de créer des applications de jetons qui sont interopérables avec d'autres produits et services. La norme ERC-20 est également utilisée pour fournir des fonctionnalités supplémentaires à l'.

Qu'est-ce que l'ERC-20 ?

L'ERC-20 introduit une norme pour les jetons fongibles, en d'autres termes, ils possèdent une propriété qui fait que chaque jeton est exactement le même (en type et en valeur) qu'un autre jeton. Par exemple, un jeton ERC-20 agit exactement comme l'ETH, ce qui signifie qu'un jeton est et sera toujours égal à tous les autres jetons.

Prérequis

Corps

L'ERC-20 (Ethereum Request for Comments 20), proposé par Fabian Vogelsteller en novembre 2015, est une norme de jeton qui implémente une API pour les jetons au sein des contrats intelligents.

Exemples de fonctionnalités fournies par l'ERC-20 :

  • transférer des jetons d'un compte à un autre
  • obtenir le solde actuel de jetons d'un compte
  • obtenir l'offre totale du jeton disponible sur le réseau
  • approuver si un montant de jetons d'un compte peut être dépensé par un compte tiers

Si un contrat intelligent implémente les méthodes et événements suivants, il peut être appelé un contrat de jeton ERC-20 et, une fois déployé, il sera responsable du suivi des jetons créés sur Ethereum.

D'après l'EIP-20 (opens in a new tab) :

Méthodes

Événements

event Transfer(address indexed _from, address indexed _to, uint256 _value)
event Approval(address indexed _owner, address indexed _spender, uint256 _value)

Exemples

Voyons à quel point une norme est importante pour nous simplifier l'inspection de n'importe quel contrat de jeton ERC-20 sur Ethereum. Nous avons juste besoin de l'interface binaire-programme (ABI) du contrat pour créer une interface vers n'importe quel jeton ERC-20. Comme vous pouvez le voir ci-dessous, nous utiliserons une ABI simplifiée, pour en faire un exemple facile à aborder.

Exemple avec Web3.py

Tout d'abord, assurez-vous d'avoir installé la bibliothèque Python Web3.py (opens in a new tab) :

pip install web3

Problèmes connus

Problème de réception des jetons ERC-20

Au 20/06/2024, au moins 83 656 418 $ de jetons ERC-20 ont été perdus à cause de ce problème. Notez qu'une implémentation pure de l'ERC-20 est sujette à ce problème à moins que vous n'implémentiez un ensemble de restrictions supplémentaires en plus de la norme, comme indiqué ci-dessous.

Lorsque des jetons ERC-20 sont envoyés à un contrat intelligent qui n'est pas conçu pour gérer les jetons ERC-20, ces jetons peuvent être définitivement perdus. Cela se produit parce que le contrat récepteur n'a pas la fonctionnalité pour reconnaître ou répondre aux jetons entrants, et il n'y a aucun mécanisme dans la norme ERC-20 pour notifier le contrat récepteur des jetons entrants. Les principales façons dont ce problème se manifeste sont :

  1. Mécanisme de transfert de jetons
  • Les jetons ERC-20 sont transférés à l'aide des fonctions transfer ou transferFrom
    • Lorsqu'un utilisateur envoie des jetons à une adresse de contrat à l'aide de ces fonctions, les jetons sont transférés, que le contrat récepteur soit conçu pour les gérer ou non
  1. Manque de notification
    • Le contrat récepteur ne reçoit pas de notification ou de rappel indiquant que des jetons lui ont été envoyés
    • Si le contrat récepteur manque d'un mécanisme pour gérer les jetons (par exemple, une fonction de repli ou une fonction dédiée pour gérer la réception des jetons), les jetons sont effectivement bloqués à l'adresse du contrat
  2. Aucune gestion intégrée
    • La norme ERC-20 n'inclut pas de fonction obligatoire à implémenter pour les contrats récepteurs, ce qui conduit à une situation où de nombreux contrats sont incapables de gérer correctement les jetons entrants

Solutions possibles

Bien qu'il ne soit pas possible d'empêcher complètement ce problème avec l'ERC-20, il existe des méthodes qui permettraient de réduire considérablement la possibilité d'une perte de jetons pour l'utilisateur final :

  • Le problème le plus courant survient lorsqu'un utilisateur envoie des jetons à l'adresse du contrat de jeton lui-même (par exemple, des USDT déposés à l'adresse du contrat de jeton USDT). Il est recommandé de restreindre la fonction transfer(..) pour annuler de telles tentatives de transfert. Envisagez d'ajouter la vérification require(_to != address(this)); dans l'implémentation de la fonction transfer(..).
  • La fonction transfer(..) en général n'est pas conçue pour déposer des jetons sur des contrats. Le modèle approve(..) & transferFrom(..) est plutôt utilisé pour déposer des jetons ERC-20 sur des contrats. Il est possible de restreindre la fonction de transfert pour interdire le dépôt de jetons sur n'importe quel contrat avec celle-ci, cependant cela peut rompre la compatibilité avec les contrats qui supposent que les jetons peuvent être déposés sur des contrats avec la fonction transfer(..) (par exemple, les pools de liquidité Uniswap).
  • Partez toujours du principe que des jetons ERC-20 peuvent se retrouver dans votre contrat même si votre contrat n'est pas censé en recevoir. Il n'y a aucun moyen d'empêcher ou de rejeter les dépôts accidentels du côté du destinataire. Il est recommandé d'implémenter une fonction qui permettrait d'extraire les jetons ERC-20 déposés accidentellement.
  • Envisagez d'utiliser des normes de jetons alternatives.

Certaines normes alternatives ont émergé de ce problème, telles que l'ERC-223 ou l'ERC-1363.

Lectures complémentaires

Autres normes de jetons fongibles

Tutoriels : Construire avec l'ERC-20 sur Ethereum