lndを家で立ち上げ、今度こそTシャツ買う!

Masashi Nakane
暗号通貨 とセキュリティ
23 min readJul 3, 2018

lndは、知る限り、c-lightningよりもコミュニティも活発だ。オープンソースで開発している会社自体は、完全にlightningに特化しているlightning labs社である。そのlnd(lightning Network Daemon)を今回はlinuxにインストールし、MainnetのBitcoinを使って、今度は、Hodl MonkeyからTシャツを買ってみよう。

c-lightningもlndの、両方のlightningサーバー/ノードのソフトは、おなじ仕様書をもとに実装されており、BOLTと呼ばれる。以下のGithubレポジトリで、ドキュメントが管理されている。

https://github.com/lightningnetwork/lightning-rfc/blob/master/00-introduction.md

lndのインストールドキュメントによると、バックエンドには、btcdというgolangで書かれたBitcoinデーモンを使うのが標準のようだが、ここでは、前回のc-lightningのバックエンドに使ったbitcoindをそのまま利用する。なので、インストール自体は、lndだけとなる。ただし、c-lightningとlndは同時に実行し1つのBitoindをつかうと不具合がでる(らしい)ので、c-lightningは停止することになる。おおまかな手順は、以下となる。

  1. c-lightningは止め、bitcoind を起動オプションをlnd用に少し変えて再起動する
  2. lndをインストールし、lndをbitcoindをバックエンドに設定して起動する

3. FundingしPaymentチャネルを開く

4. Lightning network対応オンラインストア(Hodl Monkey)で買い物をし,チェックアウトのページからBOLT11インボイスをコピー

5.lncli(lightning コマンドライン)で支払をする

6. Paymentチャネルを閉じ、残高を引き出す

さあ、こんどこそは、Tシャツを買ってみよう。

1.bitcoind を起動オプションをlnd用に少し変えて再起動する

もし,c-lightningデーモンが走っている場合、まずは、c-lightningを停止しよう。あと設定を変えるので、bitcoindも一旦終了しよう。

lightning-cli stop
bitcoin-cli stop

lndのバックエンドにbitcoind(c言語実装)を使うためには、前回の起動方法から少々変更が必要だ。lndのインストラクションにあるように、デフォルトだとオフになっているindexとzmqを有効にしなければならない。

ホームディレクトリに、できているとおもうが、~/.bitcoinディレクトリに以下の設定ファイルを作成し、bitcoindだけ再起動する。テキストエディターはなんでもよいが、viが苦手なばあいはnanoを使おう。

nano ~/.bitcoin/bitcoin.conf

内容は以下となる。rpcuserとrpcpasswordは、自分の忘れないものに設定して欲しい。

txindex=1
reindex=1
server=1
daemon=1
zmqpubrawblock=tcp://127.0.0.1:28332
zmqpubrawtx=tcp://127.0.0.1:28332
rpcuser=<some user name for lnd to connect>
rpcpassword=<some password for lnd to connect>

そして起動する。

masa@masa-Vostro-3800:~$ bitcoind -daemon
Bitcoin server starting

これにより、lndとメッセージをやりとりするためのzmqというメッセージングサービスが起動し、そして、ブロックチェーンのindexが作成されはじめるが、この作成には、けっこう時間がかかる。著者のうけた感じでは、24時間ほどかかり、(もっと早いかも、ちゃんと図ってないので分かったら教えてください)完了するまでは、lndからの接続がうまくいかない。そのために、最初にここでbitcoindを起動した。indexが出来上がる間にlndのほうをやっつけよう。

2.lndをインストールする

参考資料は、正式なインストラクションを参照した。まずは、GoLangの1.10をインストール。

sudo apt-get install golang-1.10-go

goのバイナリーに、PATHを通すために、シンボリックリンクを作成する。

sudo ln -s /usr/lib/go-1.10/bin/go /usr/local/bin/go

goの依存ファイルや、lndなどのプロジェクトフォルダが自動で作成されるディレクトリの$GOPATHやビルドされたバイナリーが保存されるbinディレクトリをPATH環境変数に設定する。毎回、手動では面倒くさいのでログイン時に自動で設定されるように以下の行を~/.profileの最後ほうに追加する。nanoなどで編集しよう。

nano ~/.profile
export GOPATH=~/gocode
export PATH=$PATH:$GOPATH/bin

依存関係の管理のために、depというものをインストールする。

go get -u github.com/golang/dep/cmd/dep

もし、以下のエラーが出たらgithubのアカウントのメールアドレスの設定が必要。(git自体がインストールされない場合は、こちら参照で。)

fatal: could not read Username for ‘https://github.com': terminal prompts disabled

gitの設定ファイルにメールアドレスを設定し、再度depをインストール。

git config — global user.name <your email for github>

ここまでで、事前準備が完了したので、lndのビルドを開始する。

go get -d github.com/lightningnetwork/lnd
cd $GOPATH/src/github.com/lightningnetwork/lnd
make && make install

ビルドが終わったら、隣で走っているbitcoinフルノードに接続するように、lndを起動してみよう。この時点で、bitcoindのインデックス作成が完了していないとエラーが出ると思うので、出た場合は、終わるまで待つ。

lnd --bitcoin.active --bitcoin.mainnet --debuglevel=debug --bitcoin.node=bitcoind --bitcoind.zmqpath=tcp://127.0.0.1:28332 --bitcoind.rpcuser=<your userid>--bitcoind.rpcpass=<your password>

起動したら今度は、コマンドラインツールで、ウオレットを作成し、アンロックする。別の新しいターミナルを開くとよいだろう。まずは、ヘルプをみてみよう。

lncli help

Startup:というセクションにあるcreateでウオレット作成をやってみよう。

lncli create

ウオレットのパスフレーズをいれると、ウオレットが作成され、秘密鍵紛失時のための復活の呪文になるネモニックフレーズが出てくるので、メモして、安全なところに隠しておこう。

ウオレットのロックを解除し、残高をみてみよう。当然ゼロだ。

masa@masa-Vostro-3800:~$ lncli unlock
Input wallet password:
masa@masa-Vostro-3800:~$ lncli walletbalance
{
"total_balance": "0",
"confirmed_balance": "0",
"unconfirmed_balance": "0"
}

ウオレットのアドレスを新規作成してみよう。互換性の高い、3で始まるnp2wkh( Pay to Nested Witness Key Hash)のアドレスを作ってみよう。

masa@masa-Vostro-3800:~$ lncli newaddress np2wkh
{
"address": "38PuvUTM6gvtwqwfLEirm7gcz5WACfwVwN"
}

さあ、これ以降は、c-lightningと同様なので、やったことあれば、イメージつきやすいだろう。そして、警告をここでもう一度。

以降は、まだ 実験段階のlightning networkを使い本物のBitcoinを使用するためこの記事のミス、自分のミス、ソフトウエアのバグ等でBitcoinを失っても構わないという人だけやってみてほしい。Tシャツ1枚、15ドルと送料と手数料で20ドルくらいを使用する予定だ。

3.FundingしPaymentチャネルを開く

lndが最新のブロック高までブロックチェーンが同期しているかどうかgetinfoしつつ、好きなエクスプローラー chainflyerで見てみると最新の531386と同じであることが確認できた。

masa@masa-Vostro-3800:~$ lncli getinfo
{
"identity_pubkey": "02adf1f5c81673cd25e46d338138e18d7b1444f2363c62d449ec037dc4ede3d220",
"alias": "02adf1f5c81673cd25e4",
"num_pending_channels": 0,
"num_active_channels": 1,
"num_peers": 3,
"block_height": 531386,
"block_hash": "00000000000000000029234e2a049fd24a611eec35054ce6914be68d65366278",
"synced_to_chain": true,
"testnet": false,
"chains": [
"bitcoin"
],
"uris": [
],
"best_header_timestamp": "1531257467",
"version": "0.4.2-beta commit=7cf5ebe2650b6798182e10be198c7ffc1f1d6e19"
}

先ほどlncli newaddressコマンドで作った、3で始まるアドレスへ普段使っているウオレットからファンディング用のBitcoinを送金する。

マイニングフィーは、前回と同様のため、50centで攻めつつ、15ドルのTシャツを送料4ドルで購入する。よって、

$15.00(Tシャツ) + $3.35(送料) + $0.5*4(マイニングフィー) = 約21ドル

4倍の理由は、1.普段持ちのウオレットからLndウオレットへのオンチェーン送金、2.Paymentチャネルの開くとき,3.閉じるとき、そして最後に4.lndウオレットから普段のウオレットへの引き出しの4回ブロックチェーンにトランザクションを書くためだ。

Bitcoinのボラティリティの対応の為に、念のため1,2ドル多めにおくって、おきたい。22ドル分を手数料込みで送金する。送金レートは、以下の計算となる。いまの時点で1BTC=$6391だ。txサイズは、多めの400byteと想定すると。

# 50 cents = 6640 satoshi
$0.5 * 1BTC/$6391 = 0.00007823 BTC= 7823 satoshi
# 50 cents =
7823 satoshi/0.4kbyte = 19558 satoshi/kbyte

先ほど作成したp2shの送金先アドレスを、Linuxの画面からスマホにMessageアプリやメールなどでおくり、ウオレットから送金しよう。GreeAddressウオレットなら、19558 satoshi/kbyteがCustom手数料レートになる計算だ。送金金額は、22ドルに設定する。

確認画面で、実際ブロードキャストするのトランザクションの手数料をみるとトランザクションサイズ(2 input+2 output)が、336vbyteほどとなり、$0.42になった。

19558 satoshi/kbyte * 0.336 kvbyte = 6571 satsohi = 0.42 USD

ブロックエクスプローラーでみると、こうなってた。

ウオレットに手数料確認機能があれば、確認画面でチェックしてから送金したほうがよい。細かく手数料を指定しないのであれば、いくらになるかは、そのときしだいだが、Low Transaction Fee等の選択肢を選べばいいかとおもう。その場合は、もう少し多めのBitcoinを用意する必要がある。

42セントと手数料を安くしたので、2,3コンファメーション待つかとおもいきや、1回目のマイニングでコンファームされた。

lncliで残高を見てみよう。トランザクションをブロードキャストしてから20分で、コンファメーション数は、2となった。

masa@masa-Vostro-3800:~$ lncli walletbalance
{
"total_balance": "344781",
"confirmed_balance": "344781",
"unconfirmed_balance": "0"
}

今回の購入先は、Tシャツが売り切れたBlockStreamのストアでなく別のオンラインストアのHodl Monkeyにしてみようと思う。他にも、MainnetのLightning対応ストアがあるので以下のリンク先で、自分のすきなものを探し見るのもよい。(しかし、見た限り、買いたいTシャツがあって、国際配送するのは、ここしかなかった。)

前回のLightning.scotに再びつないで、Hodl Monkeyから、Tシャツを購入してみる。以下のLightningノード検索画面で、lightning.scotを検索し、URIを手に入れよう、

ノードへの接続は以下のコマンドだ。

lncli connect   02a456b816697c6b8407ee2176475d74b790a96143bc30e896e8bf7a8852a8b637@206.189.124.227:9735

listpeersコマンドで確認しよう。

masa@masa-Vostro-3800:~$ lncli listpeers
{
"peers": [
{
"pub_key": "02a456b816697c6b8407ee2176475d74b790a96143bc30e896e8bf7a8852a8b637",
"address": "206.189.124.227:9735",
"bytes_sent": "6178862",
"bytes_recv": "7164829",
"sat_sent": "0",
"sat_recv": "0",
"inbound": false,
"ping_time": "300300"
}

そして、Paymentチャネルを開く。引数には、pubkeyとsatoshi単位の金額を渡す。いま手元にある丁度の金額とフィー(19558 satoshi/kbyte=19 satoshi/byte)指定して、fundingトランザクションを作成(Paymentチャネルを開く)

masa@masa-Vostro-3800:~$ lncli openchannel --node_key=02a456b816697c6b8407ee2176475d74b790a96143bc30e896e8bf7a8852a8b637 --local_amt=344781  --sat_per_byte=19
[lncli] rpc error: code = Unknown desc = not enough witness outputs to create funding transaction, need 0.00348125 BTC only have 0.00344781 BTC available

するとエラーがでる。手数料を考慮せずに、Paymentチャネルを開いたためだ。

エラーによるとフィーは、3344satoshi必要とあるので、それを引いた金額を指定する。(344781-(348125–344781)=341437)をFundingしてみよう。

masa@masa-Vostro-3800:~$ lncli openchannel --node_key=02a456b816697c6b8407ee2176475d74b790a96143bc30e896e8bf7a8852a8b637 --local_amt=341437  --sat_per_byte=19
{
"funding_txid": "ef49fa3f80efb09ea0a2f0f6e1f883113542f67335fd7590b6c6274652857133"
}

無事に、Funding トランザクションを相手のノードと協働して作成できた。PaymentChanelの状態を確認する。まだ、チャネルは完成していない。なぜかというと、このFundingトランザクションを6コンファメーション(最短で1時間)待つ必要があるからだ。

masa@masa-Vostro-3800:~$ lncli listchannels
{
“channels”: [
]
}

手数料はというと、3344satoshiなので、21セント、うむ少ない、そして、なぜかレートは、23 satoshi/vbyteとなった。19を指定したのだが。フィーのレートは、高いが、実際の金額はすくないので、いつコンファメーションされるか少々心配だ。

無事、18分後2つ目ブロックでコンファームされた。チャネルを再度確認してみる。無事 チャネルがアクティブになった。さあ楽しい買い物だ。

masa@masa-Vostro-3800:~$ lncli listchannels
{
"channels": [
{
"active": true,
"remote_pubkey": "02a456b816697c6b8407ee2176475d74b790a96143bc30e896e8bf7a8852a8b637",
"channel_point": "ef49fa3f80efb09ea0a2f0f6e1f883113542f67335fd7590b6c6274652857133:0",
"chan_id": "584274981468897280",
"capacity": "341437",
"local_balance": "340351",
"remote_balance": "0",

"commit_fee": "1086",
"commit_weight": "600",
"fee_per_kw": "1500",
"unsettled_balance": "0",
"total_satoshis_sent": "0",
"total_satoshis_received": "0",
"num_updates": "1",
"pending_htlcs": [
],
"csv_delay": 144,
"private": false
}
]
}

Hodlモンキーへ行ってよう。https://hodlmonkey.com
自分は、etherum Tシャツを買ってみる。

さあ、チェックアウトして、支払をLightningで選ぼう。送料は、日本あてでも4ドル弱だったと思う。

次の画面で、Invoiceの長い文字列がでるので、コマンドラインでは、いかのように支払を行う。数秒で決済が終わる。

もう一度 チャネルの状態をチェックすると、local balance(手持ちの額)、remote balance(送金した額)が変化したのがわかるだろう。

masa@masa-Vostro-3800:~$ lncli listchannels
{
"channels": [
{
"active": true,
"remote_pubkey": "02a456b816697c6b8407ee2176475d74b790a96143bc30e896e8bf7a8852a8b637",
"channel_point": "ef49fa3f80efb09ea0a2f0f6e1f883113542f67335fd7590b6c6274652857133:0",
"chan_id": "584274981468897280",
"capacity": "341437",
"local_balance": "55402",
"remote_balance": "284948",

"commit_fee": "1087",
"commit_weight": "724",
"fee_per_kw": "1500",
"unsettled_balance": "0",
"total_satoshis_sent": "284948",
"total_satoshis_received": "0",
"num_updates": "3",
"pending_htlcs": [
],
"csv_delay": 144,
"private": false
}
]
}

あとは、ものが届くの待つだけだが、残ったお金を、最後に自分のウオレットのアドレスまで移動させる。

まずは、Paymentチャネルを閉じる。

masa@masa-Vostro-3800:~$ lncli closechannel --funding_txid=ef49fa3f80efb09ea0a2f0f6e1f883113542f67335fd7590b6c6274652857133 --output_index=0
{
"closing_txid": "07633b741ffbfd9400493fac9cff6e791bde8f32348ba6d03aa01abd8fc899f7"
}

しまった!セトルメントのトランザクションのフィーを設定するのを忘れてしまったため、フィーが2 satoshis/vbyteになってしまった。これはコンファメーションまで時間がかかりそうだが、待つしかない。経験上12時間くらいかと思われる。

翌日みてみると、コンファームされていいた。ブロックが出来たのは、それほど遅くなく。ブロードキャストした17:44の24分後のブロックには、入っていた。2回目待っただけだった。良かった。

そして、チャネルをみて、無くなってるのを確認する。

masa@masa-Vostro-3800:~$ lncli listchannels
{
"channels": [
]
}

lndのウオレットの残高を確認。

masa@masa-Vostro-3800:~$ lncli walletbalance
{
“total_balance”: “56018”,
“confirmed_balance”: “56018”,
“unconfirmed_balance”: “0”
}

全額を自分のスマホウオレット等に、引き出すために、ウオレットアプリでアドレスをつくり、コマンドに入れる。想定、トランザクションサイズを200byteとし、19satoshi/byteなので、まあだいたい3000satoshiを手数料と考えてみた。56018–3000 ~= 53000 satoshiを送金する。

masa@masa-Vostro-3800:~$ lncli sendcoins --addr 337nKCk2strgUm8y9idNmtjb4ksNRc1xDA --amt 5300 --conf_target 19
{
"txid": "9dac3d5b907dce0f830944a5ffe5ebac85adad8fdf0e2a2783868615d75d3334"
}

無事、トランザクションがブロードキャストできた。現時点でウオレットは、こうだ。全額がトランザクションにはいり、まだコンファームされていない。あとは、2今ファーメーションまてば、普段のウオレットに戻ってくる予定だ。

masa@masa-Vostro-3800:~$ lncli walletbalance
{
"total_balance": "50576",
"confirmed_balance": "0",
"unconfirmed_balance": "50576"
}

しかしながら、エクスプローラーでみると、フィーがおかしい。さすがにこれは時間がかかりそうだ。

と、おもってよくみたら、コマンドを間違えていた。
本来なら、こうすべきであった。気を付けよう。

masa@masa-Vostro-3800:~$ lncli sendcoins --addr 337nKCk2strgUm8y9idNmtjb4ksNRc1xDA --amt 5300 --sat_per_byte 19

今回は、練習のためPaymentチャネルを開いて、買い物をして、すぐ閉じたが、開きっぱなしのほうが、通常の使い方だろう。

では、皆さん、Tシャツを楽しみに。

--

--