誰でもオラクルになれるNDLC
以前の記事で、DLCは将来の予測に基づく契約をトラストレスに執行可能とするスマートコントラクトで、そのために必要なオラクルへの信頼を最小限に抑えることができることについて紹介しました。今回はそのDLCを可能とするツールNDLCが実装されたので、そのツールについて書きたいと思います。
NDLCの解説ページでは今年のアメリカ大統領選挙で共和党と民主党のどちらが勝つかを賭けるコントラクトを例として解説しています。この賭けをするために必要なエンティティは、大統領選の結果を公表するオラクルと、賭けの当事者であるアリスとボブとしています。
オラクル
オラクルの仕事は決まった時点にある事実・事象をデータとして公開することです。今回の例では大統領選の終了時にどちらの党が勝ったかを公開するのがオラクルの仕事です。そしてNDLCを使うと、誰でもこのようなオラクルになることができます。NDLCでは以下のようなことができます。
- オラクルの登録(公開鍵の生成)
- イベントの作成(メッセージとNonceの生成)
- イベントの結果公開(署名の公開)
イベントの作成では、イベントの結果となりうる情報を事前に設定し、Nonceと呼ばれるランダムな値を生成します。以下がその例です。
./ndlc-cli -testnet --datadir Olivia event generate "olivia/elections" "Republicans" "Democrats" "Other"
オラクルは、"Republicans" "Democrats" "Other"のいづれかをメッセージとして、自身の秘密鍵で署名することを宣言しています。上記のコマンドを実行するとNonceと呼ばれるランダムな値が生成されますが、これはシュノア署名のNonceで、これにベースポイントGをかけると署名Rになります。この署名Rを公開することで、オラクはメッセージに対して署名をすることを「宣言」しているのです。
イベント結果の公開はツイッター上でつぶやいてもいいし、オラクルのWebサイトで公開してもいいです。但し、もしイベント結果を複数公開すると、例えば「共和党の勝ち」と「民主党の勝ち」、オラクルの秘密鍵が公開される仕組みになっているので、オラクルとしては真面目に自分の仕事を行うのが合理的です。
アリスとボブ
アリスとボブのコントラクトもNDLCを使って作ることができます。アリスとボブはそれぞれオラクルの公開鍵の登録と、イベントの登録をします。イベントの登録では、オラクルが作成したメッセージとNonceを使います。両者のイベント登録が終わると、アリスは賭けをするためにオファーを作り、そのオファーをボブへ渡します。以下はそのオファー作成の例です。
./ndlc-cli -testnet --datadir Alice dlc offer "bet" "olivia/elections" "Republicans:0.006" "Democrats:-0.004" "Other:0"
ボブはこのオファーを受け入れるか決めます。オファーを受け入れたら、両者はそれぞれの資金を2 of 2マルチシグへ送金します。この辺りはアリス・ボブ間で何回か対話的な操作をしないといけないのですが、その詳細は割愛します。両者の署名が済んだ時点で、ボブがそのFundingTxをブロードキャストします。あとは、オラクルが大統領選の結果("Republicans" "Democrats" "Other"のいずれか)に対して署名をして、その署名データが公開されるまで待ちます。署名データが公開されたら、両者はその結果をもとに自分の賭けが当たっていたら、マルチシグにロックされた賭け金を引き出すことができます。
ここで注目したいのは、オラクルは自身が作成したイベントや公開したデータを持っていても、誰がどのようにそのデータを使って賭け事や契約を結んでいるかは分からないことです。さらに、事前にオラクルがNonce(署名R)と、あるイベントの取り得る結果データ(今回の例では"Republicans" "Democrats" "Other")を公開することで、イベント終了時にオラクルが不正をした場合、その監査ができることもオラクルへの信頼度を抑えるために重要なポイントです。もしオラクルが長期的な運用をするのなら、不正をしないことで評判を落とさないことが合理的です。
疑問点
NDLCではアダプター署名を必要としていますが、DLCの論文にはアダプター署名については触れていませんでした。この違いはなんでしょうか。
以前のDLCを解説した記事を思い出すと、アリスのCETのスクリプトは以下でした。
アリスのスクリプト
PubAi ∨ (PubBob ∧ T imeDelay)
-----------------------------------
PubAi = PubAlice + siG
siG = R + Hash(R, m)*A
ここでPubAiに着目してみます。
PubAi = PubAlice + siG
= PubAlice + R + Hash(R, m)*A
この形は、以前紹介したアダプター署名と同じですよね。
アダプター署名
-----------------------------------
s' = t + r + Hash(R, m)*a
アリスがCETを実行するためには、アリスの秘密鍵とオラクルの署名が必要で、この2つを1つに纏めたものがアダプター署名ということになります。DLCの論文内ではTimeDelayによるボブの回収条件なども含まれているので、スクリプトとなっていますが、NDLCのような方法であれば、アダプター署名を使ってScriptless Scriptなトランザクションを実行させているんですね(たぶん)。
[追記]オリジナルのDLCとアダプター署名を活用したDLCについて勘違いをしていました。オリジナル版ではオラクルが公開する署名がなくてもCETをブロードキャストできますが(ただし、不正なので相手側に没収される)、アダプター署名を使うことでオラクルの署名がない限りCETは未完成なTxなのでブロードキャストができないようになっています(詳細はこちら)。
まとめ
NDLCというツールを使えば、誰でも簡単にオラクルの登録からイベント作成、公開をすることができました。またイベント情報(メッセージとNonce)を使うと、アリスとボブが任意の賭けができることも分かりました。NDLCはコマンドラインによる操作と、契約者間の対話的なコントラクト生成が必要でしたが、今後はフロントエンドの実装や、非対話的な方法でコントラクトの作成ができるようになれば、よりUXのよい先物取引ができるようになるでしょう。DLCはとても面白いコンセプトだと思うので今後に期待しています。
おまけ
もしNDLCを使ってみたいと思う方のために、Windows7しか持っていない僕がどうやってNDLCをビルドして実際にコントラクトを実行したかについて、有料部分に載せておきました。