Discreet Log Contracts -秘密分散・秘密計算(マルチパーティschnorr署名)を用いたオラクルフェデレーションモデル-

Ichiro Kuwahara
Crypto Garage
Published in
Mar 3, 2021

Discreet Log Contractsオラクルシリーズ
1.
Discreet Log Contracts -現実世界でオラクルが機能するために必要なもの-
2.
Discreet Log Contracts -マルチオラクルサポート-
3.
Discreet Log Contracts -レンジ署名-
4.Discreet Log Contracts -秘密分散・秘密計算(マルチパーティschnorr署名)を用いたオラクルフェデレーションモデル-(本投稿)
5.
Discreet Log Contracts -Lightning Networkを使用したオラクル署名の販売

前回の投稿で、Specで議論されているDLCのマルチオラクルサポートおよびレンジ署名について説明しました。今回はSpecで議論されていないマルチオラクルの実現案について考察してみたいと思います。

「k of n」マルチオラクルの課題

単一オラクルと比較した時の「k of n」マルチオラクルの課題は用意するべきCETの数が多くなる点です。レンジ署名を使用することである程度の削減は見込まれるものの、オラクルの組み合わせに伴いCETは増加します。
例えば「2 of 3」の場合はオラクルの組み合わせは3通りですが、「10 of 15」の場合は3003通りまで膨れ上がります!
秘密分散・秘密計算(マルチパーティschnorr署名)を用いると、オラクルの組み合わせを考慮する必要がなくなり、nとkが増加しても用意するCETは増加させないことが可能となります。

秘密分散・秘密計算(マルチパーティschnorr署名)を用いたオラクルで実現可能なこと

-n個のオラクルのうちk個のオラクルの発表する値を元にDLCで使用する署名が完成
-用意するCETの数はnとkがいくつであっても変わらない
-契約前にオラクル間のインタラクションが必要
-特定のオラクルがプロトコル通りに稼働しなかった場合には、他のオラクルにより検知可能
-オラクルはお互いに協力・検閲しあいながら、稼働するフェデレーションモデルとなる
以下で秘密分散・秘密計算の理論について触れていきたいと思います。

秘密分散・秘密計算の理論

今回紹介する秘密分散・秘密計算は、「n次方程式はそれを通るn+1個の点が定まれば一意に特定される」特徴をベースに成り立っています。
2つの点を通る直線(1次方程式)は一意に特定されることは直感的にも理解できるかと思います。1次方程式f(x)=ax+bを準備し、f(x)を通る点f(1)、f(2)、f(3)を3者に分散させます。(この分散された情報f(1),f(2),f(3)をシェアと言います
上記のシェア3つのうち2つが揃うと1次方程式は一意に定まります。なお秘密情報はf(0)として定義されており、この場合bが秘密情報にあたります。

「2 of 3」の具体的な例を考えてみましょう。
オラクル1、オラクル2、オラクル3はそれぞれ自身のみが知る秘密の1次方程式f(x)及び秘密の値f(0)を保持しています。それぞれの保持する3つの1次方程式を全て合算するとy= 16x+18となり、秘密の値18が最終的に求めたい値になります。

オラクル1、オラクル2、オラクル3は自身の方程式からf(1)、f(2)、f(3)を計算します。

オラクルはシェアを他のオラクルに連携します。f(1)はオラクル1、f(2)はオラクル2、f(3)はオラクル3に集約します。各オラクルは集約された値を合算しそれぞれ33、50、66を算出します。

このうち、2つが明らかになると最終的に求めたいy= 16x+18および秘密の値18が明らかになります。

なお、この計算方法は実際はラグランジュの補間公式として一般化されています。気になる方はこちらをご覧いただければと思います。

VSSの理論

上記はオラクル1〜3が全て想定通りの動きをすることで実現可能ですが、一部のオラクルが不正な値を発信した場合には正しい値は導くことができません。
各オラクルが不正な値を連携した場合に検知可能とする方法としてVSSを使用します。これはシェアを計算するパーティがシェアと共にコミットメントを作成し連携することでシェアが正しいか否かを検証できるものです。

VSS計算方法(オラクル1の場合)
先程のオラクル1の例に従って説明していきます。オラクル1はf(x) :4x+3に加えてg(x):7x+5を用意しxに任意の値(1,2,3)を代入したシェアを作成します。Share(2)はオラクル2、Share(3)オラクル3へ連携します。f(x)、g(x)の各次数の係数をもとにコミットメントを作成します。ベースポイントをG、Hと用意し、以下の通りコミットメントを作成し、全員へ連携します。

Commitment計算方法
C0=4G +7H
C1=3G+5H

VSS検証方法
オラクル2の場合
オラクル2はオラクル1よりシェア11、19、CommitmentC0、C1を受け取り、以下の検証を行います。検証がOKであれば、オラクル1の作成したシェアは正しいと判断可能です。
11G+19H =? 2C0+C1

オラクル3の場合
オラクル3はオラクル1よりシェア15、26、CommitmentC0、C1を受け取り、以下の検証を行います。検証がOKであれば、オラクル1の作成したシェアは正しいと判断可能です。
15G+26H =? 3C0+C1

2 of 2マルチパーティSchnorr署名の説明

続いてマルチパーティで1つのSchnorr署名を作成する計算方法について説明します。パーティ1、2はそれぞれ秘密鍵と乱数、それらにベースポイントを掛け合わせた公開鍵、乱数ポイントを作成します。作成した公開鍵、乱数ポイントを交換して、共通の公開鍵P、乱数ポイントRを作成します。

※実際はMu-sigを活用するのですがここでは記載割愛します

お待たせしました!これで「k of n」マルチオラクルを実現するためのベースの理論説明は終了です。これより秘密分散・秘密計算(マルチパーティschnorr署名)を使用したオラクルの2of3マルチパーティ署名について説明します。

秘密分散・秘密計算を用いた2of3マルチパーティSchnorr署名

ここ実現したいことは3つのオラクルのうち2つのオラクルの結果を使用することで署名を復元することです。
1.各オラクルは以下の通り、自身のみ知るf(x)、g(x)を作成し、f(0)を秘密鍵p、g(0)を乱数rとします。

2.各オラクルは公開鍵、乱数ポイントを交換し共通のP、Rを作成します。(実際はMu-sigを使用する方が望ましいので計算式はもう少し複雑になりますがここでは省略します)
P=18G, R=25Gが導き出されます。

3.シェアとコミットメント計算
Shareの関数は以下の通り定義されます。
Share(x)=g(x)+f(x)・H(R|P|m)
この計算式が何を意味するかをオラクル1を例にもう振り下げて触れてみます。オラクル1のShare計算式は以下の通りです。
Share(x)=7x+5+(4x+3)・H(R|P|m)
※R=25,P=18G

この式をよくみると先述のSchorr署名の計算式の形をしていることがみて取れます。この関数にx=0を代入してみましょう。
Share(0)=5+3H(R|P|m)

これは共通のR,Pに対してオラクル1の秘密鍵(=3)および乱数(=5)を使用してmにSchnorr署名した値と等しくなります!これは前述で触れた複数partyによる署名のうちの部分署名にあたります。これにオラクル2、オラクル3のShare(0)がさらに合算されると3パーティ署名が完成します。

続いてオラクル1はコミットメントを計算します。コミットメントもSchnorr署名の形をしています。シェアおよびコミットメントは以下の通り計算されます。

VSS検証方法(オラクル2の場合)
オラクル2はオラクル1よりシェア19+11H(R|P|m)、CommitmentC0、C1を受け取り、以下の検証を行います。検証がOKであれば、オラクル1の作成したシェアは正しいと判断可能です。

19+11H(R|P|m) =? 2C0+C1

VSS検証方法(オラクル3の場合)
オラクル3はオラクル1よりシェア26+15H(R|P|m)、CommitmentC0、C1を受け取り、以下の検証を行います。検証がOKであれば、オラクル1の作成したシェアは正しいと判断可能です。

26+15H(R|P|m) =? 3C0+C1

署名の完成
オラクル1はShare(1)の合計値、オラクル2はShare(2)の合計値、オラクル3はShare(3)の合計値を計算します。このうち2つが明らかになるとShare(0)が計算可能になります。

作成された以下のShare(0)はオラクル1〜3で作成されたSchnorr署名となります。

Share(0)=18+25H(R|P|m) ※P=18G,P=25G

秘密分散・秘密計算(マルチパーティschnorr署名)を用いたオラクルについての考察

以上の技術を用いて複数オラクルが存在する場合での「k of n」マルチオラクルの実現方法について記載しました。kとnの数が大きくなっても作成するべきCETの数は増加しないため、数が大きいほど効果が出ます。
なお、前回説明した方法はオラクル間のインラクションが不要ですが、今回の案ではオラクル間でシェアの共有やVSS検証などを行うインタラクションが必要な点も前回紹介した方法との違いになります。つまり各オラクル間でお互い協力しあい、かつお互いを検証し合うようなフェデレーションモデルを構築する際に有効となります。

まとめ

今回は秘密分散・秘密計算(マルチパーティschnorr署名)を用いたオラクルについて説明しました。現状、Specで議論されているマルチパーティーオラクルと比較した特徴は以下の通りです。

・n個のオラクルのうち、k個のオラクルの署名にてDLCが実行可能
・ユーザが作成するCETの数はnとkの数に寄らず一定
・ただし、セットアップとしてオラクル間のインタラクションが必要
・オラクルのインタラクションの回数はnとkに比例して大きくなる
・オラクルはお互いがプロトコル通りに稼働したかを検証可能
・オラクル同士が協力・検閲し合う様なフェデレーションモデルを想定
・各オラクルがフェデレーションを正しく運営するためのインセンティブ設計などについては別途検討が必要
・ユーザはフェデレーション内部のオラクルしか使用できないので、Speで議論されているマルチオラクルより自由度は低下する

次回はDLCオラクル編最終章として、オラクルのインセンティブ設計についてお話しします。

Reference
https://eprint.iacr.org/2020/852.pdf
https://techmedia-think.hatenablog.com/entry/2018/08/23/184754

--

--