はじめに
BOLTはLightning Networkの数ある仕様の中で一番使われているものです。
ここで読むことができます。日本語盤はこちらです。
オススメの読み方を、株式会社Nayutaのuenoさんがブログで紹介されています。
さて、BOLTはかなり難解です。
なのでかなり苦労して読んでみた私なりの解釈を、各省ごとにまとめていきます。
間違っていたり、アドバイスなどがあれば是非是非コメントを。
備考: Lightning Networkをあまり理解しないままBOLTを読んでもほとんど理解できません。私のオススメは、一度Lightningを触って見ることです。lndのTutrialがかなりオススメです。そちらについても記事を書いているのでぜひ読んでみてください。(Dockerがオススメ)
- Lightning Network Daemon(Lnd)で遊んでみた ~Tutrial編~
- Lightning Network Daemon(Lnd)で遊んでみた ~Docker編~
0章 イントロダクションと用語説明
用語集
大半はMastering Bitcoinに出てくるようなワードなのでここでの解説は省略。
知らないワードは軽くググってみることをオススメします。
HTLCとかは理解しておいたほうがいいかも。
テーマソング
謎にLightning networkのテーマソングが載っています。
覚えましょう。テストに出ます。
0章まとめ
イントロダクションなので特に書くことはない。
さて、ここからが勝負。
1章 基本プロトコル
この章ではライトニングの上でやりとりされる各種メッセージのフォーマットを解説しています。
全てのライトニングメッセージには、共通したフォーマットがあり以下のようになっています。
-
type
: payloadフィールドを解釈するための2バイトのフィールド。 -
payload
: メッセージからtypeを除いたフォーマット
typeの値によってメッセージはグループに分けられます。
0 ~ 31
: セットアップ & コントロール
コネクションのセットアップ、コントロール、サポート、そしてエラーれポーティングに関するメッセージが入る。(この章で解説されます。)
32 ~ 127
: チャネル
マイクロペイメントチャネルのオープンとクローズに使われるメッセージ。(BOLT2章で解説)
128 ~ 255
:コミットメント
コミットメントトランザクションの更新(手数料の更新、署名の交換、追加、取り消し、HTLCの確定&ブロードキャスト)に関するメッセージ。(BOLT2章で解説)
256 ~ 511
:ルーティング
ルート探索、ノードやチャネル関係の通知に関するメッセージ。(BOLT7章で解説)
it's OK to be odd ルール
typeに受け入れられる値(○)と、受け入れられない値(×)
○ 規定されている偶数番号、規定されている奇数番号、拡張により規定された奇数番号
× 規定されていない偶数番号、規定されていない奇数番号
拡張性を上げているから大事らしい。
備考:メッセージのサイズはトランスポート層の制限である65535バイト以下になる。
セットアップメッセージ
initメッセージ
メッセージを送るときに最初に送られるメッセージ。
- type: 16 (init) ← 規定されている偶数番号
- data: - 2:gflen - gflen:globalfeatures - 2:lflen - lflen:localfeatures
errorメッセージ
間違いを指摘するためのメッセージ。
- type: 17 (error) ← 規定されている奇数番号
- data: - 32:channel_id … チャンネルを指定。0の時は全てのチャンネル。 - 2:len - len:data
要件
errorメッセージを送るノード、受け取るノードは指定されたチャンネルを停止させないといけない。channel-id
が0であれば全チャンネルを停止させないといけない。
セットアップメッセージ
pingメッセージ
コネクションの確認。
- type: 18 (ping) ← 規定されている偶数番号
- data: - 2:num_pong_bytes - 2:byteslen - byteslen:ignored … 通常0が入る。
pongメッセージ
pingメッセージを受け取った時、返答として送る。
- type: 19 (pong ← 規定されている偶数番号
- data: - 2:byteslen - byteslen:ignored … 通常0が入る。
1章まとめ
ライトニングのデータの構成を解説しているだけなのでこれを読んでいるだけではイメージ浮かばないし面白くない。
実際にプロトコルデータをじっくり観察する遊びをしないとな。むしろそれを先にした方が分かりやすいいと思う。
WireSharkでLightningのパケットキャプチャリングができるプラグインがあるみたい。
lightning-dissector
今度これを使う記事を書こうと思う。
まとまってはないな、うん。