Edited at

Discreet Log Contractsについて (概要)

More than 1 year has passed since last update.


  • 理解しきれてない部分もあるので間違っていたらごめんなさい

原論文

https://adiabat.github.io/dlc.pdf

解説されてるスライド?

https://bc-2.jp/materials/0305_DiscreetLogContracts.pdf

概要

Bitcoinを使って分散予測市場を作るためのコントラクト(Bitcoinスクリプトとその利用方法)を考えだした論文。

AugurなどはEthereum上にプログラムとして書かれているが、それを用いなくても良くなる。
また、Lightning Networkと共存できるため、高速で手数料のかからないやり取りができる。

この投稿は翻訳ではなく、単なるまとめ的なものなので詳細は原論文を解読してください。


(前提)Schnorr署名についての知識

詳細はこちら

署名者は秘密鍵と、加えて乱数を生成


  • A = aG ( A:公開鍵, a:秘密鍵)

  • R = kG (k:ランダムな自然数)

s = k - h(m, R)a を計算し、(R,s)を署名として公開

署名検証

公開された(A,m,R,s)より


  • sG = R- h(m,R)A

が成立すれば検証完了(代入すると同じになるため)



Discrete Log Contractsの流れ


登場人物

Alice <-> Bob (将来のある時点での日本円価格の予測をし、賭けをする)

Olivia: oracle(仲介者)

① Olivia

公開する: V ( V= vG) (G:ベースポイント 楕円曲線?)

公開する: R ( R = kG) k: ランダムな自然数

Rは署名の時に一度だけ使われる。

Oliviaはランダムな自然数kを生成する。

kは複数生成され、毎回R = kGを計算、meta dataと同時にRを公開

 meta data: mに値を入れる時の形式を定義したもの

例)ここではjson形式で {name: value} をテンプレートにしてます。

  {jpy-in-satoshis: 1050} 対象の予測値が1つの場合

{ btc: 10000, ltc: 20000} 2つの場合
など

今回はm=1000など、そのまま数値をmに代入していきます。

② Bob,Alice

multisigアドレスに二人共BTCをデポジットし、コントラクトを含んだトランザクションに署名してbroadcastする。

③ closing transaction作成

TX1, TX2, .....,TXi,.....

これは以下のPubkeyに送金するトランザクションである。


  • Pubi = PubAlice + siG

  • siG = R - h(i, R)V

iは署名するメッセージ部分だが、ここはOliviaの公開したmeta data形式に従って入力してRを計算しないといけない。

無数のあり得る日本円価格(satohis換算)に対してclosing transactionsをAliceとBobはそれぞれ作成し署名して、お互いに交換しておく。(いつでもClosing Transactionをブロードキャストできる)

=>signed Contract Execution Transactions(CET)

④ Olivia(金曜日になったら)

1050 satohis/yenになっていた。

m=1050として、

s1050 = s = k- h(1050,R)v

が計算できるので、計算し、公開する。

⑤ Bob,Aliceはs1050 に対応した秘密鍵を得ることができる。

PubAlice = aGより


  • Pub1050 = PubAlice + s1050G
    = aG + s1050G
    =(a+s1050)G

Priv1050 = a + s1050

Alice、Bob共にPub1050 に対するトランザクションにPriv1050 を使用して署名し、ブロードキャストする。

これによって最初に作ったmultisig address から双方とも出金できる。

(Aliceの予測が外れてしまって逃げた場合どうなるのか?当初のcontract(Bitcoin Script)にはOP_CLTVなどで期間が設定されており、期間を過ぎたらBobは全額出金できるため、逃げたらBobが得をすることになる。)