卒論から始まるBlockchain

卒論から始まるBlockchain

俺の屍を越えて行け

Macにbitcoindと連携したLNDを入れてみよう(テストネット)

 まえおき

今回はbitcoindと連携した LND を入れてみましょう。また接続ネットワークはテストネットです。

Lighntning Network が何かわからない人は以下の記事を読んでみましょう。

thinkit.co.jp

今回は Lighitning Network を実際に触ってみるために、Lightning Labs 社が開発している LND というソフトをダウンロードし、接続確認までやってみたいと思います。

 

今日の流れ

  1. 事前準備
  2. LND のインストール
  3. 起動
  4. 起動確認
  5. 途中遭遇したエラーたち

以下の流れに沿ってやっていきます。

github.com

また、日本語文献では以下のものを多いに参考にさせていただきました。

medium.com

m0t0k1ch1st0ry.com

 

実行環境

PC:Macbook Pro

OS:Mojave 10.14.1

 

LNDとは

LNDは Lightning Labs 社が開発した Lightning Network になります。かなり活発に動いており、Lightning Network を動かすソフトウェアとしては代表的なものになります。

ちなみに、最初は自分も誤解していたのですが、Lightning Network は統一された仕様があるわけではありません。各社がそれぞれの仕様で研究開発をし、実装しています。有名どころだと Eclair Wallet で有名な ACINQ 社の eclair(GitHub - ACINQ/eclair: A scala implementation of the Lightning Network.)や Blockstream 社が開発しているc-lightning(GitHub - ElementsProject/lightning: c-lightning — a Lightning Network implementation in C)が有名です。

 

事前準備①:Go言語のインストール

さあ、早速ダウンロードしてみるか!といきたいとこですが、そうはいきません。何事も事前準備が必要です。LND は Go 言語で書かれているため、まずはそれをダウンロードしなければなりません。

$ brew install go

Updating Homebrew...

==> Auto-updated Homebrew!

Updated 1 tap (homebrew/core).

==> Updated Formulae

sphinx-doc     bison            faas-cli         groovy           mariadb@10.0     nano             sceptre          xonsh

ammonite-repl    bitwarden-cli    fatsort          groovysdk        mariadb@10.1     netdata          scrcpy

autopep8         botan            folly            jetty            meson            node-build       shfmt

bat              docker-machine   gflags           krakend          minizinc         pgcli            tbb

beagle           emscripten       gitlab-gem       libpq            mkvtoolnix       prettier         tile38

beast            eslint           gjs              libtensorflow    mongodb          sbcl             v8

 

==> Downloading https://homebrew.bintray.com/bottles/go-1.11.2.mojave.bottle.tar.gz

######################################################################## 100.0%

==> Pouring go-1.11.2.mojave.bottle.tar.gz

==> Caveats

A valid GOPATH is required to use the `go get` command.

If $GOPATH is not specified, $HOME/go will be used by default:

  https://golang.org/doc/code.html#GOPATH

 

You may wish to add the GOROOT-based install location to your PATH:

  export PATH=$PATH:/usr/local/opt/go/libexec/bin

==> Summary

🍺  /usr/local/Cellar/go/1.11.2: 9,282 files, 404MB

パスを通す必要があるので以下を入力します。

$ export GOPATH=~/gocode

$ export PATH=$PATH:$GOPATH/bin

また、起動する度にこれを入力すのは面倒なので .bashrc にこれを書き込んでおきます。

$ vim ~/.bashrc

を入力後 i を押して入力可能状態にし、以下を入力します。

export GOPATH=~/gocode

export PATH=$PATH:$GOPATH/bin

入力後excを押して :wq を入力して enter を押します。

終わったらパスを反映させるために以下を入力

$ source ~/.bashrc

 これで go の設定は終了です。

 

事前準備②:bitcoindのインストール

この前入れたばかりなのでこの記事を参考にどうぞ

Macなら $brew install bitcoin で入れるのが一番簡単かと思われます。(記事には書いていません)

mochi-mochi-blockchain.hatenablog.com

 

また、今回は LND を起動するときに bitcoind が動いていないといけないのでインストールが終わったら起動させておきましょう。(起動させていないと永遠にエラーが出続けます)

 

LNDのインストール

 ここはとってもシンプル。以下のコマンドを入力するだけ。

$ go get -d github.com/lightningnetwork/lnd

$ cd $GOPATH/src/github.com/lightningnetwork/lnd

$ make && make install

今回ダウンロードしたLNDのバージョンを見てみましょう。

$ lnd --version

lnd version 0.5.0-beta commit=v0.5-beta-325-g721e9a2a90eb6a3eb985b02af6c56762026aa16f

ちゃんとインストールされているか確認してみます。

$ which lnd

/Users/toshiki/gocode/bin/lnd

よし!ちゃんと入ってる。

 

事前準備③ bitcoin.confを書き換える

bitcoind にデフォルトで繋がるように bitcoin.conf を書き換えましょう。

場所はここにあるはずです。Library/Application\ Support/Bitcoin/bitcoin.conf

$ vim Library/Application\ Support/Bitcoin/bitcoin.conf

rpcuser=自分で設定したrpcuser名

rpcpassword=自分で設定したrpcpassword名

 

testnet = 1

txindex = 1

server = 1

rest = 1

daemon = 1

 

rpcport = 18332

zmqpubrawblock=tcp://127.0.0.1:28332

zmqpubrawtx=tcp://127.0.0.1:28333

 

事前準備③ lnd.confを作る

上と同じように bitcoind をデフォルトにするために lnd.conf を作ります。

$ mkdir ~/.lnd && cd ~/.lnd

$ vim lnd.conf

中身はこんな感じ

#[Application Options]

debuglevel=info

alias=tosiki //任意の名前

lip=180.X.XXX.XXX:XXX //自分が使っているIPアドレス

 

#[bitcoin]

bitcoin.active=1

bitcoin.testnet=3

bitcoin.node=bitcoind

 

#[Bitcoind]

bitcoind.rpchost=localhost

bitcoind.rpcuser=bitcoin.confで設定したrpcuser名

bitcoind.rpcpass=bitcoin.confで設定したrpcpass名

bitcoind.zmqpath=tcp://127.0.0.1:28332

alias はなんでも大丈夫です。(無難に自分の名前でいいかと)lipはIPアドレスを検索して入れましょう。bitcoind.rpcuser、bitcoind.rpcpassは bitcoin.confで設定した名前を入れればOKです。

 

起動

やり方はいくつかあると思うんですが、今回はこんな感じです。

$ lnd --bitcoin.active --bitcoin.testnet --debuglevel=debug --bitcoin.node=bitcoind --bitcoind.rpcuser=bitcoin.confで設定したrpcuser名 --bitcoind.rpcuser=bitcoin.confで設定したrpcpass名 --bitcoind.zmqpubrawblock=tcp://127.0.0.1:28332 --bitcoind.zmqpubrawtx=tcp://127.0.0.1:28333 --no-macaroons

bitcoind.rpcuser=xxxxx、bitcoind.rpcuser=xxxxx の部分はbitcoin.confで設定したものを入れましょう。また最後にある  --no-macaroons はパスを設定しない限り必要になる(たぶん)ので必ず入れましょう。

途中以下の文が出て止まります。

2018-11-29 11:47:14.952 [INF] LTND: Version: 0.5.0-beta commit=v0.5.1-beta-rc1, build=production, logging=default

2018-11-29 11:47:14.952 [INF] LTND: Active chain: Bitcoin (network=testnet)

2018-11-29 11:47:14.952 [INF] CHDB: Checking for schema update: latest_version=6, db_version=6

2018-11-29 11:47:14.960 [INF] RPCS: password RPC server listening on 127.0.0.1:10009

2018-11-29 11:47:14.960 [INF] RPCS: password gRPC proxy started at 127.0.0.1:8080

2018-11-29 11:47:14.960 [INF] LTND: Waiting for wallet encryption password. Use `lncli create` to create a wallet, `lncli unlock` to unlock an existing wallet, or `lncli changepassword` to change the password of an existing wallet and unlock it.

これはウォレットを作るかアンロックしてね、ということですので新しくたぶを開いて操作します。

ウォレットを作るには lncli create で作れるので、早速作ってみます。

$ lncli create

Input wallet password: 

Confirm wallet password: 

 

Do you have an existing cipher seed mnemonic you want to use? (Enter y/n): n

 

Your cipher seed can optionally be encrypted.

Input your passphrase if you wish to encrypt it (or press enter to proceed without a cipher seed passphrase): 

 

Generating fresh cipher seed...

 

!!!YOU MUST WRITE DOWN THIS SEED TO BE ABLE TO RESTORE THE WALLET!!!

 

---------------BEGIN LND CIPHER SEED---------------

 1. abstract   2. nerve      3. control   4. you   

 5. alien      6. resource   7. true      8. travel

 9. crazy     10. erode     11. rubber   12. tank  

13. loan      14. pizza     15. smart    16. heavy 

17. twelve    18. scatter   19. century  20. this  

21. animal    22. board     23. fine     24. tube  

---------------END LND CIPHER SEED-----------------

 

!!!YOU MUST WRITE DOWN THIS SEED TO BE ABLE TO RESTORE THE WALLET!!!

 

lnd successfully initialized!

下に何もエラーが出てなければ成功です。passwordは8文字以上が必要です。passwordを打っている時は何も表示されないので、何も出ないからと言ってびっくりしないようにしましょう。

作ったらアンロックして使えるようにする必要があります。アンロックはlncli unlockでできます。

*もしエラーが出た方は下に書いてある「途中遭遇したエラーたち」を見るといいかもしれません

$ lncli unlock

Input wallet password: 

 

lnd successfully unlocked!

こちらもエラーが出なければ成功です!では LND を起動した時のタブに戻って確認しましょう。

*もしエラーが出た方は下に書いてある「途中遭遇したエラーたち」を見るといいかもしれません

2018-11-29 11:47:14.960 [INF] LTND: Waiting for wallet encryption password. Use `lncli create` to create a wallet, `lncli unlock` to unlock an existing wallet, or `lncli changepassword` to change the password of an existing wallet and unlock it.

2018-11-29 11:47:27.338 [INF] LNWL: Opened wallet

2018-11-29 11:47:27.338 [INF] LTND: Primary chain is set to: bitcoin

2018-11-29 11:47:27.341 [INF] LTND: Initializing bitcoind backed fee estimator

2018-11-29 11:47:27.341 [INF] LNWL: Started listening for bitcoind transaction notifications via ZMQ on tcp://127.0.0.1:28333

2018-11-29 11:47:27.341 [INF] LNWL: Started listening for bitcoind block notifications via ZMQ on tcp://127.0.0.1:28332

2018-11-29 11:47:27.342 [DBG] LNWL: Using minimum fee rate of 253 sat/kw

2018-11-29 11:47:28.016 [INF] LNWL: The wallet has been unlocked without a time limit

2018-11-29 11:47:28.019 [INF] LTND: LightningWallet opened

2018-11-29 11:47:28.022 [INF] LNWL: Catching up block hashes to height 1445818, this will take a while...

ちゃんと動きました!

 

とは言っても本当に動いているか心配なので、もう一つ確認してみます。

先ほどウォレットを作った時のたぶに戻って lncli --no-macaroons getinfo を打って確認しましょう。

$ lncli --no-macaroons getinfo

{

    "identity_pubkey": "0241bb13f9897f1793b20f18f34220228c69346b0244f61962e057b3ea7e331bbb",

    "alias": "0241bb13f9897f1793b2",

    "num_pending_channels": 0,

    "num_active_channels": 0,

    "num_peers": 0,

    "block_height": 1445820,

    "block_hash": "000000000000005aaa4a5bca5d6c65b90a84045637c20817858dfa5ab23aaf27",

    "synced_to_chain": false,

    "testnet": true,

    "chains": [

        "bitcoin"

    ],

    "uris": [

    ],

    "best_header_timestamp": "0",

    "version": "0.5.0-beta commit=v0.5.1-beta-rc1",

    "num_inactive_channels": 0

}

ということで無事インストールから起動まで出来ました!!!

 

番外事前準備:btcdのインストール

LNDにデフォルトで入っている Bitcoin wallet です。今回は bitcoind を使うので必要ないですが、一応載せておきます。

$ make btcd

 make が無事終了したら以下のコマンドで起動。すると同期が始まります。大体2時間ぐらいかかりました。

$ btcd --testnet --rpcuser=REPLACEME --rpcpass=REPLACEME

途中の進捗は以下で観れます。

$ btcctl --testnet --rpcuser=REPLACEME --rpcpass=REPLACEME getinfo

{

  "version": 120000,

  "protocolversion": 70002,

  "blocks": 1444416,

  "timeoffset": 0,

  "connections": 8,

  "proxy": "",

  "difficulty": 12368745.01434309,

  "testnet": true,

  "relayfee": 0.00001,

  "errors": ""

}

 

途中遭遇したエラーたち

①make checkで現れる謎のエラー(未解決)

make check をすると以下のエラーが出ました。調べたけど解決策が現れず、無視しました(・ω・`)

--- PASS: TestNewInvoice (0.00s)

--- PASS: TestDecodeEncode (0.02s)

PASS

ok  github.com/lightningnetwork/lnd/zpay32 (cached)

make: *** [unit] Error 1

 

②lncli createでウォレット作れない問題

$ lncli create

Input wallet password: 

Confirm wallet password: 

 

Do you have an existing cipher seed mnemonic you want to use? (Enter y/n): n

 

Your cipher seed can optionally be encrypted.

Input your passphrase if you wish to encrypt it (or press enter to proceed without a cipher seed passphrase): 

 

Generating fresh cipher seed...

 

[lncli] unable to generate seed: rpc error: code = Unavailable desc = all SubConns are in TransientFailure, latest connection error: connection error: desc = "transport: Error while dialing dial tcp 127.0.0.1:10009: connect: connection refused"

接続エラー?なんでだよ!とか思ったけど普通に起動していないだけだった。起動してからウォレットを作りましょう。

 

②lncli unlock でウォレットをunlockできない問題 

$ lncli unlock

Input wallet password: 

[lncli] rpc error: code = Unavailable desc = all SubConns are in TransientFailure, latest connection error: connection error: desc = "transport: Error while dialing dial tcp 127.0.0.1:10009: connect: connection refused"

上の ①lncli createでウォレット作れない問題、と同じく起動してないだけだった。LNDを起動してからやりましょう。

 

③ lncli createで謎のエラー & unlock 出来ない問題

$ lncli create

Input wallet password: 

Confirm wallet password: 

 

Do you have an existing cipher seed mnemonic you want to use? (Enter y/n): n

 

Your cipher seed can optionally be encrypted.

Input your passphrase if you wish to encrypt it (or press enter to proceed without a cipher seed passphrase): 

 

Generating fresh cipher seed...

 

!!!YOU MUST WRITE DOWN THIS SEED TO BE ABLE TO RESTORE THE WALLET!!!

 

---------------BEGIN LND CIPHER SEED---------------

 1. about      2. cart     3. page     4. north  

 5. oyster     6. zero     7. waste    8. primary

 9. below     10. beauty  11. carry   12. knife  

13. outdoor   14. grid    15. lemon   16. topple 

17. mosquito  18. raise   19. caught  20. legend 

21. piece     22. shield  23. away    24. have   

---------------END LND CIPHER SEED-----------------

 

!!!YOU MUST WRITE DOWN THIS SEED TO BE ABLE TO RESTORE THE WALLET!!!

[lncli] rpc error: code = Unknown desc = password must have at least 8 characters

わーい、これでウォレットできたぞ!と思ってアンロックしてみると

$ lncli unlock

Input wallet password: 

[lncli] rpc error: code = Unknown desc = wallet not found

そんなウォレットないけど?だって。いやいや、今作りましたけどぉ!?って思っていたら lncli create の一番最後にエラー出てましたね。

[lncli] rpc error: code = Unknown desc = password must have at least 8 characters

 パスワードは8文字以上にしてね、だそうです。( SEED 出来てるから成功したかと思うじゃん。もうちょい見やすくせんかい)

ちゃんとできると先ほどのエラーは出ず、普通にunlock出来ます。

 

④ウォレット作ってアンロックするまで同期進まない問題

$ lnd

2018-11-28 22:51:17.192 [INF] LTND: Version: 0.5.0-beta commit=v0.5.1-beta-rc1, build=production, logging=default

2018-11-28 22:51:17.192 [INF] LTND: Active chain: Bitcoin (network=testnet)

2018-11-28 22:51:17.192 [INF] CHDB: Checking for schema update: latest_version=6, db_version=6

2018-11-28 22:51:17.200 [INF] RPCS: password RPC server listening on 127.0.0.1:10009

2018-11-28 22:51:17.200 [INF] RPCS: password gRPC proxy started at 127.0.0.1:8080

2018-11-28 22:51:17.200 [INF] LTND: Waiting for wallet encryption password. Use `lncli create` to create a wallet, `lncli unlock` to unlock an existing wallet, or `lncli changepassword` to change the password of an existing wallet and unlock it.

ウォレット作ってな、とのこと。作るまで永遠に動きません。別にエラーでもなんでもないですが、ここまでの①、②、③のエラー全て同時に起こっていたため解決までとても時間を要しました。もし同じように悩んでいるなら上のエラーを片付けられているか確認しましょう。

 

⑤getinfo出来ない問題

$ lncli getinfo

[lncli] unable to read macaroon path (check the network setting!): open /Users/toshiki/Library/Application Support/Lnd/data/chain/bitcoin/mainnet/admin.macaroon: no such file or directory

macaroon path おかしいぜ、と言われます。まず macaroon ってなんだよって話ですが、とりあえずこの admin.macaroon の手前まで行ってみてみましょう。

$ cd Library/Application\ Support/Lnd/data/chain/bitcoin

$ ls

testnet

うん。ないね。なんかディレクトリー作らなくてはいけないのか?とか思ったけど、

(check the network setting!)

 って書いてあるし、設定がおかしいのかなと考えて lnd.conf と bitcoin.conf らへんに的を絞って解決策を探る。

 

macaroons ってやつが悪さしとるのでは?と思いっていたら以下の文を発見

To disable macaroons for testing, pass the --no-macaroons flag into both lnd and lncli.

lnd/INSTALL.md at master · lightningnetwork/lnd · GitHub

テスト用で macaroons いらない場合は lnd と lncli の両方に --no-macaroonsつけろよ、ですって。ふむやってみまましょう。

$ lnd --bitcoin.active --bitcoin.testnet --debuglevel=debug --bitcoin.node=bitcoind --bitcoind.rpcuser=bitcoinrpc --bitcoind.rpcpass=5fa4e39eefe0614db0b03e4dcf0fee83 --bitcoind.zmqpubrawblock=tcp://127.0.0.1:28332 --bitcoind.zmqpubrawtx=tcp://127.0.0.1:28333 --no-macaroons

起動したらもう一つのタブで--no-macaroonsを付けてみる。

$ lncli --no-macaroons getinfo

{

    "identity_pubkey": "0241bb13f9897f1793b20f18f34220228c69346b0244f61962e057b3ea7e331bbb",

    "alias": "0241bb13f9897f1793b2",

    "num_pending_channels": 0,

    "num_active_channels": 0,

    "num_peers": 0,

    "block_height": 1445820,

    "block_hash": "000000000000005aaa4a5bca5d6c65b90a84045637c20817858dfa5ab23aaf27",

    "synced_to_chain": false,

    "testnet": true,

    "chains": [

        "bitcoin"

    ],

    "uris": [

    ],

    "best_header_timestamp": "0",

    "version": "0.5.0-beta commit=v0.5.1-beta-rc1",

    "num_inactive_channels": 0

}

おお!出来た!でもめんどくさすぎません?

 

⑥lnd 単体で起動するとよくわからないところで動かなくなる問題(未解決)

20-008noMacbookPro:~ toshiki$ lnd

2018-11-29 11:16:47.951 [INF] LTND: Version: 0.5.0-beta commit=v0.5.1-beta-rc1, build=production, logging=default

2018-11-29 11:16:47.951 [INF] LTND: Active chain: Bitcoin (network=testnet)

2018-11-29 11:16:47.952 [INF] CHDB: Checking for schema update: latest_version=6, db_version=6

2018-11-29 11:16:47.964 [INF] RPCS: password RPC server listening on 127.0.0.1:10009

2018-11-29 11:16:47.965 [INF] RPCS: password gRPC proxy started at 127.0.0.1:8080

2018-11-29 11:16:47.965 [INF] LTND: Waiting for wallet encryption password. Use `lncli create` to create a wallet, `lncli unlock` to unlock an existing wallet, or `lncli changepassword` to change the password of an existing wallet and unlock it.

2018-11-29 11:18:01.686 [INF] LNWL: Opened wallet

2018-11-29 11:18:01.741 [INF] LTND: Primary chain is set to: bitcoin

2018-11-29 11:18:01.742 [INF] LTND: Initializing btcd backed fee estimator

 上の場所から永遠に動きません。ここで getinfo しても⑤と同じエラーが出ます。なぜ?

 

 

まとめ

bitcoind よりはインストールとかは簡単だった印象です。とは言っても四苦八苦する場面が多かったです。

実際に Lightning Network が使われるようになったら面白いけど、一般に普及していくためにはこの導入部分の煩わしさは排除しないといかんなぁと思いました。

後 macaroon って何者???

 

// SOTURON MENDOKUSAI

 

参考資料

lnd/INSTALL.md at master · lightningnetwork/lnd · GitHub

ライトニングノード(Lightning Network/Lnd)を立ち上げてみた! – Tomoya Ishida – Medium

LightningNetworkノードを立ち上げる方法(lnd編) - Qiita

Lightning Networkが動作する仕組み | Think IT(シンクイット)