以下はあくまで筆者の現時点での理解を表すものです
========
だいたい前回の記事に対する理論的な補足で、一度の署名検証の流れと理論的な証明を整理したもの、ついでに群に関する知識も少し補いました(

前提知識: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 のときは、点の倍加と呼ばれます:
tips<注意が必要なのは>注意が必要なのは>、ここでの加法も同様に楕円曲線上の加法であり、スカラー体の加法ではないということです。
このとき傾きは:
secp256k1 の曲線は:
であり、ax 項がないため、ここには追加の a はありません。
3. スカラー倍算
スカラー倍算とは、点加法を繰り返すことです:
例えば:
ウォレットにおいて最も重要な関係は次の通りです:
ここで:
- d: 秘密鍵、1つのスカラー
- G: secp256k1 で規定された基点
- Q: 公開鍵、1つの曲線上の点
秘密鍵 d から公開鍵 Q を計算するのは高速ですが、公開鍵 Q から秘密鍵 d を逆算するのは極めて困難です。これが楕円曲線離散対数問題です。
4. 基点 G と位数 n
G は secp256k1 標準で選定された生成点であり、基点とも呼ばれます。その位数は n で、意味は次の通りです:
さらに:
ここで n は 2^256 に近い大きな素数です。
secp256k1 には重要な性質があります:
つまり cofactor が 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ウォレットでアドレスの所有権検証が必要になった場合、次のような流れになります:
-
SIWEに準拠したmessageがフロントエンドからウォレットへ送られ、署名を要求する
-
このような署名リクエストをウォレットが受け取ると、ユーザーに同意を求めるプロンプトが表示される
-
ユーザーが確認すると、この時点でウォレットの署名フローが始まる
-
まず SIWE message に対して keccak-256 を計算し、以降の計算に使う32-byte hash を得る
-
次に、ウォレットの秘密鍵 とsecp256k1の有限体 、標準で選定された基点 、および の位数 に対して、ウォレットは [1,n-1] の範囲内の乱数 を生成し、以降の検証計算を行う(ここで注意が必要なのは、n 内の [1,n-1] だけが利用可能な重複しない結果であるため、点を取るなどの計算では mod n が選ばれる一方、secp256k1 全体の範囲計算はその規定範囲 p で計算される、つまり mod p であるという点です
-
最終的に生成される署名は、実際には という3つの計算結果を連結したもので、それぞれ32-byte/32-byte/1-byteの内容です。それらの計算内容は:
-
-
-
-
は、secp256k1楕円曲線
において、 上の解は、無限遠点を除けば、x軸に対して対称な2つの解が存在するため、ここで0/1を提供することでどちらの解を選ぶべきかを指定する yParity です(もちろん、secp256k1 では となる可能性もありますが、確率が非常に小さいため、EVMの実際の計算ではこのケースの復元は考慮されていません
-
-
こうして、ウォレットがサーバーへ返す最終的な署名 が生成される
-
-
次に、サーバーは受け取った を検証する。この時点でサーバーが知っているのは、secp256k1 の基点 / ウォレットへ送信した SIWE message と、その keccak-256 によって計算された hash / ウォレットから返された署名
-
そしてサーバー側の検証が始まる:
-
サーバーにとって、現在すでに / / / / がある。この時点で、ここにあるデータから計算されたウォレットアドレスが、最初に受け取ったウォレットアドレスと同じかどうかを知る必要がある。そして
(つまり、アドレスは公開鍵 を keccak-256 で計算した結果の hash の後ろ20バイト)であることから、現在の目標は、今ある条件から公開鍵 を計算することだと分かる
-
この時点で、上述のデータ以外に分かっているのは、 の変換過程(スカラー体における整数計算)であり、すなわち
したがって、同様に次の変形を得られる:
そして計算は楕円曲線の点演算の領域に入り、上式の両辺に基点 を掛ける
同時に、公開鍵 、 であり、さらに であることが分かっている。そして によって を復元できる。これにより、上述の式を既知量だけで構成された公開鍵 の求解式に変換できる
こうして、計算によってこの署名ウォレットの公開鍵 が求められる
-
その後、求めた公開鍵 に対して keccak-256 を行い、末尾20バイトを取ることで、検証用のウォレットアドレスを得られる。そしてこのアドレスを事前に提供されたアドレスと比較し、両者が同じであれば、秘密鍵 を知ることなく、既存の情報だけに基づいて現在のウォレットの制御権を検証できる。同時に、 は楕円曲線(mod n 下)として、(d は ( に近い大きな素数)の中にある)の計算結果には累加法によって高速に到達できる一方、Q から d を逆算することは secp256k1 上の楕円曲線離散対数問題に属する。現在、現実的なリソース内で完了できる実行可能なアルゴリズムは存在しない<汎用攻撃の計算量はおよそ>汎用攻撃の計算量はおよそ> レベルであり、熱力学によれば、 の計算は宇宙の全エネルギーを使い切っても不可能であるため、工学的には解けないものとなる。
tips:実際のEVM検証では、SIWE情報内部のdomain/address/chainIdなどの検証もありますが、ここでは主に数学的な実装について議論しているため、それらは省略します
-
-
これにより、サーバーとウォレットの間では、署名とSIWE message、そしていくつか定義済みの数学的情報だけを用い、秘密鍵を公開することなく、ウォレット所有権の確認が完了する
結び
以上が、おおよそ一度のウォレット署名と検証における数学的な証明です。もっとも、googleの量子計算における発展によって、近いうちに変わるかもしれませんが、まだそれなりに時間はあるはずなので、古典的なものを学んでおいても問題ないでしょう(
以上、ウォレット署名検証のエンジニアリング実践における理論的基礎への補足、という感じです。
この記事が役に立ったときは、ぜひ他の人に共有してください!
一部の情報は古い可能性があります






