Die signierten Daten lauten 0x19 ‖ version ‖ version-specific data ‖ data. Versionen: 0x00 (Daten mit einer vorgesehenen Validator-Adresse), 0x01 (strukturierte Daten, also EIP-712) und 0x45, der Buchstabe E, für personal_sign: 0x19, gefolgt von Ethereum Signed Message: und einem Zeilenumbruch, der Länge der Nachricht als Dezimalzahl in ASCII und der Nachricht. RLP-kodierte Transaktionen können nicht mit 0x19 beginnen – genau darum geht es bei dem Präfix.
Die Wallet hasht das Ergebnis mit Keccak-256 und signiert mit secp256k1; die Signatur umfasst 65 Byte r ‖ s ‖ v mit v 27 oder 28. Für die Nachricht hello lautet der Digest 0x50b2c43fd39106bafbba0da34fc430e1f91e3c96ea2acee2bc34119f92b37750. Verifizierer stellen die Adresse mit ecrecover (oder mit verifyMessage einer Bibliothek) wieder her und vergleichen sie; Smart Accounts brauchen stattdessen ERC-1271.
personal_sign zeigt undurchsichtigen Text an und bietet keine Bindung an Domain oder Chain; Anwendungen sollten beides deshalb in die Nachricht aufnehmen (wie Sign-In with Ethereum) oder für alles mit Struktur oder Wert EIP-712 bevorzugen.