Discreet Log Contracts -レンジ署名-

Ichiro Kuwahara
Crypto Garage
Published in
7 min readFeb 10, 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を使用したオラクル署名の販売

前回の投稿では、DLCのマルチオラクルサポートの利点および課題について説明しました。今回は、BTC/USDをマルチオラクルで扱うなど、想定される結果のパターンが多い場合のCETの数を削減するための施策として数値の範囲に対して署名(以下、「レンジ署名」と記載)を行う方法について説明します。に対して署名を行う方法について説明します。(以下、「レンジ署名」と記載)

レンジ署名は例えば300~399などの範囲内の値全てに対して有効となる署名です。300~399の100通りのパターンを1つに集約することができます。以下その実現方法についてみていきましょう。

オラクルの発表する署名内容
契約満期のBTC/USDが’012345’(6桁)の場合、オラクルが契約満期に発表する署名は以下の通り、各桁ごとに署名を発表します。

発表結果
’012345’

各署名
t_6桁目:メッセージ0に対する署名
t_5桁目:メッセージ1に対する署名
t_4桁目:メッセージ2に対する署名
t_3桁目:メッセージ3に対する署名
t_2桁目:メッセージ4に対する署名
t_1桁目:メッセージ5に対する署名

ユーザによる署名の合算
オラクルを使用してDLCユーザは、以下の例のようにオラクルの発表した署名を合算させて自身の必要な署名を完成させます。

例1) t_6桁目+t_5桁目+t_4桁目+t_3桁目+t_2桁目+t_1桁目:’012345’に対する署名
例2) t_6桁目+t_5桁目+t_4桁目+t_3桁目+t_2桁目 :’01234*’に対する署名(*はいくつでもOK)
例3) t_6桁目+t_5桁目+t_4桁目+t_3桁目 :’0123**’に対する署名(*はいくつでもOK)

例1は’012345’に対する署名ですが、例2は’01234*(*はいくつでもOK)’、つまり’012340~012349’の範囲についての署名になります。このようにあえて全ての桁の署名を使用しないような契約を組むことにより、数値の範囲に対しての署名が可能になります。

レンジ署名の具体例(10進数)
例えば、012342~012423の範囲に対して署名を行う場合、以下の19パターン分、署名が必要になります。

012342
012343
012344
012345
012346
012347
012348
012349
01235*
01236*
01237*
01238*
01239*
01240*
01241*
012420
012421
012422
012423

*の付いている箇所は署名として使用しないことでCETが集約されています。逆に012342~012349、012420~012423については集約が行われていません。このように最大値、最小値の値によってはいくつか集約ができない例が存在します。これは進数表記を変更することで更に集約が可能になります。以下に具体例を記載します。

レンジ署名の最適化例(2進数)
012342~012423を2進数表記すると、011000000110110~011000010000111になります。
では、上記の例に習って数字を1ずつインクリメントしてみましょう。

10進数表記: 2進数表記
012342: 011000000110110
012343: 011000000110111
012344: 011000000111000
012345: 011000000111001
012346: 011000000111010
012347: 011000000111011
012348: 011000000111100
012349: 011000000111101
012350: 011000000111110
012351: 011000000111111

2進数表記を注意深く見ていくと以下の通り、*を用いることでレンジを表現することが可能なことが見て取れます。

10進数表記: 2進数表記
012342: 011000000110110
012343: 011000000110111
↑01100000011011*で網羅可能

012344: 011000000111000
012345: 011000000111001
012346: 011000000111010
012347: 011000000111011
012348: 011000000111100
012349: 011000000111101
012350: 011000000111110
012351: 011000000111111
↑ 011000000111***で網羅可能

このようにレンジに対する署名を適応すると必要なCETは以下の4通りまで集約されます!

10進数表記: 2進数表記
012342~012343: 01100000011011*
012344~012351: 011000000111 ***
012352~012415: 011000001 *** ***
012416~012423: 011000010000***

レンジ署名のユースケース
レンジ署名により〜以上、〜以下というような条件を契約に追加することにより金融商品としての機能を拡張が可能です。
また、マルチオラクルでオラクル間の発表結果の誤差がある場合に備えて、「202〜205」といったレンジ内であれば契約履行が可能な条件を表現可能です。マルチオラクルのサポート方法については現在もSpecでディスカッション中なので、興味のある方は覗いてみていただければと思います。

まとめ
本稿では、BTC/USDなどの、オラクルの発表する値のパターンが多い場合に有効となる「レンジ署名」と、レンジ署名を行う場合のCET削減に有効となる2進数表記について説明しました。これらを組み合わせることで、XX時点のBTC/USDを予測した取引を複数のオラクルを使用することで行うDLCが実現可能になります。
Crypto Garageの提供するP2P derivatives clientおよびオラクルは2進数ベースの署名と、レンジ署名によるCET集約への対応をしています。もし興味のある方は是非使ってみてください。

次回はDLCオラクルシリーズ、次回は現状Specで議論されている以外にも考えられる秘密計算や閾値署名を活用したマルチオラクルモデルについて考察します。

--

--