用語集 / ライトニングとレイヤー2
BOLT11インボイス
別名はライトニングインボイス、BOLT 11です。
- BOLT11インボイスとは?
- BOLT11インボイスとは、ライトニングウォレットが支払いを要求するために生成する、lnbcで始まる長い文字列のことで、金額、支払いハッシュ、有効期限、署名が符号化されています。
ライトニングの支払いはすべて、このインボイスから始まります。インボイスは256ビットの支払いハッシュにコミットし、これを解除できるのは受取人だけです。また、発行者が別段の定めをしない限り1時間で失効するため、古いQRコードのスクリーンショットは役に立ちません。支払いは、資金が指定されたノードに届くか、あるいは手元に戻ってくるという意味で安全です。
仕組み
BOLT11インボイスは、ネットワークを表すプレフィックスと、タグ付きフィールドで構成される本体からなるbech32文字列です。
プレフィックスは人間が読める部分(human readable part)と呼ばれ、mainnetではlnbc、testnetではlntb、signetではlntbs、regtestではlnbcrtです。その直後に金額が続き、数値と乗数の文字で書かれます。mはビットコインの1000分の1、uは100万分の1、nは10億分の1、pは1兆分の1を表します。したがってlnbc2500uは0.0025ビットコインを要求します。金額を完全に省くと、支払者が金額を記入するオープンインボイスになります。
本体はタグ付きフィールドの連なりで、各フィールドは1文字のタグ、長さ、値からなります。必須のものは2つあります。支払いハッシュ(タグp)は256ビットを52文字のbech32で表したもの、支払いシークレット(タグs)はもう1つの52文字で、支払者は最終のオニオンペイロードでこれをそのまま返さなければなりません。BOLT11は、作成者に対してそれぞれをちょうど1つずつ含めるよう定め、読み手に対しては、有効なsフィールドが存在しない場合には支払いを即座に失敗させるよう定めています。続いて任意のフィールドがあります。説明、または長い説明の場合は説明のハッシュ、失効時間(既定は3600秒)、最終CLTV失効デルタの最小値(既定は18ブロックで、受取人が最終ホップに求める安全余裕です)、受取人のノードID、フォールバックのオンチェーンアドレス、そしてチャネルが未告知のノードへ支払者が到達する方法を示すルーティングヒントです。
全体には署名が付きます。署名は520ビットで、64バイトの値と1バイトのリカバリバイトからなり、これによってウォレットはノードIDフィールドが存在しない場合でもインボイスから支払先を導き出せます。末尾には6文字のbech32チェックサムが付くため、打ち間違えた文字は、資金を何もない場所へ送るのではなく、検出されます。
支払いハッシュは、インボイスを単なるテキストファイル以上のものにする仕組みです。受取人はランダムなプリイメージを生成し、それをハッシュ化してインボイスに入れます。経路上の各ホップは、転送する金額をこの同じハッシュにロックし、プリイメージを明かすことによってのみ資金が解放されます。したがって、決済済みの支払いは、支払者に、インボイスと一致するハッシュを持つプリイメージを残します。これは、どの加盟店ももっともらしく否認できない暗号学的な領収書です。
ビットコインを購入するうえでこれが重要な理由
取引所から出金するとき、避けられるはずのいくつかの誤りが起きるのはインボイスの段階です。
1つ目は失効です。取引所の出金フローは処理に数分かかることがあり、遅いフローの開始時に生成されたインボイスは、支払われるころには失効している可能性があります。ライトニングの出金が明らかな理由もなく失敗した場合は、取引所が壊れたと決めつける前に、ウォレットでインボイスを再生成してください。既定は1時間ですが、迅速な支払いを想定するウォレットは10分や15分に設定することがよくあります。
2つ目は金額です。金額が含まれるインボイスはその金額でのみ支払うことができ、これはまさに望ましいことです。余分なゼロを打ち込む可能性がなくなるからです。金額のないインボイスは、オープンインボイスやゼロ金額インボイスと呼ばれることがあり、寄付には便利ですが、出金フローでは危険です。数値があらかじめ組み込まれたほうを選んでください。
3つ目は再利用です。BOLT11インボイスは設計上、1回限りの使用です。寄付ページに1つ公開すると、2人目の寄付者の支払いは失敗するか、受信側の作りが悪ければ1人目の寄付者のハッシュに再び支払うことになります。これはまさにBOLT12のオファーが解決するために設計された問題であり、そのためこの仕様は2024年9月にライトニング標準へ統合されました。2017年以来の新しいBOLTです。ウォレットと相手方の双方がオファーに対応するまでは、ライトニングアドレスが再利用可能な宛先を公開する実用的な方法です。
最後に、ライトニングに対応していることを前提に計画を立てる前に、取引所が実際に対応しているか確認してください。当サイトでレビューしているStrikeは、ライトニングとオンチェーンの両方で出金に対応しています。当サイトの取引所比較に掲載されているプラットフォームの多くは対応しておらず、そうしたプラットフォームでは、少額を動かす最も安い方法は、頻繁に動かさないことです。
インボイスをフィールドごとに読み解く
短いインボイスを分解すると、雑音のように見えなくなります。
lnbc1500nで始まる文字列は、デコードする前に2つのことを伝えます。mainnetのインボイスであり、1500ナノビットコイン、すなわち0.0000015ビットコイン、つまり150サトシを要求しているということです。その後にタイムスタンプが続き、そしてタグ付きフィールドが続きます。dフィールドには「table 4」のような短い説明が入ります。600のxフィールドは、既定の1時間ではなく失効時間を10分に設定します。cフィールドは、受取人がより大きな安全余裕を望む場合に、18ブロックの最終CLTVデルタを上書きします。
受取人のノードに公開チャネルがない場合、rフィールドがルーティングヒントを運びます。接続のよいピアのノードID、使用する短縮チャネルID、そしてそのピアの手数料とデルタです。これがなければ、ウォレットは公開グラフを見て経路がないと判断し、諦めてしまいます。モバイルウォレットのインボイスが、大規模な公開ノードのインボイスよりしばしば目に見えて長くなるのはこのためです。
BOLT11インボイスvs Bitcoin URI
BOLT11インボイスはライトニングの支払い要求であり、Bitcoin URIはオンチェーンの支払い要求です。URI形式は、bitcoin:の後にアドレスと任意のパラメータが続くもので、ブロックチェーンを指し、どのウォレットでも、何度でも、どの金額でも支払うことができます。インボイスはノードを指し、失効し、1回だけ支払われることを意図しています。ウォレットは両方を載せた統合QRコードを表示するようになってきており、支払者が選べますが、この2つのペイロードは別々の標準であり、失敗の仕方も別々です。
BOLT11インボイスvsライトニングアドレス
BOLT11インボイスは支払い要求そのものであり、ライトニングアドレスはそれを取得しに行く方法です。you@example.comのようなアドレスをウォレットに入力すると、そのドメインへのHTTPSリクエストが発生し、選んだ金額に対するBOLT11インボイスを新たに生成して返します。アドレスが再利用可能で人間が読めるのは、それが支払い要求ではまったくなく、要求に応じてインボイスを発行するサーバーへのポインタだからです。