
原題:「Dry Goods | Lightning Network Application Development のクイックガイド」Michael Rhee 著
Lightning Network プログラミングを始めたいが、いわゆる正しいベストプラクティスには興味がない場合は、この記事が最適です。言い換えれば、このガイドラインは非常に主観的なものです。オライリー スタイルの権威あるテキストを好む場合、この記事は好みではないかもしれません。ただし、Lightning Network の最小限の開発環境とその基本的な内容を理解したい場合は、読む価値があります。この記事を書く目的は、初心者がすぐに構築して実験できるように、ライトニング ネットワーク アプリケーションを作成するための基本的な知識ポイントを抽出することです。
基本をマスターしていれば、より複雑で安全なアプリケーションを作成できると私は信じています。しかし、誰もがどこかから始めなければなりません。私の個人的な感覚では、最初はすべてが難しいものです。これらの考えをまとめることで、一部の迷える子羊の痛みを和らげることができると思います。
詳細に入る前に、私自身について少し背景を説明させてください。
約 1 か月前、私はデータ アーキテクトとしての安定した仕事を辞め、絶えず変化するビットコイン エコシステムについて研究し始めました。この記事は、あなたがその一歩を踏み出した (または考えている) ことを示しています。
簡単に言えば、ビットコインは私がこれまで見た中で最も興味深い技術革新だと思います。ビットコインについて学べば学ぶほど、私はビットコインにどんどん惹かれていきました。ビットコイン テクノロジーは、今日の私たちの交流方法を変え、さらには再構築し、まったく新しいものにすることを約束します。私も自分の役割で貢献できればと思っています。
だからこそ、私はビットコインで開発することを選びました。この記事が、Lightning Network エコシステムとその可能性をよく知らない開発者にとって有益であり、より多くの開発者がビットコイン領域に創造性を注入することを奨励することを願っています。
正直に言うと、ビットコインのエコシステムについて書きたいことはたくさんありますが(「エネルギーを裏付けた通貨」という概念が一番です)、それはまた別の日まで待たなければなりません。さて、本題に入りましょう。
画像の説明
-出典: lnrouter.app-
ライトニングネットワークの基本設計は、チャネルを使用してノード間で1対1の接続を実現することです。チャネルを開くには、一定量のビットコインを入金する必要があり、このトランザクションはビットコイン ブロックチェーンに記録されます。その後、ユーザーは特別なオフチェーン契約を使用して、ブロックチェーンに新しいトランザクションを送信することなく、ノード間のチャネルでビットコインを転送できます。
実際的なアプローチは、チャネル内のバランスの変化をリアルタイムで追跡することです。たとえば、Alice で開いたチャネルに 100 SATOSHI を入金した場合、約 100 SATOSHI (オンチェーントランザクション手数料を差し引いた) の転送割り当てがあり、Alice に直接転送することも、Alice を介して間接的に転送することもできます。各トランザクションでチャネルのバランスを調整するだけでよいため、これらの転送はほぼ瞬時に行われます。この調整は、送信者と受信者の間で暗号化されたメッセージを渡すことによって実現されます。
Lightning アプリケーションは、Lightning Network (いわゆる Bitcoin Layer 2) 上で実行されます。 Lightning アプリも支払い方法としてビットコインを使用しますが、決済が速く、取引手数料が低くなります。
ライトニング ネットワーク プロトコルの概要についてはごく簡単に説明しただけですが、始めるにはこれで十分です。 Lightning Network がどのように機能するかをさらに詳しく理解したい場合は、ここに記載されている内容を参照してください。コンピューターの前に座って遅くまで本を読みながら、コードを 1 行も入力せずに、知識の海に耽溺しないように注意してください。それが必ずしも悪いことではありませんが、私たちの目的はやはり練習することです。さらに、十分な睡眠を確保することも大切です。
ライトニングネットワークとそのノードがどのように機能するかを理解するためのより良い方法は、自分でノードを実行し、支払いがノードを介してどのようにルーティングされるかを理解することだと思います。この方法は時間とお金がかかりますが、興味深く、知識も豊富です。 1
成し遂げる
ライトニング ネットワークはオープン プロトコルです。これは、ライトニング ネットワークにはメッセージを通信および解釈するための標準的な方法があることを意味します。 HTTPS や TCP/IP が誰にも所有されていないのと同様に、Lightning Network プロトコルも所有者ではありません。規格を遵守していれば、誰でもライトニングネットワークに参加できます。それだけでなく、開発者がプロトコルを強化し、新しい機能を追加し続けるにつれて、標準も進化し続けます。
現在、Lightning Labs、Blockstream、ACINQ、Square Crypto の 4 つの企業が Lightning プロトコル開発の中心となっており、すべて独自の実装を行っています。
Lightning Labs — lnd (Go)
Blockstream — c-lighting (C)
ACINQ — eclair (Scala)
Square Crypto — Rust Lightning (Rust)
上記の実装はすべて、Lightning Network 経由で通信できます。違いは、これらの実装の API です。この記事では、Lightning Labs の lnd のみに焦点を当てます。これは、Lightning Labs が私にとって初めて接触したものであり、私が最もよく知っているものであるためです。私が最終的に Ind を選択したのは偶然の要因ですが、Lightning Labs の Ind ドキュメントはよく書かれており、開発者は公式 Slack チャネルを通じて多くのヘルプとサポートが得られることを自慢しなければなりません。
以下の説明はインドを中心に展開しますが、基本概念はすべての Lightning Network 実装に適用されることに注意してください。
あなたの開発環境
でたらめではありません。Polar を使用してください。
さて、あと少しだけ。開発者であってもユーザーであっても、Lightning Network 上に構築する際の最大のハードルは、バックエンドを作成する方法です。利用できるシンプルで迅速な保管ソリューションが多数あるため、私はウォレットについてだけ話しているわけではありません。つまり、実際のバックエンド、つまりビットコインとライトニング ネットワークを実行するノードのことです。
これは、請求書の作成や API/gRPC 呼び出しを介した支払いの監視などの重要な作業を行うために、アプリがノード上で特定の権限を持っている必要があるためです。ノード オペレーターがノードへのアクセスを許可した場合にもこれを行うことができますが、自分でノードを実行することをお勧めします。
ライトニング ネットワーク開発に使用できるノードは 2 つのプロセスを実行する必要があります: (1) ビットコイン ブロックチェーンの最新ブロックに同期されているビットコイン クライアント、(2) チャネルをオープンしている (送受信できる) ライトニング ネットワーク クライアント支払い)。
一般的な家庭用ブロードバンドを利用している場合、ブロックチェーンの同期だけで少なくとも数日はかかります。 Neutrino (軽量のビットコイン ウォレット) を試すこともできますが、Lightning Network での開発に使用すると、いくつかの問題が発生する可能性があると聞きました。私自身試したことはありません。とにかく、この種のツールを初めて使用する場合は、悪影響を与える可能性のある変数を削除するのが最善だと思います。したがって、余裕がある場合は、ブロックチェーン全体を同期することをお勧めします。
ビットコインのレイヤーを分類すると、ライトニング ネットワーク レイヤーはビットコインの 2 番目のレイヤーです。上で述べたように、取引を行うにはライトニングネットワーク上にチャネルを開く必要があります。ライトニングネットワークでチャンネルを開くのはそれほど難しいことではありませんが、ビットコインを支払うだけでなく、ある程度の計画と調整が必要です。もちろん、ビットコインをステーキングしてチャネルを開き、取引を開始することもできます。ただし、このような経済的リスクを負う必要はありません。 2
画像の説明
-見て!同期するのが待ちきれません! (極性インターフェース) -
Polar の優れた点は、アプリをテストネットまたはメインネット バックエンドに移動する準備ができたときに、いくつかの構成を更新するだけで済むことです。アプリに数行のコードを追加またはコメントアウトすることで、ローカル、テストネット、メインネットのバックエンドを簡単に切り替えることができます。 (最終的には .env ファイルになります。もちろん、プロファイリング ツールはこの記事の目的ではありません。)
Polar は、lnd、c-lighting、および eclair ノードもサポートします。これは、他の実装を柔軟に実験できることを意味します。
もう一度言いますが、Polar を使用してください。これは素早く簡単に始める方法です。また、Lightning Network での開発がまったく好きではない場合はどうすればよいでしょうか?必ずしも使用しないシステムに時間とお金を浪費するよりも、早期にこれを発見する方が良いでしょう。そうは言っても、Stephan Livera のポッドキャストにハマってしまい、毎晩聴き続けると抜け出せない場合は、より本格的な開発環境をセットアップすることができます。
文章
「ネットワークの作成」をクリックすると、Polar でシミュレートされた Lightning ネットワーク環境を簡単に作成できます。ネットワークには好きな名前を付けることができ (個人的には「test」が賢明な選択だと思います)、2 つの lnd ノードと 1 つの Bitcoin Core ノードを追加できます。実際、始めたばかりの人にとって、これらは単なる最小構成であり、後でさらにノードを追加できます。ネットワークを作成したら、それを開始できます。初めてネットワークを起動する場合は、すべての Docker イメージをダウンロードする必要があるため、少し時間がかかる場合があります。ちなみに、Docker は自分のデバイスで実行する必要があります。前にも言いましたが、ここでも自分で解決する必要があります。
最後に、以下のような Polar インターフェイスが表示されます。
上の図に示すインターフェイスでは、Alice と Bob の Ind ノードが確認でき、両方のノードが Bitcoin Core バックエンド プロセスに接続されています。このときのブロックの高さは1であることに注意してください。これが私たちのジェネシスブロックです!ライブブロックチェーンとは異なり、Polar は開発およびテスト中にトランザクションが送信されたときにのみブロックを生成します。
次のステップは、アリスとボブの間にライトニング支払い用のチャネルを作成することです。アリスのノードをクリックすると、右側のコントロール パネルに、そのノードと対話できるさまざまな方法が表示されます。 「アクション」をクリックすると、シミュレートされたビットコインでアリスのウォレットに資金を供給し、アリスとボブの間のチャネルを開くために必要なすべてが表示されます。次に、アリスのウォレットに資金をリチャージして、アリスとボブの間のチャネルを開きましょう。
「入金」をクリックして、アリスのウォレットに 100 万 SATOSHI を入金します。
すべてが計画どおりに進んだ場合は、ブロックの高さとアリスのウォレット残高が変化することが確認できるはずです。そうでない場合は、助けを求めてください。これはあなたのせいではありません。 3
これで、アリスとボブの間にチャネルを開くことができます。アリスにお金があるので、彼女にボブとの「発信」チャネルを開かせることができます。いわゆる転送チャネルとは、アリスがこのチャネルを通じてボブに一定量のビットコインを転送できることを意味します。チャネルに残高がある限り、アリスとボブの間で複数の送金トランザクションを行うことができます。ただし、チャネルが最初に開かれたとき、利用可能な残高はアリスにあるため、ボブに送金できるのはアリスだけであることに注意してください。もちろん、アリスがボブに送金した後、ボブはアリスに送金できます。
チャネルでのこの資金管理方法は、双方が取引する能力を確保することを目的としており、これをライトニング ネットワークの流動性と呼んでいます。実際、ユーザーはチャンネル内の残高のみを使用できます。もう少し詳しく説明すると、送金者と受取人の間のチャネルに十分な残高がある (資金が正しい方向に流れている) 場合にのみ支払いが成功します。そうしないと支払いが失敗します。ライトニングネットワークの限られた流動性を管理する方法と回避策を見つける方法は、それ自体で検討する価値のあるトピックです。
正直に言うと、Polar でチャンネルを開くのにいくつか問題がありました。 UI とバックエンドの間の状態の不一致ではないかと思われますが、よくわかりません。場合によっては、ノード (またはネットワーク全体) をシャットダウンして再起動すると効果があります。完全に終了して Polar を再起動することもできます。さらに、このような状況にあるときは、10 分間外に出ると、心と精神をリラックスさせるのに最適な方法になります。
理由が何であれ、これらのノード操作を行う最良の方法は、Polar が提供する CLI を使用することであることがわかりました。 UI には必ずしも変更が表示されるわけではありませんが、データベースに直接クエリを実行して (いわゆる 4)、UI が変更を忠実に反映しているかどうかを判断できます。 Polar なら簡単にできます。今すぐしましょう。
まず、Alice の Ind ノードを選択し、「アクション」インターフェイスに入り、「ターミナル」の下の「起動」をクリックすると、次の図に示すようにコマンド プロンプトが表示されます。
これで、Ind ノードの lncli ツールを使用してチャネルを開き、請求書を作成し、支払いを行うことができるようになりました。まず、次のコマンドを実行して概要を確認します。
lncli --help
次のコマンドを実行して、アリスとボブの間の残高 100,000 SATOSHI のチャネルを開くことができます。
lncli openchannel --node_key
「funding_txid」を含む応答が表示されます。これは、アリスとボブがシミュレートされたビットコイン ブロックチェーンにブロードキャストした資金調達トランザクションに対応します。次のコマンドを実行して、新しく作成されたチャネルを確認します。
lncli listchannels
コマンドが空のリストを返した場合は、(「アクション」画面で) ビットコイン ノードでいくつかのブロックをマイニングしてみてください。そうすることで、トランザクションを確認し、チャネルを開くことができます。
これで、listchannels の応答を通じて、アリスとボブの間のチャネルが正常に開かれ、チャネル残高が約 100,000 SATOSHI (トランザクション手数料を差し引いた) であることがわかります。 100,000 SATOSHI 未満は、アリスがライトニング ネットワークを通じてボブに支払うことができる残高です。
支払いプロセス
Lightning Network でのこれまでで最も簡単な (そして最も一般的な) 支払いプロセスは請求書によるものです。請求書は基本的に、「金額」と「受取人」を含む一連の支払い指示です。支払い指示でより興味深い可能性を引き出すのに役立つパラメータやバリエーションは他にもあります (例: hodl 請求書や BOLT12 プロポーザル)。ただし、この記事では最も基本的なパターンのみに焦点を当てます。
Polar のセットアップに進み、最初に請求書を作成しましょう。今回は Bob のノードを使用します。そこで、Bob のターミナルを起動し、次のコマンドを実行します。
lncli addinvoice --amt 100
上記のコマンドは、100 SATOSHI 相当の請求書を作成します (実際、これらの手順を実行中に接続エラーが発生しました。同じ問題が発生する場合は、Bob のノードを停止して再起動してください)。返された応答を通じて、この請求書の情報を確認できます。
{ "r_hash": "7d91cafaba85b6086924142dfd890f350eb53b17b80e2993d0a2ce5ccc7252f1", "payment_request": "lnbcrt1u1ps3lu04pp50kgu4746skmqs6fyzsklmzg0x58t2wchhq8zny7s5t89enrj2tcsdqqcqzpgsp55rtlzlf5rt0z5zg34nc2rlcm9mw6nd77x45r85z6zp07qumphr7q9qyyssqzrvxdlsluaeu7esscvv8skcmaly4794j7pg9ytapmn50uukezf4xpqma9758s39wpn4pwk475dztezg4tff8xpylksl4mww57q8hj7cq7s7222", "add_index": "1", "payment_addr": "a0d7f17d341ade2a0911acf0a1ff1b2edda9b7de356833d05a105fe07361b8fc"}
ここでは、「payment_request」部分のみに焦点を当てます。データのこの部分には、アリスがボブに支払うために必要なすべて、つまり支払い金額と受取人の住所が含まれているためです5。
アリスのノード端末に戻ると、支払いリクエストを取得し、それを引数として次のコマンドに渡すことができます。
- lncli sendpayment --pay_req
結果は次のとおりです。
成功。
文章
この時点で、アプリケーションの構築を開始するための十分な基本的な知識とツールが必要になります。上の図は、Polar で請求書の作成と支払いに使用しているのと同じ API 呼び出しを使用した、簡単なサンプル アプリケーションの概要を示しています。基本的なアプリケーション アーキテクチャを構築するために必要なのはこれだけです。もちろん、これはほんの一例であり、開発プロセス中には他にも多くの問題に遭遇します (これはほんの始まりにすぎません)。しかし、何が必要で、それらをどのように解決するかは徐々にわかってきます。
追加の提案と参考資料:
開発者が定型コードを少なくして要点をすぐに理解できるようにするライブラリが多数あります。個人的には、これらのライブラリの使用方法を学ぶことで、生産性よりもイライラが大きくなりました。問題は主に私にあります。抽象化は優れていますが、それは抽象化されるものの基本を理解している場合に限られます。始めたときはこれに気づきませんでした。 Ind の API ドキュメントが最も学びやすいと思います。このガイドに従って Javascript で gRPC クライアントを作成したとき、私は正しい軌道に乗っていました。
より具体的なアプリケーション例を知りたい場合は、『Lightning Labs Builder's Guide』のチュートリアルを参照してください。チュートリアルで使用されるツール Express、mobx、および React に精通している場合は、このチュートリアルを強くお勧めします。これらのツールに慣れていない場合は、このチュートリアルからあまり得られないかもしれませんが、それでも何かを学ぶことはできます。このチュートリアルで私が気に入っている点の 1 つは、Lightning Network (および暗号証明) を使用して構築されたアプリケーションで実行できるいくつかの興味深いことを示していることです。
最後に、この記事に不明な点や不正確な点があると思われる場合は、お気軽にフィードバックや質問をお送りください。
読んでくれてありがとう。
来て。
脚注
ノードを実行したい場合は、Umbrel が初心者に最適です。 MyNode、RaspiBolt、RaspiBlitz も良いと聞きました。ソフトウェア システム (またはシムシティ) をいじるのが好きなら、ノードの実行は悪く言えば楽しい娯楽であり、よく言えばお金がかかり終わりのない最適化ゲームです (実際のお金が必要です)。
テストネットで実験を実行し、ビットコイン フォーセットを通じて実験ビットコインを獲得することもできます。これらのコインには価値はありませんが、守銭奴になるのは楽しいこともあります。自分でノードを構成および管理することに興味がない場合は、Voltage などのサービスを使用できます。 Voltage は、テストネット ノードとメインネット ノードをサポートする従量課金制のクラウド サービスです。
まあ、100%確信を持つことはできません。注意のため、lnd Slack の開発者チャネルをチェックしてください。私はここで、これらのツールを構築および保守している多くの開発者に会ってきました。私に会えるかもしれないよ!あなたが直面している問題を誰かが経験しているかもしれません。そうでない場合でも、素晴らしいです - 誰もがあなたの質問から学ぶことができます。
ブロックチェーンは公開データベースであり、誰もが root アクセス権を持っています。詳細については、https://balajis.com/yes-you-may-need-a-blockchain/ をご覧ください。
請求書の他のフィールドの詳細な説明については、この概要を参照してください。基礎となる契約について詳しくは、この記事をお読みください。