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  

ブロックチェーンを確認すると、微妙にだが、資金が移動していることを確認できるはずだ。