Définition
EIP-155 : définition
Aussi appelé : chainId
L'EIP-155 est une amélioration d'Ethereum qui intègre l'identifiant de la chaîne (chainId) dans les données signées d'une transaction, afin qu'une transaction valide sur un réseau ne puisse pas être rejouée sur un autre réseau compatible.
Thème : Ethereum et smart contracts
Le problème est apparu après le hard fork de 2016 qui a séparé Ethereum et Ethereum Classic. Les deux chaînes partageaient le même historique, les mêmes adresses et le même format de transaction. Une transaction signée pour l'une pouvait donc être copiée et diffusée sur l'autre, où elle restait parfaitement valide : c'est une attaque par rejeu, ou replay. Un utilisateur qui envoyait des ETH pouvait ainsi, sans le vouloir, envoyer aussi le même montant en ETC au même destinataire.
L'EIP-155, activée lors de la mise à jour Spurious Dragon fin 2016, a introduit le chainId dans la signature. Chaque réseau possède un identifiant numérique : 1 pour le mainnet d'Ethereum, 61 pour Ethereum Classic, et un identifiant propre pour chaque testnet, rollup ou blockchain compatible EVM. Comme le chainId fait partie du message signé, une signature produite pour un réseau devient invalide sur un autre. Les types de transactions apparus ensuite, comme ceux de l'EIP-1559, contiennent directement un champ chainId. Les portefeuilles doivent donc connaître le chainId du réseau auquel ils sont connectés.
Un exemple concret
Imaginons qu'Olivier signe une transaction pour envoyer 1 ETH sur le mainnet Ethereum, de chainId 1. Un observateur malveillant copie la transaction et la diffuse sur une autre chaîne compatible EVM où Olivier possède aussi des fonds. Les nœuds de cette chaîne attendent un chainId différent : la vérification de la signature échoue et la transaction est rejetée.
Les risques à connaître
L'EIP-155 ne protège que si le chainId est correctement utilisé. Des transactions anciennes au format sans chainId restent acceptées par certains réseaux. Deux chaînes qui utiliseraient le même chainId seraient exposées au rejeu. Les messages signés hors transaction, comme les permits, doivent intégrer leur propre protection, par exemple via le domaine de l'EIP-712.
Questions fréquentes sur EIP-155
Qu'est-ce que le chainId d'Ethereum ?
C'est l'identifiant numérique d'un réseau compatible EVM. Celui du mainnet Ethereum est 1. Il est inclus dans chaque transaction signée pour indiquer le réseau visé.
Pourquoi mon portefeuille me demande-t-il de changer de réseau ?
Parce que chaque transaction est signée pour un chainId précis. Si l'application attend un autre réseau que celui sélectionné, le portefeuille doit basculer pour produire une signature valide sur le bon réseau.