Return to site

ライトニングラボのlndでマイクロペイメントを実施

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

今井です。

このブログで記載したライトニングラボのlndで遊んでみます。

行うことは、基本的に大石哲之氏のブログ「ライトニングネットワーク送金の動作実証手順:1ミリサトシを送ってみた」lnd版です。

ここでは、最終的にクローズトランザクションをブロックチェーンで確認し、オンチェーンになるまで追っています。

複数のノードを経由させてマイクロペイメントを行うのがライトニングネットワークの面白いところですが、今回はマイクロペイメントチャンネルを開いているノード同士でのマイクロペイメントをやります。

環境説明

OS: Linux
Destribution: Ubuntu 16.04

btcdのセットアップ

lndを使うにはbtcdを先にインストールする必要があります。btcdはBitcoinフルノードで、bitcoindとは違うgolangで書かれているフルノードです。

2017年1月中にはまだbtcdのmasterブランチがsegwit対応していないので、lndを開発しているRoasbeef氏が開発しているbtcdフォークを使ってインストールしてください。

インストール手順については、btcdフォークのREADMEを参照ください。

最初この辺りがよくわからずgithub issueを出したりしていました。もしインストール時にエラーが発生した場合はこのissueを確認してみてください。

lndのセットアップ

まずgolangをインストールします。2017年2月1日現在バージョン1.7.5が最新版ですが、ここでは1.7.4を使います。

$ wget https://storage.googleapis.com/golang/go1.6.4.linux-amd64.tar.gz
$ sudo mv go1.6.4.linux-amd64.tar.gz /usr/local/
$ cd /usr/local/
$ sudo mkdir go
$ sudo tar -C /usr/local -xzf go1.6.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 ~/.bashr

golangのインストールが終わったら、lndのインストールです。

$ go get -u github.com/Masterminds/glide
$ git clone https://github.com/lightningnetwork/lnd $GOPATH/src/github.com/lightningnetwork/lnd
$ cd $GOPATH/src/github.com/lightningnetwork/lnd
$ glide install
$ go install . ./cmd/...

lndでチャンネルオープン

AliceとBobの間で、チャンネルを開いてみます。

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

[Alice]

$ lncli getinfo
{
"identity_pubkey": "02ce3be4834caf5f68781d08e1db0b4db6efdb4bd5d45b6a9db868383dc97f93b9",
"block_height": 1085290,
"block_hash": "000000000000020163b6b113cd21ce2e79df6a410432102c855a1735ba3c423f",
"testnet": true
}
$ lncli walletbalance --witness_only=true
{
"balance": 0.2
}

[Bob]

$ lncli getinfo
{
"identity_pubkey": "03e0c5508be7efdf613ea0ea3ad0e4ddad4232be781ae0971f09147dc7085a032e",
"block_height": 1085318,
"block_hash": "0000000000000b9f45206b1ea489ab346342e923f32fc93669150f1fd65ceb75",
"synced_to_chain": true,
"testnet": true
}
$ lncli walletbalance --witness_only=true
{
"balance": 0.2
}

Aliceのlndノードidが「02ce3be4834caf5f68781d08e1db0b4db6efdb4bd5d45b6a9db868383dc97f93b9」、Bobのlndノードidが「03e0c5508be7efdf613ea0ea3ad0e4ddad4232be781ae0971f09147dc7085a032e」です。

今回はAliceからBobにチャンネルを開いてみます。ただ、このチャンネルはbi-directional(双方向)チャンネルなので、どちらから開いても同じです。

まずAliceのノードとBobのノードを接続します。

[Alice]

$ lncli connect 03e0c5508be7efdf613ea0ea3ad0e4ddad4232be781ae0971f09147dc7085a032e@btc2.frontier-ptnrs.com:10011
{}

 

正常に接続できると、listpeersgetnodeinfoで相手ノードの情報が確認できるようになります。

[Alice]

$ lncli listpeers
{
"peers": [
{
"pub_key": "03e0c5508be7efdf613ea0ea3ad0e4ddad4232be781ae0971f09147dc7085a032e",
"peer_id": 1,
"address": "160.16.233.215:10011",
"bytes_sent": 510,
"bytes_recv": 510
}
]
}
$ lncli getnodeinfo --pub_key=03e0c5508be7efdf613eaea3ad0e4ddad4232be781ae0971f09147dc7085a032e
{
"node": {
"last_update": 1485003335,
"pub_key": "03e0c5508be7efdf613ea0ea3ad0e4ddad4232be781ae0971f09147dc7085a032e",
"address": "[::]:10011",
"alias": "03e0c5508be7efdf613e"
}
}

AliceからBobに双方向チャンネルを開いてみます。

openchannelコマンドを実行すると、プロンプト待ち状態になります。これは、--blockをつけているためです。

[Alice]$ lncli openchannel --node_key=03e0c5508be7efdf613ea0ea3ad0e4ddad4232be781ae0971f09147dc7085a032e --local_amt=1000000 --num_confs 1 --block
{
"channel_point": "4fd6ae514f6a0464771757ec4a4a49c77698d635da2e6c0335dbcdec741da08b:0"

}

すると、listchannelsでチャンネル状態が確認できるようになります。

[Alice]

$ lncli listchannels
{
"channels": [
{
"remote_pubkey": "03e0c5508be7efdf613ea0ea3ad0e4ddad4232be781ae0971f09147dc7085a032e",
"channel_point": "4fd6ae514f6a0464771757ec4a4a49c77698d635da2e6c0335dbcdec741da08b:0",
"chan_id": 1193327457417101312,
"capacity": 1005000,
"local_balance": 1000000
}
]
}

チャンネルオープンが完了すると、オープントランザクションを確認できるようになります。

testnet.smartbit.com.auはsegwit対応しているブロックチェーンエクスプローラーです。segwit対応していないと、ライトニングネットワークのトランザクションは見えない、または不明と表示されます。

以下URLを開くとアウトプットにwitness_v0_scripthashというのがあります。これが、チャンネルを開くときに必要なAliceとBobのマルチシグアドレスへの送金です。

[TX for opening channel: ]

https://testnet.smartbit.com.au/tx/4fd6ae514f6a0464771757ec4a4a49c77698d635da2e6c0335dbcdec741da08b

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

今回の送金は2回に分けて送ります。

1回目は10000satoshi、2回目は1satoshiです。

[Alice]

$ lncli sendpayment --pay_req=yxockwrmh9z76aj6wdidi8r5sswrci6xypqbfa9brk85taemeb1hyc4qaw7qr7wwn5o7tujqs7sezqk9gy7rzuqxb94fsgidsedxx4yyyyyyyyyyyutbcr437zy
{
"payment_route": {
"total_time_lock": 1,
"total_amt": 10000,
"hops": [
{
"chan_id": 1193327457417101312,
"chan_capacity": 1000000,
"amt_to_forward": 10000
}
]
}
}
$ lncli listchannels
{
"channels": [
{
"remote_pubkey": "03e0c5508be7efdf613ea0ea3ad0e4ddad4232be781ae0971f09147dc7085a032e",
"channel_point": "4fd6ae514f6a0464771757ec4a4a49c77698d635da2e6c0335dbcdec741da08b:0",
"chan_id": 1193327457417101312,
"capacity": 1005000,
"local_balance": 990000,
"remote_balance": 10000,
"total_satoshis_sent": 10000,
"num_updates": 2
}
]
}
$ lncli sendpayment --pay_req=yxockwrmh9z76aj6wdidiw8r5sswrci6xypqbfa9brk85taemeb17uizy7mhsebdkmg3r4z7ibu7niaz6xxa4buxycrban9p8x678byoyyyyyyyyyyyyd9xgdnro
{
"payment_route": {
"total_time_lock": 1,
"total_amt": 1,
"hops": [
{
"chan_id": 1193327457417101312,
"chan_capacity": 1000000,
"amt_to_forward": 1
}
]
}
}
$ lncli listchannels
{
"channels": [
{
"remote_pubkey": "03e0c5508be7efdf613ea0ea3ad0e4ddad4232be781ae0971f09147dc7085a032e",
"channel_point": "4fd6ae514f6a0464771757ec4a4a49c77698d635da2e6c0335dbcdec741da08b:0",
"chan_id": 1193327457417101312,
"capacity": 1005000,
"local_balance": 989999,
"remote_balance": 10001,
"total_satoshis_sent": 10001,
"num_updates": 4
}
]
}

$ lncli walletbalance
{
"balance": 0.18993
}

 

送るごとに、local_balanceが減り、remote_balanceが増えていることがわかります。

上記送金をする際に、pay_reqというパラメータをsendpaymentコマンドに渡しています。これはAliceが送金をする前にBobが以下の方法で生成して、Aliceに渡す必要があります。いわゆるrhashではなく、lnd内で通用するリクエストidのようです。

現状これは手動ですが、将来的には自動化しないとですね。

そして、Bobがpay_reqを生成するときにAliceが送る金額とvalueパラメータの値を合わせないといけないです。

[Bob]

$ lncli addinvoice --value=10000
{
"r_hash": "019a7629d713b4a0b70ec66975bb645dcaf981d25e6e787fa2d8d51d9037bf40",
"pay_req": "yxockwrmh9z76aj6wdidiw8r5sswrci6xypqbfa9brk85taemeb1hyc4qaw7qr7wwn5o7tujqs7sezqk9gy7rzuqxb94fsgidsedxx4yyyyyyyyyyyutbcr437zy"
}
$ lncli addinvoice --value=1
{
"r_hash": "ceb70757cb202352cd926afda867d15717f3df8d066f03081c0bed3bfdd38410",
"pay_req": "yxockwrmh9z76aj6wdidiw8r5sswrci6xypqbfa9brk85taemeb17uizy7mhsebdkmg3r4z7ibu7niaz6xxa4buxycrban9p8x678byoyyyyyyyyyyyyd9xgdnro"
}

 

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

最後に、チャンネルをクローズします。

送金時はオフチェーントランザクションを使うので、途中のトランザクションはブロックチェーンに反映はされませんが、チャンネルをクローズするとブロックチェーンに反映されるようになります。

[Alice]

$ lncli closechannel --funding_txid=4fd6ae514f6a0464771757ec4a4a49c77698d635da2e6c0335dbcdec741da08b --output_index=0 --block
{
"closing_txid": "7b2fbe438206c40c4aaf5b52588ddeebd526b88861637efdaa2ebca0f5c98716"
}

 

closechannelコマンドを実行すると、プロンプト待ち状態になります。これは、--blockをつけているためです。

トランザクションが承認されると、チャンネルのクローズ完了です。

[Alice]

$ lncli walletbalance
{
"balance": 0.19977999
}

[Bob]

$ lncli walletbalance
{
"balance": 0.20010001
}

以下URLを開くとアウトプットにwitness_v0_scripthashというのが二つあります。

0.00010001 BTCがBob側へのアウトプット、0.00984999 BTCがAlice側へのアウトプットです。

TX for closing channel: https://testnet.smartbit.com.au/tx/7b2fbe438206c40c4aaf5b52588ddeebd526b88861637efdaa2ebca0f5c98716

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