BOLT #2 : Peer Protocol for Channel Management

BOLT #2 : Peer Protocol for Channel Management お知らせ
Table of Contents

Lightning Network はノード間に作成するチャネルのネットワークを用いたプロトコルである。チャネルには3つのフェーズ(確立・通常操作・クローズ)がある。

channel_id

チャネルを特定するために channel_id が使用される。channel_idfunding_txidfunding_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 : トランザクションの ID
  • funding_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 が空になるとクローズ手数料交渉が始まる。出資者は公平と思う手数料を選択し、メッセージを署名して送る。このメッセージは、同じ手数料に双方が合意するかどちらかがチャネルを失敗するまで続ける。

タイトルとURLをコピーしました