Upgrade to Pro — share decks privately, control downloads, hide ads and more …

FROST

 FROST

GBECの解説動画の資料です。
https://goblockchain.network/2023/02/frost/

shigeyuki azuchi

February 21, 2023
Tweet

More Decks by shigeyuki azuchi

Other Decks in Technology

Transcript

  1. 1 FROST
 https://eprint.iacr.org/2020/852.pdf 
 通信ラウンドの効率性を重視したSchnorr署名の閾値署名方式 
 
 • 従来の閾値署名方式 


    ある参加者が不正な振る舞いをしても、 
 残りの参加者が不正を検出し、閾値分の参加者が 
 正しい振る舞いをする限り、署名を完成できる。 
 
 → 堅牢性のあるプロトコル 
 
 • FROST
 不正を行う参加者がいた場合、プロトコルを中断し、 
 その参加者を除いてプロトコルを 再実行することで
 署名を完成させる。
 
 → 通信ラウンドを削減し、通信効率を向上 
 
 ※ Zcashではシールドトランザクションで、マルチパーティの資金を 
  管理できるようにするために採用を進めている模様 

  2. 2 ラグランジュ補間
 【シャミアの秘密分散法】 
 t-1次の多項式 f(x) = a t-1 xt-1

    + a t-2 xt-2 + … + a 0 を生成し、a 0 をシークレット値とした場合、 
 シェア(i, f(i))をt個集めると、多項式を再構築でき、シークレット値 a 0 が分かる秘密共有の仕組み 
 
 【ラグランジュ補間公式】 
 
 
 
 
 を利用して、t個シェアが集まると、 a 0 を計算可能
 (x - j) は除く (i j - i j )は除く i j は除く (i j - i j )は除く ※ λ j (0)はiが事前に分かれば事前に計算可能

  3. 3 分散鍵生成(DKG)
 n人の参加者のうち、t人の参加者が協力すればSchnorr署名を完成させられるユースケースを想定 
 n人の参加者(各参加者の IDを1..nとする)は、それぞれ以下のプロトコルを実行 
 【第1ラウンド】
 1. t個のランダムなシークレット

    a 0 , a 1 , …, a t-1 を生成
 2. 1のシークレットを係数とした t-1次の多項式を作成
 f(x) = a t-1 xt-1 + a t-2 xt-2 + … + a 0
 3. a 0 の知識を証明をするためのSchnorr署名を生成 
 a. ランダムなnonce kを選択し、R = kGとする
 b. c = H(ID || a 0 G || R)を計算
 c. s = k + ca 0 を計算
 d. (R, s)がSchnorr署名
 4. 各係数のコミットメントを計算( C i = a i G)
 5. 4のリストと、3のSchnorr署名を他の参加者に送信 
 6. 受信したコミットメント(=公開鍵)のリストとSchnorr署名から、署名の有効性を検証 

  4. 4 分散鍵生成(DKG)
 【第2ラウンド】
 1. 自分が作成した多項式 f(x) = a t-1 xt-1

    + a t-2 xt-2 + … + a 0 を使って、
 n人の各参加者のシェア(ID, f(ID))を計算し、各参加者に送信する。 
 2. シェアを受信した参加者は、シェア (ID, f(ID))が正しいか検証する。
 ※ 多項式の各係数は不明だが、共有されたコミットメント( C i = a i G)を使って検証可能
 f(ID) = C t-1 ・IDt-1+ C t-2 ・IDt-2 + … C 0 ・ID0 3. 全参加者からシェアを受信したら、集約鍵のシェアを計算 
 s ID = f 1 (ID) + f 2 (ID) + … f n (ID)
 4. 3から自分の公開シェアP ID = s ID Gを計算
 他の参加者の公開シェアについても、全参加者のコミットメントとIDが分かるので計算可能 
 5. 各参加者のC ID, 0 = a ID,0 Gを合算して、集約公開鍵P = a 1,0 G + a 2,0 G + … a n,0 Gを導出
 
 集約公開鍵Pに対応する秘密鍵は、各参加者の係数 a 0 の合算値
 各参加者は集約秘密鍵のシェアを持っている状態 

  5. 5 署名の生成
 【前処理ラウンド】
 各参加者は、
 1. 一度だけ使用するnonceのペア( d ID , e

    ID )を生成
 2. nonceに対応する公開鍵のペアを生成( D ID = d id G, E ID = e id G)
 
 ↑をπ個生成して、他の参加者に送信 
 
 • 1回の署名ラウンドで使用するのは1つのみ 
 • 最初は、DKGラウンドで一緒にやってもOK 
 • π個すべて使用したら、前処理ラウンドを再実行 

  6. 6 署名の生成
 【署名ラウンド】
 • 最初に参加者の中から、署名の集約を行う Signature Aggregator(SA)を選択する
 • SAは参加者の中からt人選び、未使用のnonceのペア( D

    ID G, E ID G)をピックアップ
 • SAはピックアップしたnonceのリストと署名対象のメッセージ mをt人の参加者に送信
 
 t人の参加者は、
 1. nonceのリストが以前受信したものか検証 
 2. 参加者全員分のp ID = H(ID || m || (nonceのリスト)) を計算
 3. 署名に使用する集約nonceを計算 
 4. 署名のチャレンジ c = H(P || R || m)を計算
 5. 自身のシェアs ID を使って部分署名を計算し 
 z ID = d ID + p ID e ID + c s ID λ ID
 6. 部分署名をSAに送信
 ※ s ID λ ID は多項式補間で復元される秘密鍵のシェアとして機能する

  7. 7 署名の生成
 【署名ラウンド】
 1. SAはt人の参加者から受信した部分署名について、以下が成立するか検証 
 z ID G =

    R ID + c λ ID P ID
 成立しなかった場合、不正な振る舞いをする参加者が特定され、その参加者を除いて署名ラウンドを再実行 
 2. t個の部分署名を合算して、集約署名を完成させる 
 z = z 1 + … z t
 3. (R, z)が集約公開鍵Pとメッセージmに対して有効なSchnorr署名 
 
 各参加者は、署名ラウンドで実行したnonceのペア( D ID G, E ID G)を削除
 
 ※ 署名ラウンドは、SAと各参加者間で1ラウンド(1往復)の通信で完了する 
 nonceのコミットメントの交換を署名ラウンドに含める場合は、2ラウンド