mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
2939 文字
8 分
EOAウォレットの署名検証とその関連内容について
2026-06-10

以下はあくまで筆者の現時点での理解を表すものです

========

だいたい前回の記事に対する理論的な補足で、一度の署名検証の流れと理論的な証明を整理したもの、ついでに群に関する知識も少し補いました(

dreaife.tokyo
EOA向けのEVMウォレットログイン画面
EVM/EOAウォレットログインの実装例をもとに、connect wallet、SIWE形式メッセージ、wagmi署名、nonce、バックエンド検証を整理し、アドレス接続と署名による所有権証明を分ける理由を解説します。
dreaife.tokyo/jp/posts/evm-wallet-login/

前提知識:secp256k1、有限体と楕円曲線上の点演算#

剰余演算と楕円曲線の点演算が大量に関わるので、少し前提知識を用意しました(ついでに自分で補った内容も載せていますwww。もちろん、すでに知っている場合は読み飛ばしても大丈夫です。

前提知識

Ethereum ウォレットの署名では ECDSA が使われており、基礎となる曲線は secp256k1 です。r/s/v、公開鍵復元、アドレス生成を理解する前に、まず次の3つの対象を理解する必要があります:

  • 有限体 F_p
  • 楕円曲線点群 E(F_p)
  • 基点 G とその位数 n

1. secp256k1 の曲線#

secp256k1 は有限体 F_p 上で定義されます。その曲線方程式は次の通りです:

y2x3+7(modp)y^2 \equiv x^3 + 7 \pmod p

ここで:

p=2256232977p = 2^{256} - 2^{32} - 977

つまり、点の座標は通常の実数ではなく、p を法とする整数です:x,yFpx, y \in \mathbb{F}_p

したがって、曲線上の点集合は次のようになります:E(Fp)={(x,y)y2x3+7(modp)}{O}E(\mathbb{F}_p) = \{(x,y) \mid y^2 \equiv x^3 + 7 \pmod p\} \cup \{O\}

ここでの O は無限遠点であり、点加法における零元と理解できます。

2. 楕円曲線上の点加法#

楕円曲線上の点同士には、ある種の「加法」を定義できます:

P+Q=RP + Q = R

注意すべきなのは、これは座標をそのまま足すことではないという点です。つまり:

(x1,y1)+(x2,y2)(x1+x2,y1+y2)(x_1, y_1) + (x_2, y_2) \neq (x_1 + x_2, y_1 + y_2)

そうではなく、楕円曲線群の規則に従って、曲線上の別の点を計算します。

次のようにおきます:

P=(x1,y1),Q=(x2,y2)P = (x_1, y_1), \quad Q = (x_2, y_2)

P != Q のとき、まず傾きを計算します:

λy2y1x2x1(modp)\lambda \equiv \frac{y_2 - y_1}{x_2 - x_1} \pmod p

ここでの除算は p を法とした除算、つまり剰余における逆元を掛けることです。

そして:

x3λ2x1x2(modp)y3λ(x1x3)y1(modp) x_3 \equiv \lambda^2 - x_1 - x_2 \pmod p \\y_3 \equiv \lambda(x_1 - x_3) - y_1 \pmod p

これにより:

P+Q=(x3,y3)P + Q = (x_3, y_3)

P = Q のときは、点の倍加と呼ばれます:

2P=P+P2P = P + P

tips<注意が必要なのは>、ここでの加法も同様に楕円曲線上の加法であり、スカラー体の加法ではないということです。

このとき傾きは:

λ3x122y1(modp)\lambda \equiv \frac{3x_1^2}{2y_1} \pmod p

secp256k1 の曲線は:

y2=x3+7y^2 = x^3 + 7

であり、ax 項がないため、ここには追加の a はありません。

3. スカラー倍算#

スカラー倍算とは、点加法を繰り返すことです:

[k]P=P+P++Pk times[k]P = \underbrace{P + P + \cdots + P}_{k \text{ times}}

例えば:

[3]P=P+P+P[3]P = P + P + P

ウォレットにおいて最も重要な関係は次の通りです:

Q=[d]GQ = [d]G

ここで:

  • d: 秘密鍵、1つのスカラー
  • G: secp256k1 で規定された基点
  • Q: 公開鍵、1つの曲線上の点

秘密鍵 d から公開鍵 Q を計算するのは高速ですが、公開鍵 Q から秘密鍵 d を逆算するのは極めて困難です。これが楕円曲線離散対数問題です。

4. 基点 G と位数 n#

G は secp256k1 標準で選定された生成点であり、基点とも呼ばれます。その位数は n で、意味は次の通りです:

[n]G=O[n]G = O

さらに:

G={O,G,[2]G,[3]G,,[n1]G}\langle G \rangle = \{O, G, [2]G, [3]G, \ldots, [n-1]G\}

ここで n2^256 に近い大きな素数です。

secp256k1 には重要な性質があります:

h=1h = 1

つまり cofactor が 1 です。したがって、G によって生成される位数 n の巡回群が、曲線全体の点群になります:

#E(Fp)=n\#E(\mathbb{F}_p) = n

5. p と n の違い#

ここで最も混同しやすいのが pn です。

p は座標体の大きさです:

x,y(modp)x, y \pmod p

点加法や点の倍加における座標計算はすべて mod p の下で行われます。

n は基点 G の位数です:

[n]G=O[n]G = O

秘密鍵、nonce、署名内の r/s などのスカラー計算はすべて mod n の下で行われます。

そのため、次のように覚えられます:

  • 点座標の計算:mod p
  • スカラー計算:mod n

Ethereum ウォレットにおける秘密鍵は次を満たします:

1dn11 \le d \le n-1

公開鍵は:

Q=[d]GQ = [d]G

署名時の乱数または決定的 nonce k も次を満たします:

1kn11 \le k \le n-1

この構造が、後続の ECDSA 署名式、公開鍵復元、Ethereum アドレス生成の数学的基礎になります。

あるいは、補足として私とgeminiの会話を見てもよいです(正直、aiがあると学習速度がかなり加速します

Gemini
‎Gemini - direct access to Google AI
Created with Gemini
gemini.google.com/share/f72d7ecbcf76

EOAウォレットの署名と検証について#

前回の記事で述べた通り、EOAウォレットでアドレスの所有権検証が必要になった場合、次のような流れになります:

  1. SIWEに準拠したmessageがフロントエンドからウォレットへ送られ、署名を要求する

  2. このような署名リクエストをウォレットが受け取ると、ユーザーに同意を求めるプロンプトが表示される

  3. ユーザーが確認すると、この時点でウォレットの署名フローが始まる

    • まず SIWE message に対して keccak-256 を計算し、以降の計算に使う32-byte hash ee を得る

    • 次に、ウォレットの秘密鍵 ddsecp256k1の有限体 pp、標準で選定された基点 GG、および GG の位数 nn に対して、ウォレットは [1,n-1] の範囲内の乱数 kk を生成し、以降の検証計算を行う(ここで注意が必要なのは、n 内の [1,n-1] だけが利用可能な重複しない結果であるため、点を取るなどの計算では mod n が選ばれる一方、secp256k1 全体の範囲計算はその規定範囲 p で計算される、つまり mod p であるという点です

    • 最終的に生成される署名は、実際には r/s/vr/s/v という3つの計算結果を連結したもので、それぞれ32-byte/32-byte/1-byteの内容です。それらの計算内容は:

      • R=kG=(Rx,Ry)R = kG = (R_{x}, R_{y})

      • r=Rxmodnr = R_{x} \bmod n

      • s=k1(z+rd)modns = k^{-1} * (z + r * d) \bmod n

      • vv は、secp256k1楕円曲線

        y2=x3+7modpy^2 = x^3 + 7 \bmod p

        において、x=Rxx=R_x 上の解は、無限遠点00を除けば、x軸に対して対称な2つの解が存在するため、ここで0/1を提供することでどちらの解を選ぶべきかを指定する yParity です(もちろん、secp256k1 では r+n<pr+n<p となる可能性もありますが、確率が非常に小さいため、EVMの実際の計算ではこのケースの復元は考慮されていません

    • こうして、ウォレットがサーバーへ返す最終的な署名 r/s/vr/s/v が生成される

  4. 次に、サーバーは受け取った r/s/vr/s/v を検証する。この時点でサーバーが知っているのは、secp256k1 の基点 GG / ウォレットへ送信した SIWE message と、その keccak-256 によって計算された hash ee / ウォレットから返された署名 r/s/vr/s/v

  5. そしてサーバー側の検証が始まる:

    • サーバーにとって、現在すでに GG / ee / rr / ss / vv がある。この時点で、ここにあるデータから計算されたウォレットアドレスが、最初に受け取ったウォレットアドレスと同じかどうかを知る必要がある。そして

      address=keccak256(QxQy)[12:32]address = keccak256(Q_x || Q_y)[12:32]

      (つまり、アドレスは公開鍵 QQ を keccak-256 で計算した結果の hash の後ろ20バイト)であることから、現在の目標は、今ある条件から公開鍵 QQ を計算することだと分かる

    • この時点で、上述のデータ以外に分かっているのは、ss の変換過程(スカラー体における整数計算)であり、すなわち

      s=k1(z+rd)modns = k^{-1} * (z + r * d) \bmod n

      したがって、同様に次の変形を得られる:

      d=r1(skz)modnd = r^{-1} * (s*k - z) \bmod n

      そして計算は楕円曲線の点演算の領域に入り、上式の両辺に基点 GG を掛ける

      dG=(r1(skz)modn)G=r1(skGeG)\begin{align} dG &= \left(r^{-1}(sk - z) \bmod n\right)G \\ &= r^{-1}(skG - eG) \end{align}

      同時に、公開鍵 Q=dGQ = dGR=kGR=kG であり、さらに r=Rxr=R_x であることが分かっている。そして vv によって RR を復元できる。これにより、上述の式を既知量だけで構成された公開鍵 QQ の求解式に変換できる

      Q=r1(sReG)Q = r^{-1}(sR - eG)

      こうして、計算によってこの署名ウォレットの公開鍵 QQ が求められる

    • その後、求めた公開鍵 QQ に対して keccak-256 を行い、末尾20バイトを取ることで、検証用のウォレットアドレスを得られる。そしてこのアドレスを事前に提供されたアドレスと比較し、両者が同じであれば、秘密鍵 dd を知ることなく、既存の情報だけに基づいて現在のウォレットの制御権を検証できる。同時に、Q=dGmodnQ=dG \bmod n は楕円曲線(mod n 下)として、dGdG(d は nn22562^{256} に近い大きな素数)の中にある)の計算結果には累加法によって高速に到達できる一方、Q から d を逆算することは secp256k1 上の楕円曲線離散対数問題に属する。現在、現実的なリソース内で完了できる実行可能なアルゴリズムは存在しない<汎用攻撃の計算量はおよそ> 21282^{128} レベルであり、熱力学によれば、22562^{256} の計算は宇宙の全エネルギーを使い切っても不可能であるため、工学的には解けないものとなる。

      tips:実際のEVM検証では、SIWE情報内部のdomain/address/chainIdなどの検証もありますが、ここでは主に数学的な実装について議論しているため、それらは省略します

  6. これにより、サーバーとウォレットの間では、署名とSIWE message、そしていくつか定義済みの数学的情報だけを用い、秘密鍵を公開することなく、ウォレット所有権の確認が完了する

結び#

以上が、おおよそ一度のウォレット署名と検証における数学的な証明です。もっとも、googleの量子計算における発展によって、近いうちに変わるかもしれませんが、まだそれなりに時間はあるはずなので、古典的なものを学んでおいても問題ないでしょう(

以上、ウォレット署名検証のエンジニアリング実践における理論的基礎への補足、という感じです。

共有

この記事が役に立ったときは、ぜひ他の人に共有してください!

EOAウォレットの署名検証とその関連内容について
https://dreaife.tokyo/jp/posts/eoa-sign-verify/
著者
dreaife
公開日
2026-06-10
ライセンス
CC BY-NC-SA 4.0

一部の情報は古い可能性があります

関連した投稿 スマート
1
EOA向けのEVMウォレットログイン画面
WEB3 EVM/EOAウォレットログインの実装例をもとに、connect wallet、SIWE形式メッセージ、wagmi署名、nonce、バックエンド検証を整理し、アドレス接続と署名による所有権証明を分ける理由を解説します。
2
ブロックチェーン入門
WEB3 ブロックチェーンは、時系列に連結されたブロックで構成される構造で、分散性、改ざん耐性、透明性、安全性といった中核的な特性を持ちます。仕組みとしては、取引の生成、検証、パッケージ化、チェーンへの追加が含まれます。暗号資産、サプライチェーン管理、金融サービスなどで活用されますが、拡張性、消費電力、ユーザー教育といった課題もあります。基盤となるロジックは分散台帳とコンセンサス機構に基づき、データの安全性と整合性を保証します。
3
トレード記録
WEB3 最近のトレード経験では比較的高い勝率を維持しており、特に2月3日のショートで大きな利益を得ました。判断ミスによって一部利益を失った場面はあったものの、全体としてはプラス収益です。現在の市場はレンジ相場で、短期的には二度目のテストが来る可能性があるため慎重な対応が必要です。トレード戦略は主にローソク足と出来高を基準とし、資金配分は80%を低レバの大局トレード、10%を高レバ高頻度トレード、残りをオンチェーン操作に充てています。感情的な売買を避けるため、判断が不明確なときはノーポジションを選び、キャッシュフローが安定してから高リスク運用を行うことを勧めています。
4
新時代の第一回選考
life この記事では、AIが急速に発展する中で、先進的なモデルを利用するコストが新たな社会的選別の重要な要因になることを考察しています。著者は、モデル利用料金の上昇によってデジタルデバイドが生じる可能性への不安を述べ、利用料金が現在の補助的な価格からより高い水準へ引き上げられた場合、一般ユーザーには負担が難しくなり、技術利用における階層分化が形成される可能性があると指摘しています。また、AIがセキュリティ、動画、音楽などの分野で多様に活用されていることを振り返り、AIがコーディングツールからより幅広い産業へ浸透しつつあることを強調しています。著者は個人的な視点から、限られた資本の中で時代の波をどのように模索しながら前進していくかを述べ、技術コストが一般利用に与える影響に注目するよう呼びかけています。キーワード:AIモデルコスト、デジタルデバイド、技術的選別、AI活用、時代への不安。
5
ブログ移行-Mizuki設定記録
infra notionNextからmizukiへの移行過程の記録、主な理由はnotionNextの制限です。mizukiを選んだ理由は、軽量で機能のバランスが良く、日記とプロジェクトの表示をサポートしているからです。設定プロセスは簡単で、内容はmdとtsファイルによって制御され、同時にbangumi APIとの接続も実現しています。CIを用いてNotionのコンテンツを同期する計画を立て、多言語対応を進め、画像リンクの有効期限切れの問題を解決しました。

目次