Les données signées sont 0x19 ‖ version ‖ version-specific data ‖ data. Versions : 0x00 (données avec l’adresse d’un validateur désigné), 0x01 (données structurées, c’est-à-dire EIP-712) et 0x45, la lettre E, pour personal_sign : 0x19 suivi de Ethereum Signed Message: et d’un saut de ligne, puis de la longueur du message en ASCII décimal et du message. Les transactions encodées en RLP ne peuvent pas commencer par 0x19 : c’est tout l’intérêt du préfixe.
Le portefeuille hache le résultat avec Keccak-256 et signe avec secp256k1 ; la signature fait 65 octets, r ‖ s ‖ v, avec un v de 27 ou 28. Pour le message hello, le condensat est 0x50b2c43fd39106bafbba0da34fc430e1f91e3c96ea2acee2bc34119f92b37750. Les vérificateurs récupèrent l’adresse avec ecrecover (ou le verifyMessage d’une bibliothèque) et la comparent ; les comptes intelligents nécessitent ERC-1271 à la place.
personal_sign montre aux utilisateurs un texte opaque et n’offre aucune liaison au domaine ni à la chaîne : les applications devraient donc les inclure dans le message (comme le fait Sign-In with Ethereum) ou préférer EIP-712 pour tout ce qui a une structure ou une valeur.