本文へスキップ
ecdsa.com

ECDSA 公開鍵の復元

ECDSA 署名とメッセージのハッシュ値から署名者の公開鍵を計算すること(SEC 1 §4.1.6)で、Ethereum と Bitcoin のメッセージ署名では、鍵を送信する代わりにこの方法を使います。
別表記key recoveryrecovery idrecid

検証者は r から、x 座標が r である候補点 R を再構成し(y の値が 2 通りあり、まれに x 座標が r + n の場合もあります)、Q = r⁻¹·(s·R − z·G) を計算します。どの候補を使うかはリカバリ ID で選び、通常は R の y 座標の偶奇を表す 0 または 1 です。Ethereum はこれを v に入れます。personal_sign と旧来のメッセージでは 27 または 28、EIP-155 のトランザクションでは chainId × 2 + 35 または + 36、型付きトランザクションでは 0 または 1 です。Bitcoin の署名付きメッセージ形式では、ヘッダーバイトに入れます(アドレスの種類に応じて 27〜42。BIP-137)。

アドレス 0x01 にあるプリコンパイル済みコントラクト ecrecover は、復元した鍵の 20 バイトのアドレスを返します。コントラクトはこの仕組みで、公開鍵を保存せずに personal_sign、EIP-712、permit の署名を確認します。形式が正しい署名からは必ず何らかの鍵が復元されるため、結果を想定するアドレスと比較するまでは何も証明されません。また、ecrecover は失敗時にゼロアドレスを返すので、コントラクトはこれを拒否しなければなりません。

公開鍵の復元は、P-256 を含むあらゆる曲線上の ECDSA で行えます。Schnorr 署名(BIP-340)と EdDSA では、チャレンジのハッシュ値に公開鍵が組み込まれているため、復元はできません。

規格と参考文献

すべての用語