呼び出し形式:パラメーター [message, address] を指定して personal_sign を呼び出します。メッセージは 16 進エンコードしたバイト列です(ほとんどのウォレットは UTF-8 のテキストも受け付けます)。ライブラリもこれに倣っており、ethers の signer.signMessage、viem の signMessage、web3.py の encode_defunct があります。以前の eth_sign はプレフィックスなしで任意の 32 バイトのハッシュ値に署名していたため、dapp がユーザーをだましてトランザクションに署名させることができました。ほとんどのウォレットはこれを無効にしているか、警告を表示します。
検証では、プレフィックス付きの Keccak-256 ハッシュ値を再計算してアドレスを復元するか、スマートウォレットの場合は ERC-1271 の isValidSignature を呼び出します(まだデプロイされていないアカウントでは ERC-6492 で包みます)。Sign-In with Ethereum のメッセージもこの方法で署名されます。