ランダムネス生成
このセクションでは、この集合的な鍵ペアを使用して、公開検証可能で、偏りのない、予測不可能なランダムネスを分散的に生成する方法について説明します。
まず、ペアリングベースの暗号(PBC)について説明します。これは非常に人気があり、zk-SNARKsなどの多くの現代的なコンセンサスプロトコルやゼロ知識証明で使用されています。次に、drandがしきい値Boneh-Lynn-Shacham(BLS)署名のためのランダムネスビーコン生成フェーズにPBCをどのように使用するかを示します。最後に、drandが生成されたしきい値BLS署名をランダムネスチェーンにどのようにリンクさせるかについて議論します。
ペアリングベースの暗号は、双線形群 (𝔾1,𝔾2,𝔾𝑡) に基づいており、ここで 𝔾1、𝔾2、および 𝔾𝑡 はそれぞれ生成子 𝑔1、𝑔2、𝑔𝑡 を持つ素数の順序 𝑝 の循環群であり、次の特性を持つペアリング操作 𝑒:𝔾1×𝔾2→𝔾𝑡 があります:
-
双線形性:
∀𝑎,𝑏∈ℤ∗𝑝,∀𝑃∈𝔾1,∀𝑄∈𝔾2,に対して𝑒(𝑎𝑃,𝑏𝑄)=𝑒(𝑃,𝑄)𝑎𝑏が成り立ちます。 -
非退化性:
𝑒≠1 -
計算可能性:
𝑒を計算するための効率的なアルゴリズムが存在します。 現在、drandはBarreto-Lynn-Scott曲線BLS12-381を使用しています。
公開検証可能で、偏りのない分散ランダムネスを生成するために、drandはしきい値Boneh-Lynn-Shacham(BLS)署名を利用します。まず、通常のBLS署名について説明し、その後しきい値バリアントについて説明します。
BLS署名は、双線形ペアリングに依存する短い署名であり、𝔾1 の単一要素のみで構成されています。これらは決定論的であり、メッセージと署名者の鍵のみに依存します。他の署名スキーム(例えばECDSA)では、各署名されたメッセージのために新しいランダム値が必要ですが、BLS署名では同じ鍵で生成された特定のメッセージに対する2つのBLS署名は同一です。drandでは、この特性を利用してランダムネス生成の偏りのなさを実現しています。
BLS署名スキームは、次のサブ手続きで構成されています。
鍵ペアを生成するために、署名者はまずプライベートキー 𝑥∈ℤ∗𝑝 をランダムに選択し、次に対応する公開鍵を 𝑋=𝑔𝑥2∈𝔾2 として計算します。
𝐻:{0,1}∗→𝔾1 を任意のビット列を 𝔾1 の要素にマッピングする暗号学的ハッシュ関数とします。メッセージ 𝑚 に対するBLS署名 𝜎 を計算するために、署名者は 𝜎=𝑥𝐻(𝑚)∈𝔾1 を計算します。
メッセージ 𝑚 に対するBLS署名 𝜎 が有効であることを検証するために、検証者は署名者の公開鍵 𝑋 を使用して 𝑒(𝐻(𝑚),𝑋)=𝑒(𝜎,𝑔2) が成り立つかどうかを確認します。
この方程式は、有効な署名に対して成り立つことに注意してください。なぜなら、𝑒(𝐻(𝑚),𝑋)=𝑒(𝐻(𝑚),𝑔𝑥2)=𝑒(𝐻(𝑚),𝑔2)𝑥=𝑒(𝑥𝐻(𝑚),𝑔2)=𝑒(𝜎,𝑔2) だからです。
しきい値署名スキームの目標は、参加者によって独立に生成された個々の部分署名を組み合わせて、集合的な署名を計算することです。しきい値BLS署名スキームには、次のサブ手続きがあります。
𝑛 人の参加者は、集合的な公開鍵 𝑆∈𝔾2 と、未知の集合的プライベートキー 𝑠 のプライベートキーシェア 𝑠𝑖∈ℤ∗𝑝 を設定するために、𝑡-of-𝑛 DKGを実行します。
メッセージ 𝑚 に署名するために、各 𝑖 は自分のプライベートキーシェア 𝑠𝑖 を使用して部分BLS署名 𝜎𝑖=𝑠𝑖𝐻(𝑚) を作成します。
部分署名 𝜎𝑖 が 𝑚 に対して正しいかどうかを検証するために、検証者はDKG中に生成された公開鍵シェア 𝑆𝑖 を使用し、𝑒(𝐻(𝑚),𝑆𝑖)=𝑒(𝜎𝑖,𝑔2) が成り立つかどうかを確認します。
集合的なBLS署名 𝜎 を 𝑚 に対して再構築するために、検証者はまず 𝑡 個の異なる有効な部分BLS署名 𝜎𝑖 を 𝑚 に対して集め、その後ラグランジュ補間を行います。
集合的BLS署名 𝜎 を検証するために、検証者は 𝑒(𝐻(𝑚),𝑆)=𝑒(𝜎,𝑔2) が成り立つかどうかを確認します。ここで 𝑆 は集合的な公開鍵です。
ラグランジュ補間の特性のおかげで、𝜎 の値は署名再構築中に選ばれた 𝑡 個の有効な部分署名 𝜎𝑖 のサブセットに依存しません。さらに、ラグランジュ補間は、𝑡 未満の署名者のセットが 𝜎 を予測したり偏らせたりできないことも保証します。
要約すると、しきい値BLS署名 𝜎 は、公開検証可能で、偏りのない、予測不可能で、分散されたランダムネスに必要なすべての特性を示します。
上記では、𝔾1 と 𝔾2 を入れ替えることができます。これは公開鍵と署名の相対的なサイズに影響します。最初のdrandチェーンは、上記のように、𝔾2 の署名と 𝔾1 の公開鍵で構成されています。署名サイズは96バイト、公開鍵サイズは48バイトです。
特定のアプリケーションでは、より大きな公開鍵の代わりに小さな署名を好みます。これが、特定のdrandビーコンが 𝔾1 の署名と 𝔾2 の公開鍵を持つ理由です。このような変更は 𝔾1/𝔾2 スワップ と呼ばれます。
drandランダムネスビーコンは、離散的なラウンド 𝑟 で動作します。各ラウンドで、チェーン化されたランダムネスを使用するように設定されたdrandビーコンは、しきい値BLS署名を使用して新しいランダム値を生成します。ランダムネスのこのチェーンを拡張するために、各drand参加者 𝑖 はラウンド 𝑟 でメッセージ 𝑚=𝐻(𝑟∥𝜎𝑟−1) に対する部分BLS署名 𝜎𝑟𝑖 を作成します。ここで、𝜎𝑟−1 はラウンド 𝑟−1 からの(完全な)BLSしきい値署名を示し、𝐻 は暗号学的ハッシュ関数です。
少なくとも 𝑡 人の参加者がメッセージ 𝑚 に対する部分署名 𝜎𝑟𝑖 を放送した後、誰でもラウンド 𝑟 のランダム値に対応する完全なBLSしきい値署名 𝜎𝑟 を回復できます。その後、drandノードはラウンド 𝑟+1 に移動し、プロセスを繰り返します。
ラウンド 𝑟=0 では、drand参加者はdrandセットアップ中に固定されたシードに署名します。このプロセスにより、すべての新しいランダム値が以前に生成されたすべての署名に依存することが保証されます。署名が決定論的であるため、敵がチェーンをフォークして、特定のラウンド 𝑟 で2つの異なる署名 𝜎𝑟 と 𝜎′𝑟 を提示して、公開ランダムネスに依存するシステムに不整合を生成する可能性はありません。
drandビーコンは、チェーン化されていないランダムネスを使用するようにも設定できます。ランダムネスのこのチェーンを拡張するために、各drand参加者 𝑖 はラウンド 𝑟 でメッセージ 𝑚=𝐻(𝑟) に対する部分BLS署名 𝜎𝑟𝑖 を作成します。ここで 𝐻 は暗号学的ハッシュ関数です。
このプロセスにより、ラウンド 𝑟=i のメッセージ 𝑚 の直接的な事前計算が可能になります。