ビットコイン・インスティテュート

[Lightning-dev] ​(ライトニングの)​ビットコインで​ピザを​?

ライトニングネットワークで、本物の取引を試してみたかったんだ。近所にライトニングのビットコインを受け付けるピザ屋はまだ知らないけど、ロンドンの友人が引き受けてくれて、ピザの配達を地元の店に下請けに出してくれた。

要するに、私がライトニングネットワークでビットコインを払い、友人がピザを届けてもらう手配をした。この取引では、友人はライトニングの支払いを受けるリスクを引き受ける仲介役にすぎないけど、毎日の取引でこれがどう動くかの基本は示せる。ピザ屋が自分のライトニングのノードで直接支払いを受けても、まったく同じことだ。

ピザは2枚にして、できるだけアトミックに近い形でやりたかった。先に払ってピザが来ない、というのは避けたかったんだ。私の知る限り、ピザとビットコインのアトミックスワップのソフトウェアはまだないけど、即興で、ピザを受け取るには支払いのハッシュのプリイメージを配達員に示すことにした。プリイメージを出せなければ、つまり払ったことを示せなければ、ピザは渡されずに処分される。請求書を払わないとプリイメージは手に入らないから、これでうまくいく。私はチャネルを開いて、費用の見込みに足りる額を入れることにした。この条件で合意すると、友人は、私がブロックチェーン上でチャネルに資金を入れたことを確かめられた。少なくとも私がお金(ビットコイン)を持っていることは、それで分かる。友人は事業としてのリスクを少し負って、下請けにピザを作って届ける代金を先に払うけど、この時点では私のビットコインはリスクにさらされていない。チャネルに入れてあるだけだ。bolt11の請求書をもらったので、c-lightningのcliでデコードして、すべて合意どおりかを確かめた。

$ ./lightning-cli decodepay lnbc6490u1pdfrjhcpp5jyxuuskqw53apgqvtxa7emcrz5vs0qr2sxjayxv7jj70jznnl94sdp5x9vycgzrdpjk2umeypgxj7n6vykzqvfqg3jkcatcv5s9q6t60fssxqyzx2qcqpgaue37x27yp3pn4cr6wuprvwedncz4kavqh83cp3l0vwfrprj0xj8cedkfmjdzea0xpp0jazfcyy77cq37ej6d3xvmujmgu56pe56ktcqa3vcys
{ "currency" : "bc", "timestamp" : 1519504120, "created_at" : 1519504120, "expiry" : 72000, "payee" : "0397b318c5e0d09b16e6229ec50744c8a7a8452b2d7c6d9855c826ff14b8fa8b27", "msatoshi" : 649000000, "description" : "1XL Cheesy Pizza, 1 Deluxe Pizza", "min_final_cltv_expiry" : 8, "payment_hash" : "910dce42c07523d0a00c59bbecef03151907806a81a5d2199e94bcf90a73f96b", "signature" : "3045022100ef331f195e206219d703d3b811b1d96cf02adbac05cf1c063f7b1c91847279a402207c65b64ee4d167af3042f97449c109ef6011f665a6c4ccdf25b4729a0e69ab2f" }

ピザが届くと、配達員に「プリイメージは?」と聞かれた。そこで請求書を払うと、すぐにプリイメージが返ってきた。

$ ./lightning-cli pay lnbc6490u1pdfrjhcpp5jyxuuskqw53apgqvtxa7emcrz5vs0qr2sxjayxv7jj70jznnl94sdp5x9vycgzrdpjk2umeypgxj7n6vykzqvfqg3jkcatcv5s9q6t60fssxqyzx2qcqpgaue37x27yp3pn4cr6wuprvwedncz4kavqh83cp3l0vwfrprj0xj8cedkfmjdzea0xpp0jazfcyy77cq37ej6d3xvmujmgu56pe56ktcqa3vcys
{ "preimage" : "7241e3f185148625894b8887ad459babd26540fc12124c3a7a96c937d89da8c1", "tries" : 1 }

簡単にするために、プリイメージは16進の文字列の頭と尻の4文字だけにすると決めてあった。だから私の答えは7241-a8c1。メモ帳に書いて配達員に見せると、配達員は自分のメモ帳と見比べて、ピザを渡してくれた。プリイメージを人に教えるのは、たぶん良いやり方ではない。配達員は全部の文字列を持っておらず、私が持っていることを確かめられる分だけだった。

自分の請求書のプリイメージはどうやって得るのか? c-lightningなら、こうすればいい。

$ ./lightning-cli invoice 12345 label description
{ "payment_hash" : "e04dfbd4adc634779b560c8e7072f883d5f17a3e32a33603bfc90a8682873d44", "expiry_time" : 1519523498, "expires_at" : 1519523498, "bolt11" : "lnbc123450p1pdfyzy6pp5upxlh49dcc680x6kpj88quhcs02lz737x23nvqaley9gdq5884zqdqjv3jhxcmjd9c8g6t0dccqpg802ys4s4z3rpm6d8zvdgq397wewh5kaz527hnglz9xsmjxfjrhe3mxq9pp7pqm0pwcwm748tav4am97gqrvnzxnlw5uxxawgw4vcywgphj26nf" }
$ sqlite3 ~/.lightning/lightningd.sqlite3 "SELECT quote(payment_key) FROM invoices ORDER BY id DESC LIMIT 1"
X'D3BE7E68D8B38B15A5194AEA131A21429A1987085C95A0631273273546FF5ED8'

それから、もう一度ハッシュを取って上の請求書のpayment_hashと比べれば、正しいプリイメージだと確かめられる。

$ echo "D3BE7E68D8B38B15A5194AEA131A21429A1987085C95A0631273273546FF5ED8" | xxd -r -p | sha256sum
e04dfbd4adc634779b560c8e7072f883d5f17a3e32a33603bfc90a8682873d44  -

プリイメージは誰にも教えないほうがいい。

じゃあ、オンチェーンの取引でやる代わりにこうする意味はあるのか? ここで書いたことに限れば、たぶんない。目的は、c-lightningをいじって、数サトシを行ったり来たりさせる以上のことをやってみることだったんだ。そのうちピザ屋が自分のライトニングのノードを持って、私が直接チャネルを開けるようになるかもしれない。

-Laszlo

原典の外部ソース

https://web.archive.org/web/20180225212137/https://lists.linuxfoundation.org/pipermail/lightning-dev/2018-February/001044.html
lists.linuxfoundation.orgの元の保存はもう開けないので、Wayback Machineの2018年2月25日の写しを示す。