以下の内容は、筆者の現時点での理解を示すものにすぎません
========
だいたい前回の記事に対する理論的な補足です。一度の署名検証における流れと理論的な証明を整理し、ついでに群に関する知識も補いました(

予備知識:secp256k1、有限体、楕円曲線上の点演算
剰余演算と楕円曲線上の点演算が大量に登場するため、予備知識を少し用意しました(ついでに自分で補った内容も載せておきますwww。すでに知っている場合は読み飛ばしても構いません。
予備知識
Ethereum ウォレットの署名には ECDSA が使われており、その基礎となる曲線は secp256k1 です。r/s/v、公開鍵の復元、アドレスの生成を理解する前に、まず次の3つの対象を理解する必要があります。
- 有限体 F_p
- 楕円曲線上の点群 E(F_p)
- 基点 G とその位数 n
1. secp256k1 の曲線
secp256k1 は有限体 F_p 上で定義されています。その曲線方程式は次のとおりです。
ここで、
つまり、点の座標は通常の実数ではなく、p を法とする整数です:
したがって、曲線上の点の集合は次のようになります:
ここで O は無限遠点であり、点の加法における零元と考えることができます。
2. 楕円曲線上の点の加法
楕円曲線上の点同士には、次のような「加法」を定義できます。
ただし、これは座標をそのまま足し合わせるものではありません。つまり、
楕円曲線群の規則に従って、曲線上の別の点を計算します。
次のように置きます。
P != Q の場合、まず傾きを計算します。
ここでの除算は p を法とした除算、つまり逆元を掛ける操作です。
続いて、
これにより、
が得られます。
P = Q の場合は点の倍加と呼ばれます。
ヒント:ここでの加法も楕円曲線上の加法であり、スカラー体上の加法ではないことに注意してください。
このときの傾きは、
となります。
secp256k1 の曲線は、
であり、ax の項が存在しないため、ここに追加の a はありません。
3. スカラー倍算
スカラー倍算とは、点の加法を繰り返すことです。
たとえば、
ウォレットにおいて最も重要な関係は次のとおりです。
ここで、
- d:秘密鍵となるスカラー
- G:secp256k1 で定められた基点
- Q:曲線上の点である公開鍵
秘密鍵 d から公開鍵 Q を計算することは高速ですが、公開鍵 Q から秘密鍵 d を逆算することは極めて困難です。これが楕円曲線離散対数問題です。
4. 基点 G と位数 n
G は secp256k1 規格で選定された生成点であり、基点とも呼ばれます。その位数は n であり、これは次のことを意味します。
また、
ここで n は 2^256 に近い大きな素数です。
secp256k1 には、次の重要な性質があります。
つまり、余因子は 1 です。そのため、G によって生成される位数 n の巡回群が、そのまま曲線全体の点群となります。
5. p と n の違い
ここで最も混同しやすいのが p と n です。
p は座標体の大きさです。
点の加法や点の倍加における座標計算は、すべて mod p で行われます。
n は基点 G の位数です。
秘密鍵、nonce、署名中の r/s などのスカラー計算は、すべて mod n で行われます。
したがって、次のように覚えられます。
- 点の座標計算:mod p
- スカラー計算:mod n
Ethereum ウォレットの秘密鍵は次の条件を満たします。
公開鍵は、
です。
署名時に使われる乱数、または決定論的 nonce k も次の条件を満たします。
この構造が、後述する ECDSA の署名式、公開鍵の復元、Ethereum アドレス生成における数学的基礎となります。
また、補足として私と Gemini の会話を見ることもできます(正直なところ、AI のおかげで学習速度がかなり上がりました
EOA ウォレットにおける署名と検証について
前回の記事で述べたように、EOA ウォレットを用いてアドレスの所有権を検証する必要がある場合、次のような流れになります。
-
SWIE に準拠したメッセージがフロントエンドからウォレットへ送られ、署名を要求します
-
このような署名要求をウォレットが受信すると、ユーザーに同意を求める確認画面が表示されます
-
ユーザーが確認すると、ウォレットの署名処理が開始されます
-
まず SIWE メッセージに対して keccak-256 を計算し、以降の計算に使用する 32 バイトのハッシュ を生成します
-
次に、ウォレットの秘密鍵 、secp256k1 の有限体 、規格で選定された基点 、そして の位数 を使用します。ウォレットは [1,n-1] の範囲内で乱数 を生成し、以降の検証計算を行います(ここで注意すべきなのは、重複しない利用可能な結果が の範囲内の [1,n-1] に限られるため、点の選択などの計算では mod n が使われる一方、secp256k1 全体の範囲に関する計算は、それ自体で規定された範囲 p、つまり mod p で行われることです
-
最終的に生成される署名は、実際には という3つの計算結果を連結したもので、それぞれ 32 バイト/32 バイト/1 バイトです。それぞれの計算内容は次のとおりです。
-
-
-
-
については、secp256k1 楕円曲線
において、 に対する解は、無限遠点 を除いても x 軸に関して対称な2つの解が存在します。 は 0/1 を指定することで、どちらの解を選ぶべきかを示す yParity です(もちろん secp256k1 では となる可能性もありますが、その確率は非常に低いため、EVM の実際の計算ではこのケースの復元は考慮されていません
-
-
こうして、ウォレットからサーバーへ返される最終的な署名 が生成されます
-
-
続いて、サーバーが受け取った を検証します。この時点でサーバーが把握しているのは、secp256k1 の基点 、ウォレットへ送信した SIWE メッセージとそれを keccak-256 で計算したハッシュ 、そしてウォレットから返された署名 です
-
ここからサーバー側の検証を開始します。
-
サーバーにはすでに / / / / があります。このデータから計算されたウォレットアドレスが、最初に受け取ったウォレットアドレスと一致するかを確認する必要があります。また、
(つまり、アドレスは公開鍵 に keccak-256 を適用して得られたハッシュの末尾20バイトです)という関係から、現在の目的は、既知の条件を用いて公開鍵 を計算することだと分かります
-
上記のデータに加えて、 の変換過程、つまりスカラー体上の整数演算も分かっています。
したがって、次のように変形することもできます。
次に楕円曲線上の点演算へ移り、上式の両辺を基点 でスカラー倍します。
同時に、公開鍵が 、 であること、そして であることが分かっています。 を使えば を復元できます。これにより、上式を既知の値だけで構成された公開鍵 の計算式へ変換できます。
こうして、計算によって署名元ウォレットの公開鍵 を求めることができます
-
続いて、求めた公開鍵 に keccak-256 を適用し、末尾20バイトを取得すれば、検証用のウォレットアドレスが得られます。このアドレスを事前に提示されたアドレスと比較し、両者が一致すれば、秘密鍵 を知ることなく、既存の情報だけを用いて現在のウォレットに対する制御権を検証できます。また、 は楕円曲線(mod n 上)における関係であり、 の計算結果(d は 、すなわち に近い大きな素数の範囲内にあります)には加算の繰り返しによって高速に到達できます。一方、Q から d を逆算することは、secp256k1 上の楕円曲線離散対数問題に該当します。現時点では、現実的な計算資源でこれを完了できる実用的なアルゴリズムは存在しません。一般的な攻撃の計算量はおよそ のオーダーであり、熱力学的に見れば、 回の計算は宇宙の全エネルギーを使い果たしても完了できないため、工学的には解くことが不可能です。
ヒント:実際の EVM における検証では、SIWE 情報内の domain/address/chainId なども検証します。ここでは主に数学的な仕組みを扱うため、それらについては省略します
-
-
これにより、サーバーとウォレットは署名、SIWE メッセージ、および定義済みの数学的情報だけを使用し、秘密鍵を公開することなくウォレットの所有権を確認できます
おわりに
以上が、ウォレットの署名と検証における数学的な証明のおおよその内容です。Google の量子コンピューティングの発展によって、もしかすると近いうちに変わってしまうかもしれませんが、まだかなり時間はあるはずなので、古典的な方式を学んでおいても問題はないでしょう(
以上、ウォレットの署名検証を工学的に実践するうえでの理論的基礎を補足する内容でした。
この記事が役に立ったときは、ぜひ他の人に共有してください!
一部の情報は古い可能性があります





