Forma de la llamada: personal_sign con los parámetros [message, address], donde el mensaje son bytes codificados en hexadecimal (la mayoría de las billeteras también aceptan texto UTF-8). Las bibliotecas lo reproducen: signer.signMessage en ethers, signMessage en viem, encode_defunct en web3.py. El antiguo eth_sign firmaba un hash arbitrario de 32 bytes sin prefijo, lo que permitía a las dapps engañar a los usuarios para que firmaran transacciones, y la mayoría de las billeteras lo desactivan o muestran una advertencia si se usa.
La verificación vuelve a calcular el hash Keccak-256 con prefijo y recupera la dirección o, en las billeteras inteligentes, llama a isValidSignature de ERC-1271 (envuelto en ERC-6492 para cuentas aún no desplegadas). Los mensajes de Sign-In with Ethereum se firman así.