eclairを使ってnodeを建てる
環境
AWS EC2インスタンス。type: t2large、OS: ubuntu18.04 LTS
参考
Javaの環境構築
eclairはScalaで作られているので、jarが実行できる環境を構築する。
公式を見ると、現状ではJRE1.8以降で動作するとのことなので、それを入れる。
まずはjavaのバージョンをチェック
code: java version
$ java -version
Command 'java' not found, but can be installed with:
sudo apt install default-jre
sudo apt install openjdk-11-jre-headless
sudo apt install openjdk-8-jre-headless
javaはまだ入ってなかったので、aptで提供されいてるdefault-jreの情報を見てみる。
code: apt info to java
apt show default-jre
Package: default-jre
Version: 2:1.10-63ubuntu1~02
~~~~~
Provides: java-runtime, java10-runtime, java11-runtime, java2-runtime, java5-runtime, java6-runtime, java7-runtime, java8-runtime, java9-runtime
~~~~~
java8-runtime以降のものも入っているので、これをインストールする
code: java install
sudo apt install -y default-jre
javaのバージョンを確認
インストールできたのかもかねてバージョンを確認する
code: java version
java -version
openjdk version "10.0.2" 2018-07-17
OpenJDK Runtime Environment (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4)
OpenJDK 64-Bit Server VM (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4, mixed mode)
javaのバイナリを取得
今回はguiはいらないので、eclair-node-0.2-beta9-eb0e45a.jar をダウンロードする。(guiが付いてない奴がcuiバージョン)
code: get binary
confの作成
bitcoindとの接続にrpcとzmqをそれぞれ使うので、bitcoindとの設定を合わせておく。
~/.eclair/eclair.confとして以下のファイルを作成。サンプルなので自前のbitcoin.confに合わせて適宜修正してください。
今回はcuiで動かすので、rpc api serverをenableにしている。待ち受けポートは 8080
code: eclair.conf
eclair.bitcoind.rpcport=18332
eclair.bitcoind.rpcuser="rpcuser"
eclair.bitcoind.rpcpassword="rpcpassword"
eclair.api.enabled=true
eclair.api.port=8080
eclair.api.password="eclairpassword"
eclair.bitcoind.zmqblock="tcp://127.0.0.1:28332"
eclair.bitcoind.zmqtx="tcp://127.0.0.1:28333"
対応する、bitcoin.confは以下の通り。こちらは~/.bitcoin/bitcoin.confとして配備する
code: bitcoion.conf
testnet=3
txindex=1
server=1
rpcuser=rpcuser
rpcpassword=rpcpassword
rpcport=18332
deprecatedrpc=signrawtransaction
addresstype=p2sh-segwit
zmqpubrawblock=tcp://127.0.0.1:28332
zmqpubrawtx=tcp://127.0.0.1:28333
eclairを起動する
code: launch eclair
java -jar eclair-node-0.2-beta9-eb0e45a.jar
bitcoindとの接続に失敗する場合
.eclair/eclair.logに以下のようなエラーが記録される場合
code: error
ERROR fr.acinq.eclair.Boot$ - fatal error: could not connect to bitcoind using json-rpc
rpc の設定(user, password)とか がうまくいってない可能性があるので、curlコマンドなどを使って調べる。
code: curl rpc
curl --data-binary '{"jsonrpc": "2.0", "method": "getinfo", "getblockchaininfo": [] }' -H 'content-type: text/text;' --user rpcuser -v http://127.0.0.1:18332/ ↑のcurlが通るなら、eclair側の設定ミスの可能性が高い。
ログ出力をDEBUGに変更する
eclairはlogの機構としてlogbackというものを使っている。logback用の設定ファイルを用意して起動時に指定すれば任意のログ出力方法に切り替えられる。
ここでは、単純にログ出力レベルをDEBUGに変更する設定ファイルを用意した。(本家のコピペしてlevel=だけ書き換えたやつだけど)
code: eclair-log-debug.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright 2018 ACINQ SAS
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<target>System.out</target>
<withJansi>false</withJansi>
<encoder>
<pattern>%yellow(${HOSTNAME} %d) %highlight(%-5level) %logger{24} %X{nodeId}%X{channelId} - %msg%ex{12}%n</pattern>
</encoder>
</appender>
<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${eclair.datadir:-${user.home}/.eclair}/eclair.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>${eclair.datadir:-${user.home}/.eclair}/eclair.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- keep 90 days' worth of history capped at 5 GB total size -->
<maxHistory>90</maxHistory>
<totalSizeCap>5GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d %-5level %logger{24} %X{nodeId}%X{channelId} - %msg%ex{24}%n</pattern>
</encoder>
</appender>
<if condition='isDefined("eclair.printToConsole")'>
<then>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d %-5level %logger{24} %X{nodeId}%X{channelId} - %msg%ex{24}%n</pattern>
</encoder>
</appender>
<root>
<appender-ref ref="CONSOLE"/>
</root>
</then>
</if>
<root level="DEBUG">
<appender-ref ref="ROLLING"/>
</root>
</configuration>
この設定ファイルを指定してeclairを起動する
code: launch set custom log
java -Dlogback.configurationFile=/home/ubuntu/eclair-log-debug.xml -jar eclair-node-0.2-beta9-eb0e45a.jar
eclair-cliのダウンロード
githubのリポジトリからcliツールを取得する
code: get cli tool
chmod 0755 eclair-cli
eclair-cliでコマンドを投げてみる
cliの確認とサーバ起動の確認のためにとりあえずgetinfoを投げてみる。
cli叩くたびに毎回パスワード聞かれるの地味にめんどくさい。。。
code: getinfo
./eclair-cli getinfo
eclairで送金を行う
bitcoindのwalletにお金を入れる
eclairではeclair.confで接続している先のbitcoindが管理しているwalletからchannel openで使う資金を引っ張ってきます。signrawtransactionを有効にしないといけないところを見ると自前ではそれらの機能を持っておらず、bitcoin rpcを最大限利用する作りになってるみたいです。
いつも通り、testnetのfaucetなどから資金をもらいましょう
他のノードに接続してchannelをopenする。
code: connect and open
$ ./eclair-cli connect 03f42dad75a5bb72ef6f8a3e6728f307c167f4d49eddc5f73ef060d60fce6458fe@54.238.209.66
Enter host password for user 'eclair-cli':
connected
$ ./eclair-cli open 03f42dad75a5bb72ef6f8a3e6728f307c167f4d49eddc5f73ef060d60fce6458fe 100000
Enter host password for user 'eclair-cli':
created channel 1b954578c4c34cf15da08b843814019fe2c4f553007cc43edc9266c62673b2fb
eclairではchannel open時にdepositする最低金額は100,000satoshi
invoice messageを作る
code: generate invoice
$ ./eclair-cli receive 10000000 "send 10,000 satoshi"
コマンド発行するとべろべろって標準出力にBOLT11 formatのmessageが吐かれる
invoiceを確認する
code: parse invoice
$ ./eclair-cli parseinvoice lntb100u1pw984u7pp5qv6z4v82664y8turfdrtn5zg6j73wh96jr8ssuy2kcpkx22kap6qdp2wdjkuepqxyczcvpsxqs8xct5daeks6fqgys8gmeqgsxqrrssymxr24a8wpgvh55h6y58pnrry848jxwu4nzrf9mef9teyvrzhe2yy2f5e43270p6zxjqcetv9j9fzxsklefvrqvzpzev5ytrafflsuqqtpn7lw
{
"prefix": "lntb",
"amount": 10000000,
"timestamp": 1548998558,
"nodeId": "03d5f9b8519a87917ed0f051274bff50c281623edccb20076762b4a53df8cc5f41",
"description": "send 10,000 satoshi A to D",
"paymentHash": "03342ab0ead6aa43af834b46b9d048d4bd175cba90cf08708ab603632956e874",
"expiry": 3600,
"minFinalCltvExpiry": null
}
routeを確認する
code: find route
$ ./eclair-cli findroute lntb100u1pw984u7pp5qv6z4v82664y8turfdrtn5zg6j73wh96jr8ssuy2kcpkx22kap6qdp2wdjkuepqxyczcvpsxqs8xct5daeks6fqgys8gmeqgsxqrrssymxr24a8wpgvh55h6y58pnrry848jxwu4nzrf9mef9teyvrzhe2yy2f5e43270p6zxjqcetv9j9fzxsklefvrqvzpzev5ytrafflsuqqtpn7lw
Enter host password for user 'eclair-cli':
[
"03d839b1e670bad52462bbd447c0eae383dfdc26e2d50821fdffa921b264c3adb5",
"03f42dad75a5bb72ef6f8a3e6728f307c167f4d49eddc5f73ef060d60fce6458fe",
"0237637f2ddfc66a088842eb6715af575a800d71106abfc9cc8f7c9fa4e23e47d5",
"03d5f9b8519a87917ed0f051274bff50c281623edccb20076762b4a53df8cc5f41"
]
支払いを行う
code: pay
$ ./eclair-cli send lntb100u1pw984u7pp5qv6z4v82664y8turfdrtn5zg6j73wh96jr8ssuy2kcpkx22kap6qdp2wdjkuepqxyczcvpsxqs8xct5daeks6fqgys8gmeqgsxqrrssymxr24a8wpgvh55h6y58pnrry848jxwu4nzrf9mef9teyvrzhe2yy2f5e43270p6zxjqcetv9j9fzxsklefvrqvzpzev5ytrafflsuqqtpn7lw
Enter host password for user 'eclair-cli':
{
"amountMsat": 10004000,
"paymentHash": "03342ab0ead6aa43af834b46b9d048d4bd175cba90cf08708ab603632956e874",
"paymentPreimage": "f368424a3649e1a565b5ae4a9359ffe5b38b55c02b31e94c307d5630086a413c",
"route": [
{
"nodeId": "03d839b1e670bad52462bbd447c0eae383dfdc26e2d50821fdffa921b264c3adb5",
"nextNodeId": "03f42dad75a5bb72ef6f8a3e6728f307c167f4d49eddc5f73ef060d60fce6458fe",
"lastUpdate": {
"signature": "304402206bdc99c8364df575f2c33be63b60a33124f41ab5b3b46b7d4fc31dfd48ebc7340220193d3dc8364819ee23c57a12f35fef4b841760193142e2767d769eb15beaa81f01",
"chainHash": "43497fd7f826957108f4a30fd9cec3aeba79972084e90ead01ea330900000000",
"shortChannelId": "1454782x20x0",
"timestamp": 1548989627,
"messageFlags": 1,
"channelFlags": 0,
"cltvExpiryDelta": 144,
"htlcMinimumMsat": 1,
"feeBaseMsat": 1000,
"feeProportionalMillionths": 100,
"htlcMaximumMsat": 100000000
}
},
{
"nodeId": "03f42dad75a5bb72ef6f8a3e6728f307c167f4d49eddc5f73ef060d60fce6458fe",
"nextNodeId": "0237637f2ddfc66a088842eb6715af575a800d71106abfc9cc8f7c9fa4e23e47d5",
"lastUpdate": {
"signature": "3045022100ca75c21225164c656d61e7938ac5311df8bfe3331a27efcffa54eca19aaed59702206d58e882b8f557cd38116777775e0ac33be9340e8bd2bff209f04f698db70f2201",
"chainHash": "43497fd7f826957108f4a30fd9cec3aeba79972084e90ead01ea330900000000",
"shortChannelId": "1454784x18x0",
"timestamp": 1548990018,
"messageFlags": 1,
"channelFlags": 1,
"cltvExpiryDelta": 144,
"htlcMinimumMsat": 1,
"feeBaseMsat": 1000,
"feeProportionalMillionths": 100,
"htlcMaximumMsat": 100000000
}
},
{
"nodeId": "0237637f2ddfc66a088842eb6715af575a800d71106abfc9cc8f7c9fa4e23e47d5",
"nextNodeId": "03d5f9b8519a87917ed0f051274bff50c281623edccb20076762b4a53df8cc5f41",
"lastUpdate": {
"signature": "3045022100fd7a00c08a0c135ad2d8be70702be1f1a557dd8d85b8878277a79e552b84f541022020824e97b5ef7eb189baa47ffbd85c956e0004512348ec2b07069cd8843f657101",
"chainHash": "43497fd7f826957108f4a30fd9cec3aeba79972084e90ead01ea330900000000",
"shortChannelId": "1454784x17x0",
"timestamp": 1548990018,
"messageFlags": 1,
"channelFlags": 0,
"cltvExpiryDelta": 144,
"htlcMinimumMsat": 1,
"feeBaseMsat": 1000,
"feeProportionalMillionths": 100,
"htlcMaximumMsat": 100000000
}
}
]
}
channel close
code: close
$ ./eclair-cli close fb875845e04cc34b93c57edcd03330df866cc61d6ae10360a91d368ba864c739
Enter host password for user 'eclair-cli':
ok