Skip to content
ecdsa.com

personal_sign

The Ethereum JSON-RPC wallet method that signs a message with the EIP-191 version 0x45 prefix, returning a 65-byte r‖s‖v signature; the default for log-in and simple message signing.
Also written aspersonal_signeth_sign

Call shape: personal_sign with parameters [message, address], where the message is hex-encoded bytes (most wallets also accept UTF-8 text). Libraries mirror it: ethers signer.signMessage, viem signMessage, web3.py encode_defunct. The older eth_sign signed an arbitrary 32-byte hash without a prefix, letting dapps trick users into signing transactions, and most wallets disable or warn about it.

Verification recomputes the prefixed Keccak-256 hash and recovers the address, or calls ERC-1271 isValidSignature (wrapped in ERC-6492 for undeployed accounts) for smart wallets. Sign-In with Ethereum messages are signed this way.

Standards and references

All terms