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
が使われます。
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)。
おわりに
今回は invoice についての記事でした。