セットアップフェーズ
drandのセットアップフェーズでは、𝑛人の参加者の間で共有される集合的な秘密鍵と公開鍵のペアを作成します。これは𝑡-of-𝑛分散鍵生成(DKG)プロセスを通じて行われ、各参加者は集合的な公開鍵のコピーと集合的な秘密鍵のプライベートキーシェアを受け取ります — 個々のノードは集合的な秘密鍵を知りません。各プライベートキーシェアは、個々のプライベートキーシェアを使用して生成された少なくとも𝑡の貢献が必要な閾値署名の生成など、暗号的な閾値計算を実行するために使用できます。
DKGは完全に分散された方法で実行され、単一障害点を回避します。これは、drand DKG実装のさまざまなサブコンポーネントの概要です。
秘密分散は、多くの高度な閾値暗号メカニズムが依存する重要な技術です。
秘密分散を使用すると、秘密値𝑠を𝑛個のシェア𝑠1,…,𝑠𝑛に分割でき、𝑡個のシェアが利用可能な場合にのみ𝑠を再構築できます。
SSSスキームは、最もよく知られ広く使用されている秘密分散アプローチの1つであり、drandのコアコンポーネントです。SSSは任意の有限体上で動作しますが、単純なアプローチでは整数の剰余𝑝を使用し、ℤ𝑝で表されます。𝑠∈ℤ𝑝を共有する秘密とします。
sを共有するために、ディーラーはまず多項式𝑞(𝑥)=𝑎0+𝑎1𝑥+⋯+𝑎𝑡−1𝑥𝑡−1を作成し、𝑎0=𝑠および(ランダムな)𝑎𝑖∈ℤ𝑝を𝑖=1,…,𝑡−1に対して作成し、次に各参加者𝑖のためにシェア𝑠𝑖を作成します。これは、整数𝑖で𝑞(𝑥)を評価し、𝑠𝑖=(𝑖,𝑞(𝑖))と設定することによって行われます。
秘密sを回復するには、少なくとも𝑡個のシェアを集め、次にラグランジュ補間を使用して𝑞(𝑥)を一意に再構築し、𝑠を𝑠=𝑎0=𝑞(0)として取得します。
𝑡-of-𝑛シェアの任意のサブセットを使用してラグランジュ補間を実行し、𝑠を一意に決定できます。ただし、𝑡未満のシェアのサブセットを持つことは、𝑠に関する情報を学ぶことを許可しません。
SSSスキームは、ディーラーが誠実であると仮定しますが、これは実際には常に成り立つわけではありません。検証可能な秘密分散(VSS)スキームは、参加者が他のノードに配布されたシェアと整合性があることを確認できるようにすることで、悪意のあるディーラーから保護します。これにより、共有された秘密が後で正しく再構築できることが保証されます。
drandは、SSSの拡張であるフェルドマンのVSSスキームを使用します。𝔾を離散対数の計算が困難な素数の順序𝑝の巡回群とします。巡回群とは、生成元𝑔が存在し、任意の要素𝑥∈𝔾が𝑥=𝑔𝑎の形で書けることを意味します(ここで𝑎∈{0,…,𝑝−1})。
秘密のシェアを参加者に配布することに加えて、ディーラーは多項式𝑞(𝑥)の係数に対するコミットメントを(𝐴0,𝐴1,…,𝐴𝑡−1)=(𝑔𝑠,𝑔𝑎1,…,𝑔𝑎𝑡−1)の形で放送します。これらのコミットメントにより、個々の参加者𝑖は、𝑞(𝑥)に関して自分のシェア𝑠𝑖=(𝑖,𝑞(𝑖))が整合性があることを確認できます。これは、𝑔𝑞(𝑖)=∏𝑡−1𝑗=0(𝐴𝑗)𝑖𝑗が成り立つかどうかをチェックすることによって行われます。
秘密sの回復は通常のSSSと同じように機能しますが、検証された有効なシェアが使用されます。
VSSスキームは悪意のあるディーラーから保護しますが、ディーラーは依然として秘密を知っています。個々のノードがその情報を得ないように、参加者はDKGプロトコルを使用して集合的に共有された秘密sを作成できます。drandは、フェルドマンのVSSの𝑛インスタンスを並行して実行し、追加の検証ステップの上に構築されたペダーセンのDKGスキームを使用します。
個々の参加者𝑖は(ランダムな)秘密𝑠𝑖∈ℤ𝑝を作成し、VSSを使用してすべての参加者に共有します。各𝑗にシェア𝑠𝑖,𝑗を送信し、コミットメントのリスト(𝐴𝑖,0,𝐴𝑖,1,…,𝐴𝑖,𝑡−1)を全員に放送します。
𝑗は、フェルドマンのVSSスキームに従って受け取ったシェアを検証します。もし𝑗が𝑖から無効なシェア𝑠𝑖,𝑗を受け取った場合、𝑗は苦情を放送します。𝑖は正しいシェア𝑠𝑖,𝑗を明らかにしなければならず、そうでなければ無効なディーラーと見なされます。
プロトコルの終了時に、𝑖の最終シェアは、検証フェーズ中に除外されなかったすべての有効な参加者𝑗に対して𝑠𝑖=∑𝑗𝑠𝑗,𝑖となります。
有効なシェアに関連付けられた集合的な公開鍵は、すべての有効な𝑗に対して𝑆=∑𝑗𝐴𝑗,0として計算できます。
注意: ペダーセンのDKGを使用して作成された秘密は偏っている可能性がありますが、Rabinらによって示されたように、閾値署名に使用することは安全です。