litでmacでdiscreet log contracts
Lightning networkでSmart contract
litはライトニングネットワーク上のスマートコントラクトの方向に向かっている。discreet log contractsと呼ぶ。Lightning Networkと共存できるため、高速で手数料のかからないやり取りができる。
gertjaapがdiscreet log contractsのWalkthroughをベルリンのオフチェーンワークショップでデモしてたため、それに基づいてtestnetでの実行手順をまとめる。
Env
- OS : Mac OS Sierra 10.12.6
- go : version 1.10
Setup
すでに二つのlit nodeが立ち上がっていることを前提とする。
二つのlit-afを開き、2ユーザ間での通信が可能な状態を作っておく。
Walkthrough
discreet log contractsのWalkthroughを実施する。
シナリオは、テスト用に設定されているOracleを二つのnodeに追加し、Oracleの値決定を持って資金移動を実施するというものだ。
Step 1 : Oracleの追加
双方のユーザで、すでに準備されているOracleのPublic Key(03c0d496ef6656fe102a689abc162ceeae166832d826f8750c94d797c92eedd465)を追加する。
第二引数の「Tutrial」は、このOracleの名前である。(多分なんでも良い)
dlc oracle add 03c0d496ef6656fe102a689abc162ceeae166832d826f8750c94d797c92eedd465 Tutorial
Oracle succesfully registered under ID 1
Step 2 : Contract作成
contractのドラフトを作成する。どちらでも良いが、片方のnodeで実行するだけで良い。このContractを他のnodeに送るからである。
dlc contract new
これに、Step 1で追加したOracleを設定する。
dlc contract setoracle 1 1
次に、決済タイミングを設定する。本来であれば未来時間を設定すべきだが、今回はテストなので過去時間(1528848000:2018/06/13 09:00:00 JST)を設定する。
dlc contract settime 1 1528848000
Oracleは、R-Pointと呼ばれるPublic Keyを発行する。これはOracleの発生時に作成されるが、今回はテスト用に用意されているOracleを使っているので、R-Pointも同様に用意済み(027168bba1aaecce0500509df2ff5e35a4f55a26a8af7ceacd346045eceb1786ad)である。
dlc contract setrpoint 1 027168bba1aaecce0500509df2ff5e35a4f55a26a8af7ceacd346045eceb1786ad
coin typeをBitcoin testnet3とする。
dlc contract setcointype 1 1
続いて、各nodeが資金を出す。今回は、1BTC = 100,000,000 satoshiとしている。
dlc contract setfunding 1 100000000 100000000
次に、Contractの境界を決める。テスト用のOracleでは、10000 - 20000の間の値に決定されるため、そこに設定する。値が20000であれば全資金を取得できるし、10000であればカウンターパーティに移動することになる。
dlc contract setdivision 1 20000 10000
設定されたContractを確認してみよう。
entered command: dlc contract view 1
Index : 1
Oracle public key : [03c0...ee...d465]
Oracle R-point : [0271...35...86ad]
Settlement time : Wed Jun 13 00:00:00 UTC 2018
Funded by us : 100000000
Funded by peer : 100000000
Coin type : 1
Peer : None
Status : Draft
Payout division:
Oracle value | Our payout | Their payout
------------------------------------------------------------------
0 | 0 | 200000000
3000 | 0 | 200000000
6000 | 0 | 200000000
9000 | 0 | 200000000
12000 | 40000000 | 160000000
15000 | 100000000 | 100000000
18000 | 160000000 | 40000000
21000 | 200000000 | 0
24000 | 200000000 | 0
27000 | 200000000 | 0
30000 | 200000000 | 0
最後に、作成したContractを送信する。
dlc contract offer 1 1
他のnodeからみたら(dlc contract ls)、divisionが反対になっていることがわかるはずだ。
Step 3 : Contract受け入れ
反対側のnodeで上記のcontractを受け入れる。
dlc contract accept 1
このtxがマイニングされると、statusがactiveに更新される。
Step 4: 決済
Oracleの値を掲示する。今回は15161
とする。ほぼ、中間だ。
この決済はどちらのnodeから実行しても良いが、今回はcontractを発行した第一nodeで実行する。
dlc contract settle 1 15161 9e349c50db6d07d5d8b12b7ada7f91d13af742653ff57ffb0b554170536faeac
ブロックチェーンを確認すると、微妙にだが、資金が移動していることを確認できるはずだ。