- 理解しきれてない部分もあるので間違っていたらごめんなさい
原論文
https://adiabat.github.io/dlc.pdf
解説されてるスライド?
https://bc-2.jp/materials/0305_DiscreetLogContracts.pdf
概要
Bitcoinを使って分散予測市場を作るためのコントラクト(Bitcoinスクリプトとその利用方法)を考えだした論文。
AugurなどはEthereum上にプログラムとして書かれているが、それを用いなくても良くなる。
また、Lightning Networkと共存できるため、高速で手数料のかからないやり取りができる。
この投稿は翻訳ではなく、単なるまとめ的なものなので詳細は原論文を解読してください。
##(前提)Schnorr署名についての知識
詳細は[こちら] (https://blog.visvirial.com/articles/721)
署名者は秘密鍵と、加えて乱数を生成
- 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が得をすることになる。)