Mastering Ethereum追加解説1(BLS Digital Signatures)
Mastering Ethereum 第2版 第4章 Cryptography で躓いた BLS 署名を“素人向け”に解きほぐす
日付: 2025年12月15日
学習内容: Mastering Ethereum(第2版)第4章 Cryptography の学習中に詰まった BLS Digital Signatures(BLS12-381 / ペアリング / 集約署名 /
1. 学習の背景と目的
1.1 背景:なぜ BLS で詰まったのか
Ethereum を学んでいると「署名」と言えば ECDSA がまず出てきますが、PoS(Beacon Chain)では BLS 署名が登場します。Mastering Ethereum 第4章でも暗号の流れの中で BLS が出てくるのですが、ここで自分は次の点で理解が止まりました。
-
見慣れない数学が一気に増える
- 楕円曲線の式
y^2=x^3+4 -
0x1a0111ea...のような 115 桁級の巨大な法(modulus) -
0x73eda753...のような別の巨大な数(位数 )r - ペアリング
という新しい道具e(\cdot,\cdot)
- 楕円曲線の式
-
“何がどこで mod されているのか” が混乱する
- 座標の mod と、秘密鍵(スカラー)の mod が別物
-
検証式・集約式が一見すると魔法
- なぜ
が検証になるのかe(g_1,\sigma)=e(pk,H(m)) - なぜ
を足すだけで集約できるのか\sigma
- なぜ
この混乱を解くために、理解した内容を 背景付きで“読める文章”に再構成したものです。
1.2 この記事のゴール
読み終わった時に、次が腹落ちしている状態を目指します。
0x1a0111ea...( )とq 0x73eda753...( )の役割の違いr - BLS の鍵・署名・検証が、何の性質(双線形性)で成立するか
- 集約署名が“足し算だけ”で成り立つ理由
- Ethereum PoS で BLS を使う実務上の意味(大量署名の圧縮)
2. まず超入門:mod(剰余)とは何か
**mod(モジュロ)**は「余りだけを気にして、同じ余りの数を同一視する」という約束です。
例:mod 7 の世界では、
15 \equiv 1 \pmod 7 -1 \equiv 6 \pmod 7
のように、7で割った余りが同じなら同じ数として扱います。直感的には「7時間制の時計」です。
3. 一番大事:BLS12-381 には “2つの巨大な数” が出てくる
3.1 q (115桁級)は「座標の世界の法」
楕円曲線の式
ここでの
-
(基礎体の法):q
0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab
この数字が表しているのは、難しいことではなく、
- 「点の座標
を計算するときに、結果は全部 modx,y で丸める」q
というルールそのものです。
3.2 r (77桁級)は「秘密鍵(スカラー)の世界の法」
一方で、秘密鍵
Ethereum の資料でよく見る
-
(スカラー体の法):r
0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
ここが重要で、
-
: 座標q を計算する “盤面” の大きさx,y -
: 暗号で使う “ループの長さ(部分群の位数)”r
という 役割分担があります。
3.4 なぜ q と r は “別の素数” なのか
ここもつまずきポイントなので、結論から書きます:
-
とq は、そもそも “割り算で閉じた世界” の対象が違う(役割が違う)ため、別の素数になるのが自然です。r
もう少し丁寧に分けると、理由は大きく3つあります。
理由1:q は「座標を計算する世界」、r は「点を何回足すか(スカラー)の世界」
-
はq の法で、曲線点の座標\mathbb{F}_q の足し算・掛け算・逆数などは modx,y で行います。q -
はr の法で、秘密鍵\mathbb{F}_r や「何倍するか」の係数は modsk で扱います。r
つまり、同じ“mod”でも対象が違い、同じ素数を使う必然性がありません。
理由2:安全に使うために「素数位数 r の部分群」を切り出す必要がある
楕円曲線上の点の集合
のように「大きな素数
暗号で使う
こうしておかないと、小さい位数の部分に落とし込む攻撃(いわゆる小さい部分群関連の問題)が起きやすくなります。
この構造上、
理由3:ペアリングが必要な “ペアリングフレンドリー曲線” の設計上、q と r は別に選ばれる
BLS 署名はペアリング
このペアリングが高速に計算でき、かつ安全になるように、曲線は「特別な数論条件」を満たすように設計されています。
代表的には(詳細は覚えなくてOKですが)、
-
がr を割る(埋め込み次数q^k - 1 という概念が出てくる)k
のような条件があり、BLS12-381 では名前の通り
こうした条件を満たすために、
3.3 なぜ秘密鍵は 1 〜r-1 から選ぶの?
秘密鍵
から選べますが、0だけは避けます。なぜなら
-
でpk = sk \cdot g_1 だとsk=0 が “ゼロ点”(無限遠点)になり、鍵として意味がないpk -
も 0 になってしまい、署名として意味がない\sigma = sk \cdot H(m)
からです。なので実装ではふつう
の一様ランダムが使われます。
4. このメモの流儀(重要):pk は G1、署名 σ は G2
ここから先は、次の配置に統一して説明します(この記事で扱う流儀)。
- 生成元
g_1 \in G_1 - 公開鍵
pk = sk \cdot g_1 \in G_1 - ハッシュ
(メッセージをH: \{0,1\}^* \to G_2 の点にする)G_2 - 署名
\sigma = sk \cdot H(m) \in G_2 - ペアリング
e: G_1 \times G_2 \to G_T
「なんで署名が
4.1 公開鍵 pk は「点」であり、座標 (x,y) はその表現の1つ
公開鍵
-
(ただしpk = (x,y) )x,y \in \mathbb{F}_q
のように表せます。
ただし 実装でネットワークに載せたりファイルに保存したりするとき、毎回
-
概念(数学): 公開鍵 = 点
(必要ならpk で書ける)(x,y) -
実装(バイト列): 公開鍵 = 点をルールに従ってエンコードしたバイト列
- 典型的には 圧縮形式(例:
とx の符号ビット等)で表現し、サイズを小さくしますy
- 典型的には 圧縮形式(例:
このため、「
- 数学的には「公開鍵は点(座標はその表示方法)」
- 実装的には「仕様で定められたシリアライズ(エンコード)形式が公開鍵」
になります。
4.2 生成元 g_1 とは何か(sk=1 のときの公開鍵と同じ?)
公開鍵は
- たしかに
ならsk=1 pk = 1 \cdot g_1 = g_1
となります。したがって「
ただし本質は、
-
は「秘密鍵から導くもの」ではなく、最初から固定で与えられる点g_1 - その点を
回足したもの(スカラー倍)が公開鍵になるsk
という関係です。
5. BLS 検証式が成立する理由(式変形を省略しない)
検証でチェックしたいのは、「この
5.0 署名・検証で “実際に何をやり取りするか”
ここが一番イメージしづらい所なので、先に入出力を書きます。
-
署名者(秘密鍵所有者)が持っているもの
- 秘密鍵
sk - 生成元
(固定)g_1 - ハッシュ関数(hash-to-curve)
H(\cdot)
- 秘密鍵
-
署名者が受け取るもの
- メッセージ
(署名したい内容)m
- メッセージ
-
署名者が計算するもの(署名の生成)
-
を計算(メッセージを曲線上の点に写す)H(m) \in G_2 -
を計算\sigma = sk \cdot H(m) \in G_2
-
-
署名者が外部へ渡すもの(最低限)
- メッセージ
m - 署名
(点をエンコードしたバイト列)\sigma - 公開鍵
(相手が既に知っている/登録済みなら省略できる)pk
- メッセージ
-
検証者が計算するもの(検証)
- 公開鍵が必要なら
を受け取る(または事前に取得)pk - 自分でも
を計算H(m) \in G_2 - ペアリングを2回計算して比較する:
- 左辺:
e(g_1,\sigma) - 右辺:
e(pk,H(m)) - 一致すれば「
を知る人が作った署名」と判断sk
- 左辺:
- 公開鍵が必要なら
ここで重要なのは、検証者は 秘密鍵
代わりに「ペアリングを使うと、
5.0.1 おもちゃの数で「本当に計算してみる」例(手計算できるサイズ)
本物のBLS12-381は桁が大きすぎて手計算が不可能なので、仕組みだけ同じになるように **小さい数で作った“おもちゃ例”**を使います(※安全性はありません)。
おもちゃ設定
- スカラーの世界(秘密鍵など)は位数
の世界(r=7 )で考える0..6 - ペアリングの出力側は mod
の乗法群の中の「位数7の部分」を使うp=29 - 位数7の元として
を採用(g=7 )7^7 \equiv 1 \pmod{29}
- 位数7の元として
おもちゃのペアリングを次で定義します:
ここで
署名者がやること(入力:m 、出力:\sigma )
- 固定の生成元を
とします(おもちゃなのでg_1=1 の生成元を “1” と見なす)。G_1 - 秘密鍵を
(本当はsk=3 からランダム)とします。1..r-1 - メッセージ
をハッシュしてm にする(おもちゃなので「H(m)=2 」と決め打ち)。m \mapsto 2
公開鍵:
署名:
署名者が検証者に渡す情報は(最低限):
- メッセージ
m - 署名
\sigma=6 - 公開鍵
(検証者が事前に知っていれば不要)pk=3
検証者がやること(受け取った m,\sigma,pk で検証)
検証者も同じハッシュを使って
左辺:
右辺:
左右が一致(
重要なのは、検証者は
まとめると、署名者は「
を使って sk を作る」だけ、検証者は「 \sigma から同じ m を作り、ペアリングの等式が成立するか見る」だけです。 H(m)
5.1 鍵と署名の定義(もう一度)
5.2 使うのは“双線形性”だけ
ペアリングには次が成り立ちます:
特に重要なのがこの形です:
(両辺とも
5.2.0 直感:「足し算が積に分かれる」ってどういうこと?
記事の後半で使う
e(P_1+P_2, Q) = e(P_1, Q)\cdot e(P_2, Q) e(P, Q_1+Q_2) = e(P, Q_1)\cdot e(P, Q_2)
という性質は、言葉だけだと不思議に見えます。直感のコアはこれです:
ペアリングは「点(足し算の世界)」を「指数(掛け算の世界)」へ写しているので、
“足し算” が “掛け算” に変わって見える。
まず、おもちゃ例で一発で見る
おもちゃ例では
でした。ここで
指数の分配で
そして指数の基本法則
つまり
になります。これが「足し算が積に分かれる」の正体です。
本物のペアリングでも“やっていることの型”は同じ
本物のBLS12-381では式はもっと複雑ですが、性質として
-
(P \mapsto e(P,Q) を固定したとき)Q -
(Q \mapsto e(P,Q) を固定したとき)P
がそれぞれ **群の準同型(homomorphism)**になっています。
超ざっくり言うと、
- 点の世界(
)では演算は「足し算」G_1,G_2 - 出力の世界(
)では演算は「掛け算」G_T
なので、準同型として “足し算が掛け算に写る” 形になり、
が成り立ちます(BLSの集約署名は、まさにこの性質に依存します)。
5.2.1 本物のペアリング e(P,Q) はどう定義されるのか(BLS12-381の概観)
おもちゃ例では
まず前提:どこからどこへの写像か
BLS12-381 では
で、
-
は楕円曲線G_1 上の 素数位数E/\mathbb{F}_q の部分群r -
は同じ曲線の **ねじれ(twist)**を使ってG_2 上に持ち上げた点の素数位数\mathbb{F}_{q^2} の部分群r -
は拡大体G_T の乗法群の中の位数\mathbb{F}_{q^{12}} の部分(概念的には「位数r の循環群」)r
という関係にあります(BLS12-381 の “12” はこの
直感:G_T は「ペアリングの結果が入る“別の箱”」だと思えばOK
素人目線で一番大事なのは、
の結果が属する先(出力の箱)e(P,Q) - その箱の中で 掛け算とべき乗ができる
- しかも
のような 双線形性が成り立つe(aP,Q)=e(P,Q)^a
という役割です。
おもちゃ例に対応させると、
- おもちゃ例の
は「modG_T の乗法群(p の掛け算世界)」の一部でした1..p-1 - 本物のBLS12-381の
は「拡大体G_T の乗法群」の一部です\mathbb{F}_{q^{12}}
つまり
もう一つの言い方をすると、
-
(点の世界)での “足し算・スカラー倍” の関係をG_1,G_2 -
(数の世界)での “掛け算・べき乗” の関係として保存するG_T
ための中継地点です。BLSの検証式は、まさにこの対応関係(双線形性)だけを使っています。
定義の中身(概念):Miller関数 → 最終べき乗
本物のペアリングは、ざっくり言うと
-
Miller loop で「ある有理関数の値」を計算して
を得るf \in \mathbb{F}_{q^{12}}^* - **final exponentiation(最終べき乗)**で
を計算して、値を位数f^{(q^{12}-1)/r} の世界r に“正規化”するG_T
という2段階で定義されます。
数式としては(詳細を隠して書くと)次の形だと思ってよいです:
ここで
実装でよく聞く言い方:optimal ate pairing
実装の説明では、BLS12-381 のペアリングは多くの場合
- optimal ate pairing(最適Ateペアリング)
と呼ばれ、実際の計算は
- Miller loop(曲線パラメータに由来する回数だけ反復)
- final exponentiation(
を利用して効率化)q^{12}-1
で行われます。
この記事では「どう計算するか(アルゴリズム詳細)」よりも、「こう定義された
が双線形性を満たすので BLS の検証・集約が動く」ことが重要、という位置づけです。 e
5.3 検証式
BLS の検証は次です:
左辺に署名を代入:
双線形性で指数(
右辺に公開鍵を代入:
同じく双線形性で:
左辺も右辺も 同じ
つまり検証は「秘密鍵
6. 集約署名が“足し算だけ”で成り立つ理由
Ethereum PoS で BLS が重要な理由はここです。attestation などで「同じ内容に多人数が署名」するので、署名をまとめられると強いです。
6.1 まず定義:集約する
同じメッセージ
集約公開鍵と集約署名を “足し算” で作ります:
6.2 検証式(集約版)
検証したい式はこれです:
右辺・左辺が同じになることを示します。
左辺:
ペアリングは “足し算が積に分かれる” 性質があるので:
各
右辺も同様に:
各
左右とも同じ値になり、検証できます。
6.3 直感(数式の意味)
集約が効くのは、BLS が「署名が点で、点の足し算が自然に定義されている」からです。
- 署名は
\sigma_i = sk_i H(m) - それを足すと
と同じ形になる\sigma_{\mathrm{agg}} = (\sum sk_i)H(m)
この「足すだけで、秘密鍵を足したのと同じ効果になる」性質が、PoS の大量署名にハマります。
7. PoS での “意味” に戻る(なぜ BLS なのか)
PoS(Beacon Chain)では、ブロック提案・attestation・sync committee などで 大量の署名が発生します。
- もし署名が 1 人 1 本のままだと、ブロックが署名だらけになって帯域・検証コストが増える
- BLS なら、多数の署名を 集約して 1 本として扱える
つまり BLS は「数学がオシャレだから」ではなく、プロトコルが要求する“スケール”に直結する道具です。
8. つまずきポイントチェックリスト(自分用メモ)
-
0x1a0111ea...は 座標の法 (q )\mathbb{F}_q -
0x73eda753...は スカラーの法 (r )\mathbb{F}_r - 秘密鍵は
(0はダメ)1..r-1 - この流儀では
、pk\in G_1 、\sigma\in G_2 H(m)\in G_2 - 検証は 双線形性で両辺が同じ
に揃うe(g_1,H(m))^{sk} - 集約は「点の足し算」と「ペアリングが積に分かれる」性質で成立する
Discussion