本文へスキップ
ecdsa.com

EIP-191(署名付きデータの標準)

署名するメッセージをバイト 0x19 とバージョンバイトで始めることで、有効なトランザクションになりえないようにする Ethereum の規約で、バージョン 0x45 はほとんどのウォレットが使う personal_sign 形式です。
別表記EIP-191ERC-191Ethereum signed message\x19Ethereum Signed Message

署名されるデータは 0x19 ‖ version ‖ version-specific data ‖ data です。バージョンは 0x00(想定するバリデーターのアドレスを伴うデータ)、0x01(構造化データ、つまり EIP-712)、そして personal_sign 用の 0x45(文字 E)です。この形式では、0x19 に続けて Ethereum Signed Message: と改行、10 進数の ASCII で表したメッセージ長、メッセージ本体を並べます。RLP エンコードされたトランザクションが 0x19 で始まることはなく、これがこのプレフィックスの目的です。

ウォレットはこれを Keccak-256 でハッシュし、secp256k1 で署名します。署名は 65 バイトの r ‖ s ‖ v で、v は 27 または 28 です。メッセージ hello のダイジェストは 0x50b2c43fd39106bafbba0da34fc430e1f91e3c96ea2acee2bc34119f92b37750 です。検証者は ecrecover(またはライブラリの verifyMessage)でアドレスを復元して比較します。スマートアカウントでは、代わりに ERC-1271 が必要です。

personal_sign はユーザーに意味の読み取りにくいテキストを見せるだけで、ドメインやチェーンへの紐付けもありません。そのため、アプリケーションはそれらをメッセージに含める(Sign-In with Ethereum はそうしています)か、構造や価値を伴うものには EIP-712 を優先して使うべきです。

規格と参考文献

すべての用語