Pourquoi « l’autorisation de jeton » est la pire idée en DeFi.
ERC-20 a bien réussi pour les jetons, mais a mal fait la partie difficile. Il a standardisé les soldes et les transferts, mais n’a jamais offert un moyen propre pour un contrat d’utiliser réellement vos jetons. Un simple transfert vers un contrat ne lui indique même pas qu’un montant est arrivé. Alors, ils ont ajouté un correctif temporaire : approve + transferFrom.
Regardez ce que ce correctif vous impose. Pour permettre à un contrat de dépenser vos jetons, vous devez soit :
- lui accorder une autorisation unique pour un montant énorme ou infini, et désormais il peut puiser dans votre wallet à tout moment, pour toujours, jusqu’à ce que vous vous souveniez de le révoquer. Vous faites confiance à un contrat que vous n’avez probablement jamais lu.
- OU accorder le montant exact juste avant chaque action, ce qui signifie une deuxième transaction et une deuxième frais de gaz pour chaque opération.
Faire confiance à un inconnu, ou payer une taxe à chaque mouvement. Voilà les deux choix, et la norme n’offre rien de mieux. Tout le monde choisit la porte numéro un et clique sur « infini », et la chaîne se remplit de wallets pointant des armes chargées sur eux-mêmes.
Ce n’est pas théorique. Le bot MEV jaredfromsubway vient de perdre des millions de cette manière. Rien n’a été piraté. Il a accordé des autorisations en poursuivant des échanges fictifs, et quelqu’un a utilisé transferFrom pour retirer les fonds.
La pire partie : une meilleure conception existait depuis tout ce temps. Transfer-and-call (ERC-223, ERC-1363) déplace le montant exact et notifie le récepteur en une seule transaction. Pas d’autorisation permanente, pas de transaction supplémentaire, pas d’inconnu détenteur d’une clé pour votre compte. Elle a perdu face au coup d’avance d’ERC-20, et maintenant les autorisations infinies sont structurelles dans tout le DeFi. Permit, Permit2, account abstraction, chaque « correction » est un patch sur un mécanisme primitif qui n’aurait jamais dû être publié.
Nous n’avons pas obtenu l’option sécurisée. Nous avons obtenu l’option pratique, et nous en payons le prix depuis.