Lightning Networkの基本 (7) — invoice

Lightning Networkの基本的な技術内容を数回にわたって紹介します。

今回は請求書(invoice)についてです。

invoiceのプロトコルは BOLT #11 に記載されています。

Lightning Network としては転送先のノードID と転送額が分かれば転送を開始することができます。しかし人間の間で扱うには不便なため BOLT で定義されています。

invoice は bech32 でエンコードされていて文字列で表現されます。人間が読むことができる Human-Readable Part とそれ以外の Data Part で構成されます。
最近の Bitcoinアドレスも bech32 でエンコードされたものがありますが Lightning Network の invoice は 90文字の制約から外れています。

bech32 ではエンコードした文字として 1 を使いません。そのためHuman-Readable Part と Data Part の境として 1 が使われます。

https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki#bech32

Human-Readable Part

ここにはネットワークの種別(Bitcoin mainnet/testnet など)と転送額が書かれています。転送額では 1 を使うことができるので、境目の 1は文字列の後ろから探すとよいでしょう。

転送額を指定しないこともできます。その場合、受け取るまで額はわかりません。それを嫌って額の指定を必須とするウォレットもあります。

また、指定した転送額の2倍まで受け取ることができる仕様になっています(BOLT #4 に書かれています)。

Data Part

Data Part は 3 つに分けられます。

  • タイムスタンプ(1970年からの秒数)
  • タグ付けされたデータ(0個以上)
  • 署名

タイムスタンプは invoice の作成時刻で、タグ付けされたデータの中に期限情報がなければ有効期限は 1時間です。

署名は invoice の作成ノードが行います。通常はノードID の秘密鍵で行い、転送先はこの署名データから復元した公開鍵=ノードID になります。

タグ付けされたデータにはその他の情報が入っています。詳細はこちらです。よく使われるのは invoice に付与できる文字情報( d field)でしょう。また非公開のノードの場合はチャネルの情報も非公開になるため、転送してもらう最後の 1チャネルについてルート情報を載せます( r field)。

--

--