Python + ngrokでLN決済APIサーバの構築

本業が落ち着いて時間的に余裕ができたので久しぶりにLN系の開発に戻ってきました。久々にLNDのAPIドキュメント見ましたが完全に忘れてます! さて、今回はpythonでLNの決済処理をやってみたいと思います。内容的には以前にDH開発部で作った内容から決済部分のみを切り出してシンプルなWEB APIにしたものになります。DHチャットでngrokの話題を見かけたのと決済の所は以前から気になっていたので合わせて実装してみました。 大した事してないので、もういきなりソースで説明します。呼び出し側のサンプルhtmlはこんな感じです。 <html><head> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> <script type="text/javascript"> $(function(){ $('#button1').click(function (){ $.get('https://0fcb-117-108-71-175.jp.ngrok.io/createinvoice/' + $('#text1').val() + '/' + $('#text2').val()) .done(function(ret){ $('#amount').text(ret.amount); $('#bolt11').text(ret.bolt11); $('#desc').text(ret.desc); $('#r_hash').text(ret.r_hash); $('#qrImg').attr("src", ret.qr_str); $('#sect').show(); }) ; }); $('#button2').click(function (){ if($('#r_hash').text() != ""){ $.get('https://0fcb-117-108-71-175.jp.ngrok.io/checkinvoice/' + $('#r_hash').text()) .done(function(ret){ //1:支払い済み; 0:未払い if(ret.state == "1"){ $('#status').text("決済完了!"); }else{ $('#status').text("決済未完了.."); } }) ; } }); }); </script> </head> <body> <INPUT id="text1" type="number" value="100" cols=40> <INPUT id="text2" type="text" value="memo" cols=40> <button id="button1" >invoice</button> </br></br> <div id="sect" style="display:none"> <div>amount:<div id="amount"></div></div><br> <div>invoice:<div id="bolt11"></div></div><br> <div>desc:<div id="desc"></div></div><br> <div>payment_hash:<div id="r_hash"></div></div><br> <img id="qrImg" style="height: 200px;width: 200px;"><br><br> <button id="button2" >check</button> <div>status:<div id="status"></div></div> </div> </body></html> これをhtmlファイルでデスクトップにでも保存してください。そのままダブルクリックすると下の画面が表示されます。 <img src="https://s3-ap-northeast-1.amazonaws.com/spotlight-s

LNノードのバックアップ&リストア考察

Lightning Networkのノード運用をする場合、特に重要なのがバックアップです。オンチェーン上のビットコインのバックアップは秘密鍵を保管しておくだけで良いですが、LNのノード運用をする場合は少し特殊です。LNノードのバックアップは大きく2つに区別することができます。それは①オンチェーン資金のバックアップと②オフチェーン資金のバックアップです。①のバックアップは秘密鍵の保管をするだけで問題ありません。②のオフチェーン資金のバックアップとは、チャネルのバックアップです。LN上のチャネルは送受信がある度にチャネル状態が更新されていくので、その都度バックアップをとる必要があります。もし古いチャネル状態で相手と通信をすると、不正な状態と見なされ、最悪の場合、資金を失うかもしれません。 data loss protection そのような場合を考慮して、LNの仕様書では data loss protection (DLP)と呼ばれる安全装置が付いています(02-peer-protocol)。これは、もしアリスのチャネル状態が5で、ボブのチャネル状態が6だった場合、アリスのチャネルは古い状態なので、ボブにチャネルを強制閉鎖することを依頼できる仕組みです。この依頼を受けたボブが取れる行動は、(a)最新のチャネル状態6で強制閉鎖するか、(b)古いチャネル状態、例えば自分の残高が多くなるようなチャネル状態まで遡り、そのチャネル状態で強制閉鎖することが考えられます。ボブが(b)の選択をしても、もしアリスが嘘を付いていて最新のチャネル状態までデータを保持していると、ボブはペナルティとして、アリスに全額没収されてしまいます。そのため、ボブは(a)の正直な選択を取ったほうが無難なのです。これが data loss protection と呼ばれる仕組みで、ゲーム理論的な側面があります。この仕様は各LNソフトウェアに実装されています。 またLNDでは、static channel backup(SCB)と呼ばれるチャネル開設がある度に取得するバックアップがあります。これは、最初のチャネル状態だけをバックアップして、リストア時にSCBからチャネル状態を復元しようとするとチャネル状態が古いので、DLPによってチャネルの強制閉鎖を相手に依頼するというものです。このSCBはLNDのみ実装されており、c-lightningやEclair coreには実装されていません。LNのバックアップでは秘密鍵以外にも②のチャネルのバックアップも必要でした。一見するとこのSCBは必須な気がしますが(実際コミュニティでも議論されている[1] [2] [3])、そもそも data loss protection は自分がデータを消失したことを相手に通知する仕組みで、ゲーム理論的な側面があるにしても、相手が不正をせずチャネル閉鎖をしてくれることに依存・信頼を置いています。この理由からLND以外のソフトウェアはSCBの実装がされていないのが現状です。ただ、c-lightningでは lightningd.sqlite3 がチャネル状態諸々を管理するDBで、このDBをチャネル開設ごとに保存することで、LNDのSCBと同じように相手にチャネル強制閉鎖を要求することが実質可能です。 static remotekey SCBによるバックアップができない場合、チャネル上の資金を回収することはできないのでしょうか?理想的には①の秘密鍵だけを保管することです。その状態に近づけるために考案されたのが static remotekey と呼ばれる仕組みです(03-transactions)。LNのチャネルは送受信がある度にチャネル状態が更新されますが、それに伴い強制閉鎖するための commitment tx のアウトプットも変化していきます。それ故にチャネル状態を常に追っていく必要がありまし

バッジャー君

Spotlight

SNS platform for distributing digital content using Bitcoin. Each piece of content can be sold or purchased for as little as one $0.01 in Bitcoin, making it a fun place to start for both readers and creators.

Sign up
Search spotlight

Reckless ads

ads here

Trending Stories