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

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

レポート「アルトコイン図鑑」では30種類以上のコインを解説ビットコイン研究所

レポート「ビットコインの情報源決定版(26ページ)」を配信しました。レポート内容へ

ライトニングネットワークの動作実証を行っています。前回は1対1で1ミリサトシを送るという実験をおこないました。

今回は、ライトニングネットワークの所以である、第三者の中継ノードを介した支払いを行い、動作を確認しました。

下記に詳しい手順を書きます。

また今回の実験も、Masterring Bitcionの翻訳者である今井崇也博士の指導のもと、大石、本間氏を加え3人で行いました。

<第三者を介した支払いとは>

hash

上記がライトニングにおけるネットワークの一例です。Aliceが、Daveに送金をしたいとおもったとき、かならずしもAliceとDaveが直接つながっている必要はありません。BobやCarolという第三者を介してチャネルが接続されていれば、安全にAlice to Daveの支払いができます。

今回は、このような中継支払いの実証を行いました。Screenshot from 2017-01-24 16-40-38

これが模式図になります。支払者がOishi、受取人がHommaです。間を中継するのが、Dr.今井のハブノードです。

ライトニングでは中継を多段階で行うことができますが、今回は簡略化して中継ノードを1つとしました。いわゆるペイメントハブ的な構成になります。

実験の手順は次のようになります。

  1.  Oishi →  Hub のチャネルを張る
  2.  Hub  →  Homma のチャネルを張る
  3.  Oishiから、Hommaのルートを取得する
  4.  Hommaが支払いinvoiceを作成し、R-hashをOishiに伝える
  5.  Oishi が HonmaにHub経由で支払う
  6.  残高を確認する

それぞれ手順を記載します。

Oishi →  Hub のチャネルを張る

$lightning-cli connectlightningd-testhub.unitedbitcoiners.com 9735 0100000001b23c11eb3ebb610da19615a8c6579743a9c237544d54b05a12c274fcd8935f97010000006a4730440220486672f6d2de3f209fdf24aea06844398dd6f535f389628b97b767586ce4dc5c02204071068058c28b7bd0cb3cc60ba50670d0be0192f167599ff00b4c0fe0001e840121027874890e4036aa74835bd536a685497b6d91d8051806d7c95d4c6c38e059c4a2feffffff02d4310301000000001976a91494881e38d021b401c15fbcac3f0dc39585b3d40288ac80841e000000000017a914ecd9e1468f8f14614b14b756ef8b9816b3f839958728921000

lightningd-testhub.unitedbitcoiners.com というのが今回のハブのノードです(ポート9735)。前回の手順と同様に、これにチャネルを張ります。getpeersでステートを取得し、Connectedになっていることを確認します。

Hub  →  Homma のチャネルを張る

同様に、ハブから、Honmaへのチャネルを同様の手順で張ります。これは、Honmaからハブに対して張っても良いはずです。Lightningdではチャネルを張ると、双方向のペイメントチャネルになるので、どちから張っても大丈夫だとおもいます。

Oishiから、Hommaのルートを取得する

ルートを取得するにあたっては、まずHomma氏のノードをIDを知る必要ああります。そのあたりのプロトコルは整備されていないので、手動で教えてもらいました。

homma氏のノードIDは、026163c993eb0e27313288b9b735e23ff1ca0c7d8db0b486d6d2a40047544dc29a 10000でした。

$lightning-cli getroute 026163c993eb0e27313288b9b735e23ff1ca0c7d8db0b486d6d2a40047544dc29a 250 1
{ "route" : 
 [ 
 { "id" : "035dfaa4c932a22018b1e583d2b9f5197240db60151c639e5c75614c0903349339", "msatoshi" : 251, "delay" : 72 }, 
 { "id" : "026163c993eb0e27313288b9b735e23ff1ca0c7d8db0b486d6d2a40047544dc29a", "msatoshi" : 250, "delay" : 36 } ] }

getroute コマンドをつかってルートを取得します。getroutのあとにノードのID、送りたいコインの量、最後に1を指定します。

無事にルートが取得できました。これによれば、中継ノードとして035dfaa・・というノードが出現しています。

このノードに251 mSatoshiの支払いをして、最終ノードの026163c・・というのに250 m Satoshiが支払われるようです。

この差額の1 m Satoshiは何かというと、どうやら中継ノードの手数料ということのようです。

Hommaが支払いinvoiceを作成し、R-hashをOishiに伝える

Homma氏のほうで、invoiceをつくります。

Hommma$lightning-cli invoice 50 oishi-imai5

{ "rhash" : "ce44e447edc532aeefa30eb96d4967a1a660e657db66dea0f9756fcde317ae24" }

Homma氏のノードで上記を実行します。oishi-imai5はこの支払いの名称です。rhashが取得できたら、これを教えてもらいます。

Oishi が HonmaにHub経由で支払う

支払いです。ここでは、send-payに対して、先ほど取得したルートの情報を指定し、rhashを教えてあげる必要があります。

$ lightning-cli sendpay '[{"id":"035dfaa4c932a22018b1e583d2b9f5197240db60151c639e5c75614c0903349339", "msatoshi":251,"delay":72 },{"id":"026163c993eb0e27313288b9b735e23ff1ca0c7d8db0b486d6d2a40047544dc29a", "msatoshi":250,"delay":36 }]' ce44e447edc532aeefa30eb96d4967a1a660e657db66dea0f9756fcde317ae24

書式は、

lightninng-cli sendpay <route> <rhash>

です。routeのところは、先ほど取得したルートの情報をそのままコピペしたものです。このとき、ルートの支払い額、invoiceの請求額など、金額情報が一致してないとエラーになりますので注意。

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

{ "preimage" : "9bbb772c2df51146fd0d3d2251f31b2855d179b18e216ace2a340361b1472404" }

受け取り側のHomma氏の画面には、

035dfaa4c932a22018b1e583d2b9f5197240db60151c639e5c75614c0903349339: Immediately resolving 'oishi-imai5' HTLC 5

中継ノードのIDからのメッセージとして、’oishi-imai5’のinvoiceが支払われたことのメッセージが出現します。

残高を確認する

さて、それぞれの視点からどのような残高になっているのかを確認してみましょう。

下記は支払い者のOishiの視点です

{ "peers" : 
 [ 
 { "name" : "035dfaa4c932a22018b1e583d2b9f5197240db60151c639e5c75614c0903349339:", "state" : "STATE_NORMAL", "peerid" : "035dfaa4c932a22018b1e583d2b9f5197240db60151c639e5c75614c0903349339", "connected" : true, "our_amount" : 465602000, "our_fee" : 30694748, "their_amount" : 0, "their_fee" : 251, "our_htlcs" : 
 [ ], "their_htlcs" : 
 [ ] } ] }

これを見ると、Hubに対して(their_fee)、251 m Satoshiを支払っているという形になります。受取人のHomma氏の情報は表示されず、あくまで、チャネルを張っているHubノードにたいして、251の支払いが生じています。

次が受取人のHomma氏です。

 { "peers" : [ { "name" : "035dfaa4c932a22018b1e583d2b9f5197240db60151c639e5c75614c0903349339:", "state" : "STATE_NORMAL", "peerid" : "035dfaa4c932a22018b1e583d2b9f5197240db60151c639e5c75614c0903349339", "connected" : false, "our_amount" : 0, "our_fee" : 250, "their_amount" : 965604000, "their_fee" : 30692750, "our_htlcs" : [ ], "their_htlcs" : [ ] } ] }

これをみると同様に、Hubノードに対しての金額のみが表示されます。これによれば、250 m Satoshi を受け取っている(our_fee)ということになります。

(差額の1m Satoshiは、先ほど説明したように、ハブ側にのこる中継手数料です)

<公開中継サーバーについて>

以上が実験の内容になります。

実際に追試をしてみたい読者のために、これを機会に、公開中継サーバーを設置しました。(今井博士提供)

常時接続を受け入れる日本初のライトニングハブになります。

これに接続してみたい方は、下記で接続ください。なお接続できるのは lightningd のみです。

Server: lightningd-testhub.unitedbitcoiners.com
Port:9735
Node ID:  035dfaa4c932a22018b1e583d2b9f5197240db60151c639e5c75614c0903349339

このブログの読者のかたもこれにチャネルを張ることさえできれば、(すでにチャネル開設済みの)私や本間氏に対しても支払いができるようになるはずです。

もしチャネルを張った方で、私に送金したり、私から受け取ってみたいというかたは、twitterやfacebookでご連絡ください。やり取りさせていただきたいと思います。

次回ですが、ライトニングの他の実装である、lndやlitについても動作の検証を行って行きたく思います。ご期待下さい!

<追記>

lndとlitについても、公開ハブを設置しました。下記から接続ください(なおこちらについてはたまに落ちるかもしれません)

  • lnd

lnd-testhub.unitedbitcoiners.com :10009

  • lit

lit-testhub.unitedbitcoiners.com :10011

<関連記事>

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

詳細日本語マニュアル付きTrezorの購入はコインギフトから

初心者向け「使って勉強!ビットコイン」DMMオンラインサロン