Multi Path Payment(MPP)で送金する

単発でumbrelから多額(数百万〜sats)の送金したい。しかし、エラーになる or 手数料ぼられる、かといって小分けにインボイスを発行するのも手間がかかる、という場面でCLIツールのlncliから一つのインボイスをMPPで送金するやり方の忘備録です。 MPPの説明はこちら。受金者は一つのインボイスで、送金者(umbrel)は複数のパスが可能になるので、例えば100万を10万×10本に分割して送金が通りやすくかつ手数料が安いルートにヒットしやすくなります。 https://lightning.engineering/posts/2020-05-07-mpp/ やり方 umbrelにログインした後に以下のコマンドを発行します。 docker exec -it lightning_lnd_1 lncli sendpayment \ --pay_req [invoice] \ --max_parts 100 \ --fee_limit 2500 \ --max_shard_size_sat 100000 \ --outgoing_chan_id 816130156246007800 コマンドの解説 4つ目はdockerのコンテナ nameです。v0.5からlndもオプションになったからか以前のlndからlightning_lnd_1に変わってました。1と付いていて怪しいのでコマンドが見つからなくなったらdocker psでnameをチェックするのがよさそうです。 pay_reqオプションにセットする値はインボイスの発行識別子です。lnbcとかで始まるアレ。 max_partsオプションでMPPを有効にします。値には分割する最大数をセットします。 fee_limitオプションは最大料金のsats指定です。これ逃すと手数料が悲しいことになるのでppmから計算して必ずセットしましょう。(1000ppmで0.1%) max_shard_size_satオプションは1本あたりの金額です。ここを指定しないと半分にしただけで送られがちです。 outgoing_chan_idオプションは送金に使いたいChannel IDを指定します。LNDgやRTLで確認できます。 余談 fee_limitとmax_shard_size_satのオプションが重要。これ忘れて初めはガッツリ手数料いっちゃいました。。 outgoing_chan_idオプションを設定しないと売り物のアウトバウンドが使われて悲しい気持ちになりました。。apiだと複数指定が可能ですがlncliにもくるとさらに融通が効きやすくなりますね。 fee_limitだけでなくfee_limit_percentageもあるが、最低1%からになっていて何に使うのかよくわかりませんでした。 他にもオプションはあるので上記以外の調整可能です。lncliはドキュメントもテストコードも無かったので実際の値が何になるか調べるのに苦労しました。オプション種類についてはコマンドラインヘルプdocker exec -it lightning_lnd_1 lncli sendpayment -h、値についてはgoのソースコードhttps://github.com/lightningnetwork/lnd/blob/master/cmd/lncli/cmd_payments.goから解読しました。いい参照先があったら教えてください。

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

バッジャー君

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