用語集 / ライトニングとレイヤー2
インボイス有効期限
- インボイス有効期限とは?
- インボイス有効期限とは、BOLT11の支払いリクエストにおけるxフィールドのことで、インボイス自体のタイムスタンプから数えた秒数であり、これを過ぎると支払者と受取人の双方がそのインボイスを拒否すべきです。
すべてのライトニングインボイスには期限があり、カウントダウンはインボイスが署名された時点から始まり、それが自分のもとに届いた時点から始まるわけではありません。xフィールドがない場合の既定値は3600秒、つまり1時間です。したがって、その1時間の大半をチャットのスレッドの中で過ごしたインボイスは、届いてから数分で、目に見える理由もなく失敗することがあります。
仕組み
インボイス有効期限は、タグ付きフィールドの種類6として伝達され、文字xで表記され、ビッグエンディアンの秒数を持ちます。
BOLT11の文字列は、35ビットのタイムスタンプで始まります。これは1970年1月1日UTCからの秒数を数えたもので、その後にタグ付きフィールドが続き、最後に署名が付きます。有効期限はそうしたフィールドの1つであり、相対的な値です。期限はそのタイムスタンプに有効期限を加えたものであるため、インボイスの中に読み取れる時計時刻が示されることはありません。BOLT11は、支払者に対してその合計時間を過ぎたら支払いを試みないよう指示し、受取人に対してもそれを受け取らないよう指示します。
どちらの指示もMUSTではなくSHOULDであるため、期限切れのインボイスが暗号学的に無効になるわけではありません。支払いハッシュはなお機能します。支払いを止めるのは両端のポリシーであり、ロックではありません。ウォレットは試みることを拒否し、プリイメージを破棄したノードはそもそも決済できません。
値は5ビットずつのグループに詰められ、先頭のゼロのグループを付けずに、収まる最短の長さを使わなければなりません。仕様の例自体がその範囲を示しています。60秒は2つのグループを占め、puと表記され、604800秒は4つを占め、jw5qと表記されます。フィールドを埋め足すエンコーダーは単に雑なだけではありません。x、c、または9のフィールドが最小でないインボイスは無効として扱うよう、読み手に指示されています。
一度発行されたインボイスは、誰も延長できません。署名は人間が読めるプレフィックスとデータ部分の全体を対象とするため、有効期限の1文字を編集すれば署名が破綻します。より長い時間を与えたい加盟店は、新しいリクエストを発行して再度署名しなければなりません。
1時間という既定値は無作為に選ばれたものではありません。仕様の根拠には、fフィールドが持つことのできるフォールバックアドレスを通じて、代わりにオンチェーンで支払う時間を残すためだと記されています。
どこで見かけるか
インボイス有効期限は、QRコードの周りのカウントダウンリングとして、あらゆるデコーダーでexpiryと表示される行として、そして古いものを貼り付けたときにウォレットが示す拒否として現れます。
仕様のテストベクターはその範囲の両端を示しています。1杯のコーヒーと記された2500マイクロビットコインのインボイスは、有効期限を60秒に設定します。これはカウンターで3ドルの価格を固定するものだからです。Blockstream Storeからの、Ledger Nano Sを含む88.85USDの商品のインボイスは、有効期限を604800秒、つまり7日に設定します。注文確認はカウンター越しの取引ではなく請求書だからです。
インボイスがどこで発行されるかが、誰がその数値を選んだかを決めます。当サイトがレビューしているPhoenixは、サーバー上のアカウントではなく端末上で実際のライトニングノードを動かすため、受取リクエストにおける有効期限はそのノード自身の設定です。カストディ型アプリでは、その数値は運営事業者が決めるため、そのインボイスをデコードすることが通常、それを知る唯一の方法です。
インボイス有効期限vs CLTV有効期限デルタ
インボイス有効期限とCLTV有効期限デルタは、どちらもライトニング支払いにおける時計であり、問題の異なる半分に対して異なる単位で動きます。
インボイス有効期限はインボイスのタイムスタンプから数えた実時間の秒数であり、支払いをそもそも試みてよいかどうかを決めます。CLTV有効期限デルタはブロック単位で測られ、同じインボイスのcフィールドは最終ホップに対する受取人の最小値を示し、支払者はそのフィールドがない場合、少なくとも18ブロックとして扱わなければなりません。一方は始めるべきかどうかを示し、もう一方は始めた後に自分の資金がHTLCの中でどれだけの間ロックされ得るかを示します。