本稿について
本稿では、DFINITY White Paper:Consensus Systemのうち第7章「DECENTRALIZED RANDOMNESS BEACON」の7.2「The BLS signature scheme」と7.3「Randomness Generation」の日本語訳を掲載します。
本章は数学的な表記が多く、やや表記に慣れていないと読み解くのが難しくなっています。しかし、単に文中に注を入れていくと冗長になるため、節が終わるごとに数学的表記を噛み砕いて平易な文章(緑字)に直した注記をまとめて入れるようにします。
また、今回の翻訳範囲に一部表記不能な文字があるため、記事中では以下のように表記を置き換えます。
原文はこちらになります。
スポンサードサーチ
7 非中央集権型ランダムビーコン(続き)
7.2 BLS署名スキーム
ユニークかつノンインタラクティブな署名スキームの閾値版があって、なおかつ実用的で効率的なDKGを考慮しているものとして唯一知られている署名スキームは、BLSから派生したペアリングベースのスキームである[3]。BLSは2003年にBoneh、Lynn、Shachamが紹介したもので、それに関連する研究は[10]で確認できる。全体を通してオリジナルのBLSを利用するものとする。
7.2.1 BLS関数(BLS functions)
秘密鍵と公開鍵のペア(sk, pk)が生成済みであるとして、BLSは以下の関数を提供する。
(1)Sign(m, sk):秘密鍵skを使ってメッセージmに署名し、署名σを返す
(2)Verify(m, pk, σ):メッセージmについての署名σを公開鍵pkに対して検証し、trueまたはfalseを返す
内部では、BLSは値が単元群csGTのものであるような適当な楕円曲線上の点からなる巡回部分群csG1並びにcsG2との間の非退化な双線型ペアリング写像e:csG1 × csG2 → csGTを使う。本ホワイトペーパーでは、全ての群を乗法群として書くものとする。それぞれの群について、任意の生成器g1 ∈ csG1、g2 ∈ csG2、gT ∈ csGTを定める。また、値がcsG1のものであるようなハッシュ関数H1:{0, 1}∗ → csG1を仮定する。
秘密鍵はスカラーであり、公開鍵はcsG2の元、署名はcsG1の元である。関数Sign(m, sk)はH1(m)skを計算し、Verify(m, pk, σ)はe(σ, g2) = e(H1(m), pk)であるか否かを検査する。
(筆者注)
- BLSは値が単元群csGTのものであるような適当な楕円曲線上の点からなる巡回部分群csG1並びにcsG2との間の非退化な双線型ペアリング写像e:csG1 × csG2 → csGTを使う。本ホワイトペーパーでは、全ての群を乗法群として書くものとする。
- 後ろの文の乗法群であるとは、数の集合で掛け算だけを考えるもの、ということ。 以下、乗法群を前提として、その前文を読んでみる。
- 値が単元群(group of units)のものであるような ⇒ 2つのものを掛け合わせる演算において、逆数を持つような値の集まりである、ということ。
- 楕円曲線上の点からなる巡回部分群csG1並びにcsG2 ⇒ 楕円曲線上の点の集まりのうちから、1つの数gの整数倍であるような数の集合(g, g1, g2, g3, ...)を作って、さらにそこからいくつか数をピックアップして作った群csG1とcsG2を考える、ということ。
- 非退化(non-degenerate)な双線型ペアリング(bilinear pairing)
- まずペアリングは、2つの入力をもとに1つの出力を作るイメージ。ここではcsG1の値とcsG2の値を入力としてある決まりに従って処理して、csGTを出力する。
- 非退化は、csG1の値とcsG2の値がともに1でないならば、そのペアリング結果も1ではないということ。
- 双線型は、csG1の値の整数乗(uaとする)とcsG2の値の整数乗(vbとする)をもとにペアリングをすると、整数倍する前の値をもとにペアリングした結果e(u, v)を2つの整数を足し合わせた分のべき乗(e(u, v)ab)になるということ。
- ものすごく簡単にすると、楕円曲線上の点から何らかの値のべき乗を集めて2つの集合を作る。その2つの集合からそれぞれ1つずつ1以外の数値を選んで処理を行うと、1にもならず、べき乗の計算が楽で、なおかつ逆数を持つ数字が出てくるような処理を考える、ということ。
- スカラーは実数のようなもの。
7.2.2 閾値BLS(Threshold BLS)
BLSの閾値版をTBLSと呼ぶ。BLSで定義されたSign関数・Verify関数と全く同じ関数をTBLSにおける鍵/署名のシェアと群の鍵/署名についても適用する。(t, n)-DKGにおける全ての参加パーティは1, ..., nの番号が振られているものと仮定する。7.1.4で示したようにDKGを実行したあと、(t, n)-TBLSはさらに次の関数を提供する。
(1)Recover(i1, ...,it , σi1, ...,σit ):署名のシェアσij, j = 1, ..., tから群の署名σを復元する。ここで、σijはパーティij ∈ {1, ... ,n}により提供されるものとする。
ユニーク性という特性のお陰で、Recover関数のアウトプットは、インプットとして使われるt個のシェアが群のいずれからのものであるかに依存しない。Recover関数はcsG1の点について「ラグランジュ補間」を計算する。Recover関数が成功するにはインデックスi1, ...,itは互いに異なっていなければならない。
7.3 ランダム性の生成
ランダム性の生成は、次のa、bのプロセスからなる。a)ワンタイムのセットアップで、そこでDKGを実行する、b)繰り返し行う署名プロセスで、アウトプットが生成される。DKGは低速で合意が必要なのに対して、繰り返し行う署名はノンインタラクティブで高速である。
7.3.1 セットアップ(Setup)
閾値署名スキームをセットアップする際、信頼できる第三者には何としても頼りたくない。ゆえに、群Gはブロックチェーンシステムの初期化中にBLSが群の公開鍵と秘密鍵のシェアをセットアップするようにDKGを実行する。閾値tはそのセットアップのパラメータである。
DKGが正常に終了すると、DKGはパブリックな検証ベクトルVG ∈csGt2をアウトプットし、各レプリカi ∈ Gに秘密鍵のシェアskG,iを託す。検証ベクトルVGは例えばジェネシスブロックなどのブロックチェーンにコミットされ、記録される。
VG = (ν0, ..., νt-1)とする。群の公開鍵はpkG = ν0 ∈ csG2である。pkGと対応するskGは群Gの誰にも明示的には分からないが、skG,iを通じて暗黙的に利用できる。検証ベクトルVGを使い、次の「多項式」置換を介してskG,iと対応する公開鍵のシェアpkG,i ∈ csG2を復元できる。
従って、iが生成する署名シェアは全て情報VGとiに対してパブリックに検証されうる。群の公開鍵pkGを使って、Recover関数のアウトプットを検証できる。
(筆者注)
- ここのπは直積。上記の記述ではpkG,i = vi11 × vi22 × ... × vi1t-1t-1
7.3.2 署名プロセス(Signing process)
ラウンドr - 1についての最初の公証を確認するとすぐにレプリカはラウンドrに突入することを思い出してほしい。ラウンドrの開始時点で、レプリカは署名シェアσr,1 = Sign(r || ξr-1, skG,i)を計算する。ここで、ξr-1はラウンドr - 1の乱数である。ブートのため、ξ0には例えば文字列「DFINITY」のハッシュなどの種も仕掛けもない数が設定される。その後、レプリカiは(i, σr,i)をブロードキャストする。
第7章3の1で述べたように、このデータを受け取る任意のレプリカはパブリックな情報VGに対して(i, σr,i)を検証できる。検証の結果有効であれば、レプリカは(i, σr,i)を保存し、再度ブロードキャストする。レプリカは少なくともt個の異なる有効な署名シェアを受け取るとすぐにRecover(i1, ...,it , σi1, ...,σit )を実行して群の署名σG,rを計算する。最後にラウンドrについてのランダムなアウトプットξrはσG,rのハッシュとして計算される。
署名プロセスはノンインタラクティブである点を強調しておきたい。十分に多いシェアの一方向コミュニケーションのあとであれば、いかなるサードパーティでも復元を行うことができる。
(筆者注)
- 種も仕掛けもない数(nothing-up-my-sleeve number)は、開発者だけが知る秘密のバックドアや脆弱性などがあるのではないか、というユーザの疑念を晴らすために作られる数。例えば、円周率πやネピア数eなどはこのような数として適さないとされる。
(DFINITYホワイトペーパー日本語訳10 ←← 前)|(次 →→ DFINITYホワイトペーパー日本語訳12)
免責
邦訳には誤りがある場合がございます。予めご承知おき下さい。
確実な情報を知るためには冒頭に示した原文をご参照くださいますようお願いいたします。