DLCをもう一度理解する
はじめに
DLCは先物取引のような将来の予測に基づく契約を自動執行可能とするスマートコントラクトで、ビットコインのブロックチェーン上で実行することができます。将来の予測に基づく契約で重要になるのはオラクルと呼ばれる概念です。
オラクルとは、閉じられた世界に対して外部からある情報を取り入れる主体を指します。例えば、ある時点でビットコイン価格が1BTC=100万円かどうかを予測して賭けをする場合、この100万円というデータは外部から取得する必要があります。もしこのデータをbitflyerが公開している価格を使う場合、bitflyerがオラクルということになります。ここで重要なのは、オラクルが中立であることです。もしbitflyerの関係者が先にあげた賭けをしていた場合、公開する価格を不正に操作できてしまいます。これをオラクル問題とよび、この問題を解決しようとしているのがChainlinkやAugur、Hivemindとよばれるブロックチェーンプロジェクトです。
DLCは、オラクルに対して必要な信頼を最小限に抑えることを可能とし、またコントラクトの作成・実行におけるスケーラビリティやプライバシーの向上が期待されています。
DLCの論文は以下の構成となっていますが、今回はかいつまんでDLCのコア部分を見ていきます。
概要
モデル
コミットされた署名R
コントラクトの作成
コントラクト内のトランザクション
オラクルによる署名
コントラクトの実行
オラクルへの信頼リスク
最適化
コミットされた署名R
DLCではシュノア署名を使用しますが、以前紹介したデジタル署名としてのシュノア署名とは違った方法で使います。通常のシュノア署名の場合、以下のように秘密鍵、公開鍵、メッセージから署名を生成します。
通常のシュノア署名
-----------------------------------
秘密鍵 a
公開鍵 A = a * G
メッセージ m
ランダムな値 k
R = k * G
-----------------------------------
計算 s = k + Hash(R, m)*a
署名 (R, s)
通常ならRは署名の一部ですが、DLCでは(A, R)を公開鍵とし、sを秘密鍵のように使用します。また、本来Rは署名するメッセージが決定してから生成されますが、DLCの場合は事前にRが生成・公開されるのもポイントです。さらにRが公開されているので、署名sが公開される前にs*Gを求めることができます。
署名Rからs*Gを求める
-----------------------------------
s = k + Hash(R, m)*a
s*G = k*G + Hash(R, m)*a*G
= R + Hash(R, m)*A
s*Gを求めることができると何が嬉しいのかというと、予め予測した価格をメッセージとしてs*Gを計算しスクリプト(公開鍵のようなもの.スクリプト内容は後述)としてコントラクトにセットできます。例えば以下のような計算となります。
事前にs*Gが計算できる
-----------------------------------
式 s*G = R + Hash(R, m)*A
m 1000 satoshiの場合
計算 s*G = R + Hash(R, 1000)*A
m 1050 satoshiの場合
計算 s*G = R + Hash(R, 1050)*A
コントラクトの生成
ここからは実際にアリスとボブの契約内容を交えて見ていきます。
今日が水曜日で日本円の価格が1000satoshiだったとして、金曜日の終値でアリスが円を買い、ボブが円を売るという契約をするとします。水曜日の合意時点で作成するコントラクトとして、まず両者がマルチシグアドレスへ資金をデポジットします。以下の例では両者ともに1000satoshiをデポジットしています。そして、予め金曜日の終値を900satoshiから1100satoshiとして、それぞれのs*Gを事前に計算し(上記でみた計算を思い出してください)それをスクリプトとしたトランザクションTx900からTx1100を作成しておきます。スクリプトは以下のような形をとります。
アリスのスクリプト
PubAi ∨ (PubBob ∧ TimeDelay)
-----------------------------------
PubAi = PubAlice + siG
siG = R + Hash(R, m)*A
※ siGのロック解除には署名siが必要
※ iは本例では900から1100の値をとる
※ ∨はOR、∧はANDを表す
このトランザクション群は、それに対応するオラクルの署名siがないと、各トランザクションの資金のロック解除ができないことがポイントです。
オラクルの署名
金曜日になりその日の終値が1050satoshiとなると、オラクルはそれをメッセージ"1050"として署名して公開します。
オラクルが公開する署名s1050
-----------------------------------
署名 s1050 = k + Hash(1050, R)*a
コントラクトの実行
この署名s1050を使って正しく実行できるコントラクトは上記の図に記載あるアリス、ボブが持っているTx1050のみとなります。もしアリスが保有してるTx1050をブロードキャストした場合、ボブは自身の秘密鍵で950satoshiを回収し、アリスは自身の秘密鍵と署名s1050で1050satoshiを回収することができます。
もしボブが不正または誤ってTx1000をブロードキャストした場合は、その資金のロック解除ができる署名s1000はオラクルによって公開されていないため、一定期間後にアリスが全額没収することができます(図のPubAlice ∧ TimeDelayのコントラクト部分を実行)。
オラクルの信頼リスク
オラクルの信頼リスクはいくつか考えられます。
- オラクルが不正または誤った情報を公開した場合
- オラクルが複数の情報を公開した場合
- オラクルが契約当事者だった場合
- オラクルが情報を公開しなかった場合
これらのリスクはあるものの、このリスクは検知可能です。もし不正があればネットワーク参加者へ報告して、その不正なオラクルを今後使用しないようにすることで対処します。
まとめ
DLCは、予めオラクルが署名の一部Rを公開することで、その情報を使って事前にユーザーは複数のコントラクトを生成しておきます。そして、決められた期日になるとオラクルは外部データをメッセージとして署名することで、事前に生成されたコントラウトのうちの1つのみが正当に実行できるようになるというものでした。オラクルが署名の一部を事前に公開することで、ユーザーは柔軟かつ無限に契約を作ることができるというのがDLCの画期的なアイディアではないでしょうか。
最後に、DLCの論文は9ページと少なく簡潔に纏まっていて綺麗だなと思いました。そのDLCの提案者のタッジはライトニングネットワークの共同提案者(もう1人はジョセフ・プーン)で、日本の大学でも数年間教鞭をとっていて、日本語が堪能なのもすごいですね。
DLCのオリジナル論文と、その日本語訳は以下より確認できます。