LNのインボイスの可能性

はじめに

Yuya
GBEC Tech Blog
10 min readDec 25, 2018

--

ライトニングネットワークでのコインの送受信はインボイス支払い型のため、通常のビットコインオンチェーンのように相手アドレスに対して勝手に投げ銭などができない側面があります。インボイスは使い捨てで、支払いがあったインボイスに対して再度支払いができない仕様になっています。そこで今回はインボイスの作成をちょっと工夫して、投げ銭ができるようにしたいと思います。また、インボイスの主要なフィールド情報についても取り上げたいと思います。

インボイスのRFCはここから参照可能です。

本ブログの例ではc-lightning v0.6.2–111-g95e47cd を使用しています。LNDや他のLNノードでは未サポートなコマンドなどもあると思いますので予めご了承ください。

インボイスの構成

まずはインボイスの構成について簡単に見てみましょう。以下がRFCで定義されている各フィールドです。大きく2部構成となっており、上段のHuman-Readable部分と下段のData部分に分かれます。Human-Readableではプレフィックスと金額を指定します。ここは人の目で見て分かるようになっています。例えば「lnbc10n」の場合、メインネットのビットコインを10* 0.000000001BTC (nは0.000000001を乗算するという意味)をライトニングネットワーク上で送金すると言う意味になります。

Data部分は bech32 encodingによって構成されています。その為、目視で読むことは普通の人にとっては不可能です。Data部分で重要なのは以下のtypeで記載している各パラメータです。主要なtype情報は以降で取り上げます。

注:type「h」は、「d」のメモ情報が640bytes以上の場合、その値がハッシュ化されてhフィールドへ埋め込まれます。ただし、現時点でその仕様は未サポートで、640bytes以上のメモはまだ付加できない状況です。

■ Human-Readable Part
-prefix
-amount
■ Data Part
-timestamp
-tagged parts(0 or 1+)
-type
p : ペイメントハッシュ値
d : メモ情報
n : PayeeのノードID
h : メモ情報のハッシュ値(現時点で未サポート)
x : インボイスの有効期限
c : CLTVの最小間隔
f : フォールバックアドレス
r : ルーティング情報
-data_length
-data
-signature

無期限かつ任意金額なインボイス作成

では実際に投げ銭ができるようなインボイスを作っていきましょう。インボイス作成時のパラメータを以下のようにします。

  1. expiry:100年(LNDの場合最大値は1年)
  2. amount:any

実際のコマンドは以下の通りです。expiryの指定は秒なので3153600000とします。このようにしてインボイスを複数作成しておき、各インボイスをばら撒けば、支払い側は好きな金額で送金することが可能になります。tippin.meではこのように任意金額可能なインボイスを作成することで、支払い者に好きな金額を入力できるようにしています。

$ lightning-cli invoice any label description 3153600000{“payment_hash”: “05895a246cd01f9f7749dc8a66d12f536d8915e6f5653c405ef7975ad829d66e”,“expires_at”: 4699000986,“bolt11”: “lnbc1pwpeu56pp5qky45frv6q0e7a6fmj9xd5f02dkcj90x74jncsz777t44kpf6ehqdqqxq8zals8sqcqp2rzjq0jsfyh2ksg85ae3gxa5r8ss00drmc742efwdcdyzgjlq6sthuk4vzr9kyqq5ksqqqqqqqlgqqqqn3qqjqkx3gyx7lgum3csu63653u3ggdy3pcdtaxqcqzklfd4vc4e4z8xvkupadhpdt7d6lc4vts8ekm37p0279x8zp6pr25srwxjme7vhnyacqcqrflp”}

ルーティング情報

インボイスにはPayeeまでのルーティング情報を付加することができます。ルーティング情報があることでPayerがPayeeへ送金するための成功確率があがります。これは、各LNノードによって仕様が異なるのですが、c-lightningの場合、Payeeのincoming amountが大きいチャネルを持つノードをルーティングノードとしています。

以下のコマンドでインボイスをデコードすると「routes」フィールドに中継ノードが表示されていることが分かります。Payerはこのノードをホップして送金するようになります。Payerがそのホップノードとの間にチャネルがない場合は、別なルートを探索します。

$ lightning-cli decodepay lnbc1pwpeu56pp5qky45frv6q0e7a6fmj9xd5f02dkcj90x74jncsz777t44kpf6ehqdqqxq8zals8sqcqp2rzjq0jsfyh2ksg85ae3gxa5r8ss00drmc742efwdcdyzgjlq6sthuk4vzr9kyqq5ksqqqqqqqlgqqqqn3qqjqkx3gyx7lgum3csu63653u3ggdy3pcdtaxqcqzklfd4vc4e4z8xvkupadhpdt7d6lc4vts8ekm37p0279x8zp6pr25srwxjme7vhnyacqcqrflp{"currency": "bc","created_at": 1545400986,"expiry": 3153600000,"payee": "033613d280de1eba995c7545e93caf76cfba41bef88c2d6732a67ce06c168b3acb","description": "","min_final_cltv_expiry": 10,"routes": [[{"pubkey": "03e50492eab4107a773141bb419e107bda3de3d55652e6e1a41225f06a0bbf2d56","short_channel_id": "550321:2650:0","fee_base_msat": 1000,"fee_proportional_millionths": 2500,"cltv_expiry_delta": 144}]],"payment_hash": "05895a246cd01f9f7749dc8a66d12f536d8915e6f5653c405ef7975ad829d66e","signature": "3045022100b1a2821bdf47371c439a8ea91e450869221c357d3030015be96d598ae6a2399902206e07adb85abf375fc558b81f36dc7c17abc531c41d046aa406e34b79f32f3277"}

メモ情報

インボイスには「description」フィールドに UTF-8エンコードされた任意の文字列(日本語も可能)をメモとして付加することも可能です。先にも触れましたが、このメモ情報は現時点で639bytesまでとなっています。

$ lightning-cli invoice any label “ラーメン1杯1000円!?”{“payment_hash”: “b02d039c7142c50e056c7e9cd60ae130e7a5d7f9e92689bbd5fc6c6afc04c9e7”,“expires_at”: 1545407552,“bolt11”: “lnbc1pwpel3spp5kqks88r3gtzsuptv06wdvzhpxrn6t4leayngnw74l3kx4lqye8nsdpluwp6ncurhn3c8g0rswe7l0y3u6w6lmauj8hmey80hjgwl0ysukrgdmaus8hme8ccqp2rzjqwec7hakjwhfdldf2v78hfzcgrq2l3peq4zzywscm4nkmpvtl4d32zzu9gqqypcqqqqqqqlgqqqqryqqjq23c76z2srkcpy8kmp2ghj7vmat66dl0c7jchfre50g46d2txllezpvzqyu0avcfxfnulz5xp8h5samack8ca93vqfae8xwdyhphpykqq7p6r7p”}

フォールバックアドレス

これはLN支払いが失敗した場合に、オンチェーンでの支払いへ切り替える場合の代替手段です。このアドレスは、オンチェーンビットコインアドレスであり、支払い者がLN上で支払いに失敗した場合に、通常のオンチェーンでPayeeへ支払うためのものです。フォールバックと言っても自動で送金が切り替わるわけではなく、送金者が任意でそのビットコインアドレスへ送金可能というものです。

$ lightning-cli invoice any label1112 “” 3600 [37Nxj1Df2DaDdJtuhu3b8ZHjmeyhvvb189]{“payment_hash”: “b8cf25ec30e5cf87b8d3b77ae48416463dcbbfed7613b33eaaf6bdda6c08df61”,“expires_at”: 1545408077,“bolt11”: “lnbc1pwp6qpapp5hr8jtmpsuh8c0wxnkaawfpqkgc7uh0ldwcfmx042767a5mqgmassdqqcqp2fppj8enf34ar4aewl6f0p6l7mrfzlez5mpjzrzjqwec7hakjwhfdldf2v78hfzcgrq2l3peq4zzywscm4nkmpvtl4d32zzu9gqqypcqqqqqqqlgqqqqryqqjqshsf4ka3yp298xur3na2g8pvu5rwwlemret2a86acyctrrfe6hw8athuxefc98z2a46ecv6sadye9w5q675ztddxpy6cvnhzxpap6zgq5gwfcq”}

以上が主要なインボイスのパラメータでした。これらのパラメータを工夫することで、何か新しいLNの使い道が開けるかもしれません。

執筆者: 小川

お知らせ

■HashHubでは入居者募集中です!

HashHubは、ブロックチェーン業界で働いている人のためのコワーキングスペースを運営しています。ご利用をご検討の方は、下記のWEBサイトからお問い合わせください。また、最新情報はTwitterで発信中です。

HashHub:https://hashhub.tokyo/

Twitter:https://twitter.com/HashHub_Tokyo

■ブロックチェーンエンジニア集中講座開講中!

HashHubではブロックチェーンエンジニアを育成するための短期集中講座を開講しています。お申込み、詳細は下記のページをご覧ください。

ブロックチェーンエンジニア集中講座:https://www.blockchain-edu.jp/

■HashHubでは下記のポジションを積極採用中です!

・コミュニティマネージャー

・ブロックチェーン技術者・開発者

・ビジネスディベロップメント

詳細は下記Wantedlyのページをご覧ください。

Wantedly:https://www.wantedly.com/companies/hashhub/projects

--

--