Return to site

MIT DCIのlitでマイクロペイメントを実施

· ライトニングネットワーク,lightning network,lit

今井です。

このブログで記載したMIT DCIのlitで遊んでみます。

lightningdとlndと違って、まだ複数のノードを経由したマイクロペイメントはできませんが、rhashを意識することなくマイクロペイメントを実行できる点で、他よりもシンプルであり使い易く感じます。

環境説明

OS: Linux
Destribution: Ubuntu 16.04

litのセットアップ

litもlnd同様にgolangで書かれています。lndと同様にgolangをインストールしてください。

$ wget https://storage.googleapis.com/golang/go1.7.4.linux-amd64.tar.gz
$ sudo mv go1.7.4.linux-amd64.tar.gz /usr/local/
$ cd /usr/local/
$ sudo mkdir go
$ sudo tar -C /usr/local -xzf go1.7.4.linux-amd64.tar.gz
$ cd go
$ vi ~/.bashrc # add paths for golang
$ tail -n 3 ~/.bashrc
export GOPATH=$HOME/.go
export PATH=$PATH:/usr/local/go/bin
export PATH=$PATH:$HOME/.go/bin
$ source ~/.bashrc

基本的には、githubのlitリポジトリを参照してください。

litbtcdのライブラリを使っていますが、まだbtcdはsegwitの対応がされていないのでgo getでインストールしようとするとエラーになります。このため、Thaddeus Dryja氏が開発しているbtcdフォークbtcutilフォークが必要になります。

$ go get github.com/mit-dci/lit # This fails but no problem for now.
$ cd $GOPATH/src/github.com/btcsuite/btcd
$ git remote add adiabat https://github.com/adiabat/btcd
$ git fetch adiabat
$ git checkout adiabat/master
$ cd ../btcutil
$ git remote add adiabat https://github.com/adiabat/btcutil
$ git fetch adiabat
$ git checkout adiabat/master
$ cd ../../mit-dci/lit/
$ go install
$ cd cmd/lit-af/
$ go install
$ cd
$ lit

lit node v0.0
-h for list of options.
No file .../testkey.hex, generating.
passphrase:
repeat passphrase:

Wrote encrypted key to .../testkey.hex
passphrase:

2017/02/04 16:07:04 made genesis block 00000020da33925b1f7a55e9fa8e6c955a20ea094148b60c5c88f69a4f500000000000003673b7b6ce8157d3cfcaf415b6740918df7610a8769d70334aa9abd9c941b25e7621215880ba371a85bf9646
2017/02/04 16:07:04 made genesis header 000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943
2017/02/04 16:07:04 created hardcoded genesis header at .../headers.bin
2017/02/04 16:07:04 opened header file .../headers.bin
NumKeys not in DB, must be new DB. 0 Keys
adr 0 hash is a28995a806c24ebd069dc64bdb6982a60ed9e44c
-- started BlockHandler, cap 1
2017/02/04 16:07:04 wrote 135 byte version message to [::1]:18333
2017/02/04 16:07:04 got 126 byte response 7e1101000d00000000000000987d955800000000000000000000000000000000000000000000ffff0000000000000d00000000000000000000000000000000000000000000000000d79f252d647544e1102f5361746f7368693a302e31332e312f9d98100001
command: version

...
Nothing to grab

...

litではbitcoindが必須ですが、2017年2月4日現在、上記の通りlitをオプションなしで実行すると172.16.120.201で稼働しているbitcoindに接続しようとします。このbitcoindはlit開発者Thaddeus Dryja氏が運用しているもので、テストネットで稼働しています。

bitcoindを自身でインストールして使う場合、以下の形でbitcoindが稼働しているサーバおよびポートを指定してください。また、必ずbitcoindをテストネットで稼働させてください。

$ lit -spv xxxxxx

litを操作するには、litにコマンドを送るためのコンマンドラインインターフェイスであるlit-afを使います。

$ lit-af

litにテスト用のbitcoinを送金

チャンネルをオープンしてみるにあたって、二つのlitノードが必要です。

このため、今回はさきほど起動したlit(以後Alice)と同じマシン上で別のlit(以後Bob)も立ち上げて通信させることにします。

デフォルトのrpcポートが9750なので、9751番ポートを使用します。

$ lit -rpcport 9751 -dir $HOME/.lit2

$ lit-af -p 9751

まずそれぞれのノードの状態を確認してみます。

ここではチャンネルの状態、トランザクションid、Bitcoinアドレスが確認できます。

[Alice]

$ lit-af
lit-af# ls
entered command: ls

Addresses:
0 H5qcgzcMWUC5hmbj1GtJTJqWrWHUZEg6HHvZQ (mvLNag9g3bHwL18cgJVfymuRbR13FFzUN8)
Utxo: 0 Conf:0 Channel: 0
Sync Height 1087645

[Bob]

lit-af# ls
entered command: ls

Addresses:
0 H5qcout3KX86crZo6AMZnZVXjSAj5WYsjB3rD (n3FeGVCc4WNuQ625wdkKzeqJqwGuuoacuo)
Utxo: 0 Conf:0 Channel: 0
Sync Height 1087645

最初に実行するときには、一つのBitcoinアドレスだけ生成されている状態になっています。

H5から始まるアドレスがSegwitアドレス P2WPKH、nから始まるアドレスがBitcoinテストネットアドレス P2PKHです。この両者は同じ秘密鍵と公開鍵から生成されますが、アドレスとしては別々の表現になります。

まずはP2PKHアドレスに対して、bitcoinを送金します。

$ bitcoin-cli sendtoaddress mvLNag9g3bHwL18cgJVfymuRbR13FFzUN8 0.1
f4f0ee50735baa56b8eb24d279954facf406db7efaa70a27ca738d130a6496db

送金後のAliceの状態は以下になります。

[Alice]

lit-af# ls
entered command: ls

Txos:
0 f4f0ee50735baa56b8eb24d279954facf406db7efaa70a27ca738d130a6496db:0 h:1087646 amt:10000000 /44'/0'/0'/0'/0' non-witness
Addresses:
0 H5qcgzcMWUC5hmbj1GtJTJqWrWHUZEg6HHvZQ (mvLNag9g3bHwL18cgJVfymuRbR13FFzUN8)
Utxo: 10000000 Conf:10000000 Channel: 0
Sync Height 1087646

しかし、このままではP2PKHアドレスへの送金になっており、ライトニングネットワークで利用できません。なので、もう一つのアドレス P2WPKHに送金をする必要があります。

ご存知の方もいるかもしれませんが、Segwitアドレスの仕様が書かれているBIP142に上記のH5から始まるアドレスはありません。現在、BIP142は「延期(deffered)」という状態になっており、アドレス仕様が調整されています。litにおけるSegwitアドレスはBIP142にないものですが、P2WPKHアドレスです。

P2WPKHアドレスに送金をするには、lit-afにあるsendコマンドを通して行います。AliceからAliceに以下のようにしてP2WPKHアドレスに送金をします。

[Alice]

lit-af# send H5qcgzcMWUC5hmbj1GtJTJqWrWHUZEg6HHvZQ 8000000
entered command: send H5qcgzcMWUC5hmbj1GtJTJqWrWHUZEg6HHvZQ 8000000

send 8000000 to address: H5qcgzcMWUC5hmbj1GtJTJqWrWHUZEg6HHvZQ
sent txid(s):
0 baa6f3d179c06eaa66e7d8eff1efbe49c57222fbb1b44f138ba122733ec91a41

P2WPKHアドレスへの送金後のAliceの状態は以下になり、ブロックチェーンエクスプローラーで見ると以下になります。

[Alice]

lit-af# ls
entered command: ls

Txos:
0 baa6f3d179c06eaa66e7d8eff1efbe49c57222fbb1b44f138ba122733ec91a41:0 h:1087647 amt:1982880 /44'/0'/0'/0'/1'
1 baa6f3d179c06eaa66e7d8eff1efbe49c57222fbb1b44f138ba122733ec91a41:1 h:1087647 amt:8000000 /44'/0'/0'/0'/0'
Addresses:
0 H5qcgzcMWUC5hmbj1GtJTJqWrWHUZEg6HHvZQ (mvLNag9g3bHwL18cgJVfymuRbR13FFzUN8)
1 H5qcqK3QanUVy69ggB4FqX88FprfLVveDeH39 (n4eodkTxTrcVHg2ndghxbBDznCGHeDwx1K)
Utxo: 9982880 Conf:9982880 Channel: 0
Sync Height 1087647

litでチャンネルオープン

AliceとBobの間でチャンネルをオープンします。

チャンネルをオープンする前にAliceとBobを接続する必要があります。これはどちらから接続しても構いません。今回は、BobからAliceに接続します。この時点ではまだチャンネルは開いてないです。

接続するにあたり、Alice側で接続先ポートを開いてあげます。

[Alice]

lit-af# lis
entered command: lis

listening on :2448 with key H5qcUKH12WPxj4vroDZssxsmJAAMVxX9RoGCr

最後に書かれているH5qcUKH12WPxj4vroDZssxsmJAAMVxX9RoGCrがノードidです。

[Bob]

lit-af# con H5qcUKH12WPxj4vroDZssxsmJAAMVxX9RoGCr@xxx.xxx.xxx.xxx
entered command: con H5qcUKH12WPxj4vroDZssxsmJAAMVxX9RoGCr@xxx.xxx.xxx.xxx

connected to peer [23 119 178 142 223 68 75 85 156 138 60 166 51 73 83 91 249 180 84 87]@xxx.xxx.xxx.xxx:2448

上記の「xxx.xxx.xxx.xxx」にはこのマシンのIPアドレスが入ります。

AliceとBobが接続されたので、AliceからBobに対してチャンネルを開いてみます。

[Alice]

lit-af# fund 1 3000000 0
entered command: fund 1 3000000 0

funded channel 1

今回は3,000,000satoshiを初期チャンネル用にデポジットしました。

チャンネルを開くとlitの状態は以下のようになります。

[Alice]

lit-af# ls
entered command: ls

1 xxx.xxx.xxx.xxx:42402
Channels:
Channel 1 (peer 1) 083eb0c7e6011d09d7a1f74b6eddb105e89cdaf30db6b32754d1ba5b84ac5c7a:0
cap: 3000000 bal: 3000000 h: -1 state: 0
Txos:
0 baa6f3d179c06eaa66e7d8eff1efbe49c57222fbb1b44f138ba122733ec91a41:0 h:1087647 amt:1982880 /44'/0'/0'/0'/1'
1 083eb0c7e6011d09d7a1f74b6eddb105e89cdaf30db6b32754d1ba5b84ac5c7a:1 h:0 amt:4988160 /44'/0'/0'/0'/2'
Addresses:
0 H5qcgzcMWUC5hmbj1GtJTJqWrWHUZEg6HHvZQ (mvLNag9g3bHwL18cgJVfymuRbR13FFzUN8)
1 H5qcqK3QanUVy69ggB4FqX88FprfLVveDeH39 (n4eodkTxTrcVHg2ndghxbBDznCGHeDwx1K)
2 H5qcYuK82FHdNZR9rEdH1Zc5EVKk9rQiHd9Pc (mnF5MBvmbG5kkr6MerkSY9tTs1cmobPLM5)
Utxo: 6971040 Conf:1982880 Channel: 3000000
Sync Height 1087647

[Bob]

lit-af# ls
entered command: ls

1 xxx.xxx.xxx.xxx:2448
Channels:
Channel 1 (peer 1) 083eb0c7e6011d09d7a1f74b6eddb105e89cdaf30db6b32754d1ba5b84ac5c7a:0
cap: 3000000 bal: 0 h: 0 state: 0
Addresses:
0 H5qcout3KX86crZo6AMZnZVXjSAj5WYsjB3rD (n3FeGVCc4WNuQ625wdkKzeqJqwGuuoacuo)
Utxo: 0 Conf:0 Channel: 0
Sync Height 1087647

litではチャンネルを開くために待っている必要はないです。このあとすぐに、マイクロペイメントを行うことができます。

ただ、実際には裏でチャンネルを開くためのトランザクション(opening channel tx)がブロードキャストされています。厳密には、このトランザクションがブロックチェーンに取り込まれたことが確認され、チャンネルオープンが完了します。

Aliceの「channel 1」のところにブロック高"h"がありますが、これが"-1"になっているということはまだ取り込まれていないということです。

opening channel txをブロックチェーンエクスプローラーで見るとこんな感じになっています。

litでのライトニングネットワーク送金

準備が整ったので、マイクロペイメントを行ってみます。送金にはpushを使います。引数にはチャンネルidを指定してあげます。

まずは、50,000satoshiを送って状態を確認してみます。

[Alice]

lit-af# push 1 50000
entered command: push 1 50000

Pushed 50000 at state 0
lit-af# ls
entered command: ls

1 xxx.xxx.xxx.xxx:42402
Channels:
Channel 1 (peer 1) 083eb0c7e6011d09d7a1f74b6eddb105e89cdaf30db6b32754d1ba5b84ac5c7a:0
cap: 3000000 bal: 2950000 h: -1 state: 1
Txos:
0 baa6f3d179c06eaa66e7d8eff1efbe49c57222fbb1b44f138ba122733ec91a41:0 h:1087647 amt:1982880 /44'/0'/0'/0'/1'
1 083eb0c7e6011d09d7a1f74b6eddb105e89cdaf30db6b32754d1ba5b84ac5c7a:1 h:0 amt:4988160 /44'/0'/0'/0'/2'
Addresses:
0 H5qcgzcMWUC5hmbj1GtJTJqWrWHUZEg6HHvZQ (mvLNag9g3bHwL18cgJVfymuRbR13FFzUN8)
1 H5qcqK3QanUVy69ggB4FqX88FprfLVveDeH39 (n4eodkTxTrcVHg2ndghxbBDznCGHeDwx1K)
2 H5qcYuK82FHdNZR9rEdH1Zc5EVKk9rQiHd9Pc (mnF5MBvmbG5kkr6MerkSY9tTs1cmobPLM5)
Utxo: 6971040 Conf:1982880 Channel: 2950000
Sync Height 1087647

[Bob]

lit-af# ls
entered command: ls

1 xxx.xxx.xxx.xxx:2448
Channels:
Channel 1 (peer 1) 083eb0c7e6011d09d7a1f74b6eddb105e89cdaf30db6b32754d1ba5b84ac5c7a:0
cap: 3000000 bal: 50000 h: 0 state: 1
Addresses:
0 H5qcout3KX86crZo6AMZnZVXjSAj5WYsjB3rD (n3FeGVCc4WNuQ625wdkKzeqJqwGuuoacuo)
Utxo: 0 Conf:0 Channel: 50000
Sync Height 1087647

次に、10,001satoshiを送って状態を確認してみます。

[Alice]

lit-af# push 1 10001
entered command: push 1 10001

Pushed 10001 at state 1
lit-af# ls
entered command: ls

1 xxx.xxx.xxx.xxx:42402
Channels:
Channel 1 (peer 1) 083eb0c7e6011d09d7a1f74b6eddb105e89cdaf30db6b32754d1ba5b84ac5c7a:0
cap: 3000000 bal: 2939999 h: -1 state: 2
Txos:
0 baa6f3d179c06eaa66e7d8eff1efbe49c57222fbb1b44f138ba122733ec91a41:0 h:1087647 amt:1982880 /44'/0'/0'/0'/1'
1 083eb0c7e6011d09d7a1f74b6eddb105e89cdaf30db6b32754d1ba5b84ac5c7a:1 h:0 amt:4988160 /44'/0'/0'/0'/2'
Addresses:
0 H5qcgzcMWUC5hmbj1GtJTJqWrWHUZEg6HHvZQ (mvLNag9g3bHwL18cgJVfymuRbR13FFzUN8)
1 H5qcqK3QanUVy69ggB4FqX88FprfLVveDeH39 (n4eodkTxTrcVHg2ndghxbBDznCGHeDwx1K)
2 H5qcYuK82FHdNZR9rEdH1Zc5EVKk9rQiHd9Pc (mnF5MBvmbG5kkr6MerkSY9tTs1cmobPLM5)
Utxo: 6971040 Conf:1982880 Channel: 2939999
Sync Height 1087647

[Bob]

lit-af# ls
entered command: ls

1 xxx.xxx.xxx.xxx:2448
Channels:
Channel 1 (peer 1) 083eb0c7e6011d09d7a1f74b6eddb105e89cdaf30db6b32754d1ba5b84ac5c7a:0
cap: 3000000 bal: 60001 h: 0 state: 2
Addresses:
0 H5qcout3KX86crZo6AMZnZVXjSAj5WYsjB3rD (n3FeGVCc4WNuQ625wdkKzeqJqwGuuoacuo)
Utxo: 0 Conf:0 Channel: 60001
Sync Height 1087647

チャンネルをクローズして、送金結果が実際にブロックチェーンに反映されているかチェック

最後に、チャンネルをクローズします。クローズする際は、チャンネルidを指定します。

[Alice]

lit-af# close 1
entered command: close 1

OK closed

チャンネルをクローズの命令を出した直後だと、AliceとBobの状態クローズ前と変わりませんが、チャンネルを閉じるためのトランザクション(closing channel tx)がブロックチェーンに取り込まれると以下の状態になります。

[Alice]

lit-af# ls
entered command: ls

1 xxx.xxx.xxx.xxx:42402
Channels:
Closed 1 (peer 1) 083eb0c7e6011d09d7a1f74b6eddb105e89cdaf30db6b32754d1ba5b84ac5c7a:0
cap: 3000000 bal: 2939999 h: 1087648 state: 2
Txos:
0 baa6f3d179c06eaa66e7d8eff1efbe49c57222fbb1b44f138ba122733ec91a41:0 h:1087647 amt:1982880 /44'/0'/0'/0'/1'
1 083eb0c7e6011d09d7a1f74b6eddb105e89cdaf30db6b32754d1ba5b84ac5c7a:1 h:1087648 amt:4988160 /44'/0'/0'/0'/2'
2 e8956dd6bddb94ff435c043fb05377131c0cd94bf1a5e7dcf6f0f46e17f395e6:1 h:1087650 amt:2934999 /44'/0'/30'/1'/1'
Addresses:
0 H5qcgzcMWUC5hmbj1GtJTJqWrWHUZEg6HHvZQ (mvLNag9g3bHwL18cgJVfymuRbR13FFzUN8)
1 H5qcqK3QanUVy69ggB4FqX88FprfLVveDeH39 (n4eodkTxTrcVHg2ndghxbBDznCGHeDwx1K)
2 H5qcYuK82FHdNZR9rEdH1Zc5EVKk9rQiHd9Pc (mnF5MBvmbG5kkr6MerkSY9tTs1cmobPLM5)
Utxo: 9906039 Conf:9906039 Channel: 2939999
Sync Height 1087650

[Bob]

lit-af# ls
entered command: ls

1 xxx.xxx.xxx.xxx:2448
Channels:
Closed 1 (peer 1) 083eb0c7e6011d09d7a1f74b6eddb105e89cdaf30db6b32754d1ba5b84ac5c7a:0
cap: 3000000 bal: 60001 h: 1087648 state: 2
Txos:
0 e8956dd6bddb94ff435c043fb05377131c0cd94bf1a5e7dcf6f0f46e17f395e6:0 h:1087650 amt:55001 /44'/0'/30'/1'/1'
Addresses:
0 H5qcout3KX86crZo6AMZnZVXjSAj5WYsjB3rD (n3FeGVCc4WNuQ625wdkKzeqJqwGuuoacuo)
Utxo: 55001 Conf:55001 Channel: 60001
Sync Height 1087650

以下の通り、このマイクロペイメントがブロックチェーン外の取引ではなく、実際にブロックチェーンに載っていることがわかります。

クローズの際に、トランザクション手数料10,000satoshiがAliceとBobに等分に分けられて支払われていることもわかります。

All Posts
×

Almost done…

We just sent you an email. Please click the link in the email to confirm your subscription!

OKSubscriptions powered by Strikingly