lightning-network-implementation-amiko-pay-curr.original

ライトニングネットワーク送金の動作実証手順:1ミリサトシを送ってみた

レポート「アルトコイン図鑑」では30種類以上のコインの概要と見通しを解説(詳しく)

ライトニングネットワークが基本的な動作ができる段階にさしかかっています。今回は、日本のライトニングネットワーク先駆者で、の翻訳者である今井崇也氏のレクチャーのもと、その動作の実証を行ってみました。

今回は、Blockstream社による実装のlightningdを使って、1ミリサトシ(1000分の1サトシ=約0.000001円)の送金を行いました。

手順を一つ一つ解説しましたので、これを追えばみなさんも実証できるとおもいます。

環境: Orange Pi (Armbian) + bitcoind 0.13.1 + Lightnind です。

lightinigdのインストール方法についてはこちらの記事を参考にしてください。

<lightningd の立ち上げ、入金>

bitcoindが立ち上がっていることが前提です。bitcoindがインストールされてない場合はこれをインストールして、ブロックチェーンを同期済みにしておく必要があります。

なお、Segwitがすでに稼働しているテストネットでしか動きませんので、テストネットに接続します。

$ bitcoind -daemon -testnet=1

次に、Lightningdを立ち上げます。

$ lightningd --port 42480
lightningd(8697): ID: 02d837e5fd98da358f8af239eedb7ea46d85400c088d10f018d3783c22800b1848

自身のノードに固有のIDが発行されておきます。今後他のノードからはこのIDで識別されることになります。

なお、立ち上げ時に、ポートが開かないという問題があるようです。どうも、突然、ダイナミックにポートを割り当てないという仕様に変更されたようで、手動でポートを割り当てる必要があります。42480を指定しています。

以下、getinfoで正しく立ち上がっているか確かめましょう。テストネットに接続され、ブロックの同期も最新になっているか確かめましょう。

lightning-cli getinfo
lightningd(8641): Connected json input
{ "id" : "02d837e5fd98da358f8af239eedb7ea46d85400c088d10f018d3783c22800b1848", "testnet" : true, "version" : "v0.5.2-2016-11-21-35-g5700032", "blockheight" : 1063814 }

次に、Lightningdのアドレスを作成します。BitcoindのウォレットとLightningdのウォレットは別物になります。

アドレス作成は、newaddrでおこないます。

$ lightning-cli newaddr
lightningd(8641): Connected json input
{ "address" : "2MzH98Svbjgvxy4GqwyfxBsqVxaKXSY291J" }

これで作成されました。

次に、テストネットのコインを、このアドレスあてに入金してあげないといけません。ためしに、0.01 btcをこちらに送ります。

$ bitcoin-cli sendtoaddress 2MzH98Svbjgvxy4GqwyfxBsqVxaKXSY291J 0.01

c1cf87b987e66707f6b601d59c4773cc1930ac3f9394f70a14ac8df472ad61dd

送金のTXIDが表示されます。しばらく待ってマイニングされるのを待ちましょう。

<ペイメントチャネルを張る>

次は、他のノードにペイメントチャネルを張ります。ペイメントチャネルを張るには、connectを使います。

lightning-cli connect <server> <port> <UTXO>

<UTXO>は先程作成したアドレスに存在する未使用のアウトプットを指定しますが、rawtransactionの値を指定してあげる必要があります。ですので、いったん、bictoin-cliで、rawtransacionの値を取得します。

getrawtransactionを利用し、TXIDを指定します。

$ bitcoin-cli getrawtransaction c1cf87b987e66707f6b601d59c4773cc1930ac3f9394f70a14ac8df472ad61dd

0100000001aac0d8c567b92fc583af2e53ff0dcba085482749b4da32a33f2c132cec442e4a010000006a47304402205a42e9f95fbcd8dd9afd9889ee25f0a476b0355a6aec17ace0aba4c742820b62022073f0d85585d520dc19074eb4fe6be06c5922d80d27a567b129f9f9b3edc83cf00121026b5e3f81191f0da59f7dd2d6fbda6003e0a4c20005f6da479a8ab9d3ec4ec370feffffff0240420f000000000017a9144d25a7f74b877358011ce28e81a234be82c07fd587f0a01000000000001976a9143290b98f4aeb14cd6ae7fd42d4365eab0951a52b88ac863b1000

rawtransactionが取得できました。

次に、ペイメントチャネルを張ります。相手先のサーバ名、ポート、未使用のアウトプットを指定します。

$ lightning-cli connect btc3.frontier-ptnrs.com 42480 0100000001aac0d8c567b92fc583af2e53ff0dcba085482749b4da32a33f2c132cec442e4a010000006a47304402205a42e9f95fbcd8dd9afd9889ee25f0a476b0355a6aec17ace0aba4c742820b62022073f0d85585d520dc19074eb4fe6be06c5922d80d27a567b129f9f9b3edc83cf00121026b5e3f81191f0da59f7dd2d6fbda6003e0a4c20005f6da479a8ab9d3ec4ec370feffffff0240420f000000000017a9144d25a7f74b877358011ce28e81a234be82c07fd587f0a01000000000001976a9143290b98f4aeb14cd6ae7fd42d4365eab0951a52b88ac863b1000

OUT-btc3.frontier-ptnrs.com:42480: Connected out to 160.16.106.114:42480 id 035dfaa4c932a22018b1e583d2b9f5197240db60151c639e5c75614c0903349339, changing prefix

これで、チャネルが貼ることができました。

getpeersで、状況を確認します。

$ lightning-cli getpeers
{ "name" : "035dfaa4c932a22018b1e583d2b9f5197240db60151c639e5c75614c0903349339:", "state" : "STATE_NORMAL", "peerid" : "035dfaa4c932a22018b1e583d2b9f5197240db60151c639e5c75614c0903349339", "connected" : true, "our_amount" : 950470000, "our_fee" : 44210000, "their_amount" : 0, "their_fee" : 0, "our_htlcs" : 
 [ ], "their_htlcs" : 
 [ ] } ] }

connectedになっていれば成功です。また、相手先のノードIDが表示されますので、把握しておきましょう。次の送金で指定します。

<マイクロペイメントの実行>

hash

ペイメントを行うには、受取人のDaveから、送金のリクエストを発行してもらう必要があります。上記のネットワークの図でいうと、Hにあたります。

Lightningdでは、rhashという表現がされています。このrhashを受取人(Dave)から、送金者(Alice)に教えることで、送金が可能になります。

受取人側から、rhashを作成する必要があります。invoiceコマンドをつかいます。金額を指定する必要があります。指定した金額以外の送金をしようとするとエラーになります。

金額はミリサトシ単位です(1000分の1サトシです!)。今回は1ミリサトシをリクエストしてみます。

以下は、相手先のクライアントでの実行です

(受取人ノード)$ lightning-cli invoice 1 tx-00001

lightningd(22096): Connected json input
{ "rhash" : "41b0d80f329a581080968ecc790d6f5e43b1e7cbf079745ee89c85e4902aec7f" }

金額につづいてのtx-0001は管理用のラベルです。任意のものを指定できます。

rhashが取得できたら、これを送金者に伝えます。

本来、このあたりはプロトコルが自動で情報を交換すべきですが、まだそこまで実装が進んでません・・・。ですので、このrhashを手動で、別のチャネルをつかって伝える必要があります。

rhashを受取人から教えてもらったら、実際に送金してみます。

1ミリサトシをおくります。IDには、相手先のノードのIDを指定し、金額は1ミリサトシを指定します。Invoiceで指定した金額が1なので、これ以外を指定するとエラーになります。最後に、rhashを指定します。

$ lightning-cli sendpay '[ { "id" : "035dfaa4c932a22018b1e583d2b9f5197240db60151c639e5c75614c0903349339", "msatoshi" : 1, "delay" : 36 } ]' 41b0d80f329a581080968ecc790d6f5e43b1e7cbf079745ee89c85e4902aec7f

成功すると、preimageが帰ってきます。

{ "preimage" : "32e32068bc84565c351be2793e57ddb00438b31e82b51a7e6b38d74b74d66dbd" }

成功です。

このpreimageは、先ほどのネットワーク図でいう「R」に相当するものです。

1ミリサトシの送金ができているか、確認します。getpeersを使います。

$ lightning-cli getpeers
{ "name" : "035dfaa4c932a22018b1e583d2b9f5197240db60151c639e5c75614c0903349339:", "state" : "STATE_NORMAL", "peerid" : "035dfaa4c932a22018b1e583d2b9f5197240db60151c639e5c75614c0903349339", "connected" : true, "our_amount" : 950470000, "our_fee" : 4429999, "their_amount" : 0, "their_fee" : 1, "our_htlcs" : 
 [ ], "their_htlcs" : 
 [ ] } ] }

our_feeのところが1ミリサトシ減って、their_feeが1ミリサトシ増えています。

<ペイメントチャネルのクローズ>

チャネルをクローズするには、closeコマンドでノードIDを指定します。

$lightning-cli close 035dfaa4c932a22018b1e583d2b9f5197240db60151c639e5c75614c0903349339

"Peer is already closing: state STATE_SHUTDOWN"

これでクローズされたはずです。勘定がブロックチェーンに反映されるはず。ただ、現時点では、ちゃんと反映されたかどうかを確認できませんでした。

どのTxクローズしているのか表示されない上、Lightningdが作成するSegwitアドレスを検索できるエキスプローラーが見つからないため、追うことができません。このあたりまだまだ実装途中という感じがします。

<次回>

以上ですが、基本的な送金の動作は理解できました。今回は、単純にピアに直接接続しましたが、次回は間に中継者を挟んでの送金が可能かどうかを確かめてみたいと思います。

今回手ほどきいただいた今井氏によるレクチャーのセッションやセミナーも予定していますので、ご期待下さい!

(追加)続き記事を書きました。

ライトニングネットワーク動作実証(その2)中継ノードを介した支払い

・おしらせ
ビットコイン研究所の有料版サロンでは、平易な言葉で最近の技術や業界事情などについて解説するレポートを毎週配信しています。

暗号通貨について、もっと知りたい、勉強をしたいというかたに情報を提供しています。サロン内では疑問点も質問できます。

一度登録いただけると100本以上の過去レポートが読み放題で、大変お得です。レポート一覧がこちらのページありますので、よろしければいちど目をとおしてみてください。