Lightning Network はノード間に作成するチャネルのネットワークを用いたプロトコルである。チャネルには3つのフェーズ(確立・通常操作・クローズ)がある。
channel_id
チャネルを特定するために channel_id
が使用される。channel_id
は funding_txid
と funding_output_index
を結合することで資産トランザクションから作られる。チャネルを確立する前は、temporary_channel_id
(ランダムなナンス)が使われる。funding_created
メッセージが交換される前にチャネルに対してプロトコルが提供する識別子は(source_id
, destination_id
, temporary_channel_id
)のタプルである。
チャネルの確立
接続の認証と初期化の後、チャネル確立が開始する。チャネルの確立はファンディングノード(funder)が open_channel
メッセージを送信し、応答ノード(fundee)が channel_accept
を送信することで構成される。チャネルパラメタがロックされることでファンディングノードは資産トランザクションと両バージョンのコミットメントトランザクションを作成できるようになる。そして、応答ノードバージョンのコミットメントトランザクションに署名を加えて、funding_created
メッセージで資産出力のアウトポイントを送信する。一度、応答ノードが資産のアウトポイントを得ると、ファンディングノードバージョンのコミットメントトランザクション署名を作成することができ、funding_signed
メッセージでそれを送ることができる。
ファンディングノードが一度 funding_sgned
メッセージを受け取ると、資産トランザクションを Bitcoin ネットワークにブロードキャストしなければならない。両者は funding_signed
メッセージを送信した(受信した)後、資産トランザクションがブロックチェーンに入り、特定の深さまで到達するまで待つ。両者が funding_locked
メッセージを送った後にチャネルは確立され、通常操作が始まる。funding_locked
メッセージはチャネル認証証明を構築するために使われる情報を含んでいる。チャネルの確立に至るメッセージフローを以下の図に示す。
open_channel
メッセージ
ノードについての情報や新しいチャネルを設定する要望を含んでいる。このメッセージで設定するパラメタの一部を以下にまとめる。
chain_hash
: ブロックチェーンのジェネシスハッシュfunding_satoshis
: 出資者がチャネルに入金している量feerate_per_kw
: 1000-weight ごとの初期手数料を示すfunding_pubkey
: 資産トランザクション出力の 2-of-2 マルチシグスクリプトでの公開鍵dust_limit_satoshis
: このノードのコミットメントまたはHTLCトランザクションのために出力を生成してはならない閾値channel_reserve_satoshis
: 他のノードが直接支払いとして保持する最低額
accept_channel
メッセージ
ノードについての情報を含み、新しいチャネルの受理を示す。このメッセージで設定するパラメタの一部を以下にまとめる。
minimum_depth
: 資産トランザクションの二重使用を防ぐための十分なブロック数channel_reserve_satoshis
: ゴミと見なされない大きさを設定する
funding_created
メッセージ
出資者が作った最初のコミットメントトランザクション概要を説明するもの。このメッセージで設定するパラメタの一部を以下にまとめる。
temporary_channel_id
:open_channel
メッセージと同じ値funding_txid
: トランザクションの IDfunding_output_index
: 資産トランザクション出力のインデックスsignature
:funding_pubkey
を使用した署名
funding_signed
メッセージ
出資者に最初のコミットメントトランザクションに必要な署名を与えるメッセージ。受信者は signature
が正当でない場合はチャネル確立を失敗させなければならない。また、正しい funding_signed
メッセージを受け取る前に資産トランザクションをブロードキャストしてはいけない。
funding_locked
メッセージ
資産トランザクションが accept_channel
で要求された minimum_depth
に達成したことを示すメッセージ。両ノードがこれを送信すると、チャネルは通常操作モードに移行する。送信者は後続のコミットメントトランザクションのために next_per_commitment_point
を設定する必要がある(BOLT #3 参照)。
通常操作
変更はバッチで送信される。下の図のように、1つ以上の update_
メッセージが commitment_signed
メッセージの前に送信される。これらの更新は他のノードのコミットメントトランザクションに適応される。遠隔ノードが revoke_and_ack
を通してそれらを適応することを認めるとき、自身のコミットメントトランザクションに更新を追加するだけである。
update_add_htlc
メッセージ
ノードが HTLC を提供する理由は主に2つある。1つ目は自身の支払いを開始するためである。2つ目は他ノードの支払いをフォワードするためである。あるノードが他のノードに HTLC を提供するために、支払いのプリイメージを引き換えに交換可能な update_add_htlc
メッセージを送ることができる。
commitment_signed
メッセージ
あるノードがリモートコミットメントに対する変更を持っている場合、結果として生じるトランザクションに署名することができ、commitment_signed
メッセージを送ることができる。受信者は署名を確認して正当と判断すると、revoke_and_ack
メッセージ内で前のコミットメントトランザクションのためのコミットメントプリイメージで応答する。
チャネルのクローズ
ノードは接続の相互にチャネルのクローズを交渉することができ、彼らは自分らの資産を即座にアクセスでき、低い手数料で交渉することができる。チャネルのクローズには2ステップある。まず、一方がチャネルをクローズしたいこと(新しい HTLC を受理しないこと)を示す。そして、一旦全ての HTLC が解決されたら最終チャネル交渉が開始する。
shutdown
メッセージ
チャネルのクローズを開始するために shutdown
メッセージを送る(支払いたい scriptpubkey
を添えて)。scriptpubkey
フォームは Bitcoin ネットワークで有効な標準フォームである。このメッセージを送ることで、これ以降のコミットメントトランザクションへの追加の更新を禁止する。
closing_signed
メッセージ
シャットダウンが完了し HTLC が空になるとクローズ手数料交渉が始まる。出資者は公平と思う手数料を選択し、メッセージを署名して送る。このメッセージは、同じ手数料に双方が合意するかどちらかがチャネルを失敗するまで続ける。