Os dados assinados são 0x19 ‖ version ‖ version-specific data ‖ data. Versões: 0x00 (dados com o endereço de um validador designado), 0x01 (dados estruturados, ou seja, EIP-712) e 0x45, a letra E, para personal_sign: 0x19 seguido de Ethereum Signed Message: e uma quebra de linha, o comprimento da mensagem em ASCII decimal e a mensagem. Transações codificadas em RLP não podem começar com 0x19, e é justamente esse o objetivo do prefixo.
A carteira calcula o hash do resultado com Keccak-256 e assina com secp256k1; a assinatura tem 65 bytes, r ‖ s ‖ v, com v 27 ou 28. Para a mensagem hello, o digest é 0x50b2c43fd39106bafbba0da34fc430e1f91e3c96ea2acee2bc34119f92b37750. Os verificadores recuperam o endereço com ecrecover (ou com o verifyMessage de uma biblioteca) e o comparam; as contas inteligentes exigem, em vez disso, a ERC-1271.
O personal_sign mostra aos usuários um texto opaco e não oferece vínculo com domínio nem com cadeia, por isso convém que os aplicativos incluam esses dados na mensagem (como faz o Sign-In with Ethereum) ou prefiram a EIP-712 para tudo o que tenha estrutura ou valor.