本文へスキップ
buybitcoinsmart

用語集 / ライトニングとレイヤー2

ペイメントシークレット

ペイメントシークレットとは?
ペイメントシークレットとは、受取人が請求書ごとに生成し、最終的なオニオンペイロードに含めて返送することを求める32バイトの値であり、ペイメントハッシュを知っているだけでは支払者にはなれません。

ライトニングのペイメントシークレットは、受取ノードが資金を受け入れる前に支払者がそのまま返送する、請求書ごとのパスワードのように機能します。BOLT 11はこれにタグ文字sを割り当て、その長さを52文字のbech32に固定し、これを持たない請求書が届いた場合は必ず失敗させるよう読み手に指示しています。あなたにとっては、あなたのペイメントハッシュを見た転送ノードが、その支払いがあなたのウォレットで終わったことを判別できない理由がここにあります。

仕組み

ペイメントシークレットは受取側のウォレットが生成するもので、支払者が生成することは決してなく、支払いが最後のホップに到達するまでオニオンの中に封じられたままです。

BOLT 11はこれをタグ付きフィールド型16として定義しており、文字sと固定のdata_length52で記述されます。この52文字のbech32は260ビット、すなわち32バイトの値とパディングを運び、請求書の作成者はこれをちょうど1つ含めなければなりません。読み手は、固定長フィールドの長さが誤っている場合、および有効なsフィールドが存在しない場合に、支払いを失敗させなければなりません。

支払者はこの値を、最後のノード向けのオニオンペイロードにコピーします。BOLT 4はこれをTLVレコード型8、payment_dataと呼び、32バイトのシークレットとtotal_msatの数値を保持します。この層を剥がせるのは宛先だけであり、中間のホップはこれを見ることはありません。すべてのホップがHTLCをロックするペイメントハッシュとはこの点が異なります。

末端での検査は意図的に情報を与えないものになっています。そのペイメントハッシュに対して期待されるものと一致しないシークレット、または必須であるのに欠けているシークレットは、incorrect_or_unknown_payment_details、エラーPERM|15でHTLCを失敗させます。これは未知のペイメントハッシュが受け取るのと同じ応答です。BOLT 4はこの統合の理由を説明しています。以前の2つのコード、PERM|16 incorrect_payment_amountと17 final_expiry_too_soonは、転送ノードが同じハッシュでより低い金額の支払いを再送し、その応答を読むことで宛先を特定できてしまいました。

対応はもはや交渉の対象ではありません。BOLT 9はフィーチャービット14と15、payment_secretをASSUMED(前提)として挙げており、ビット16と17、basic_mppはこれに依存しています。

どこで見られるか

ペイメントシークレットは、現代のlnbc文字列の中では、sp5で始まり52文字のbech32が続く部分として見分けられます。

BOLT 11のテストベクターでは、その部分はzyg3を12回繰り返した後にzygsが続く形で、32バイトがすべて0x11であるシークレットを符号化しています。ペイメントシークレットを自分で入力することはありません。この値を扱うのは請求書の作成者と支払側のウォレットだけです。

このフィールドが真価を発揮するのはマルチパート支払いです。単一の経路に十分な流動性がなく、請求書がbasic_mppに対応している場合、BOLT 4によりウォレットは1つのペイメントハッシュを共有する複数のHTLCに金額を分割できます。すべての部分がシークレットを運ばなければならず、total_msatで一致しているべきです。受取人は合計が届くまで何も決済せず、最初のHTLCの後、少なくとも60秒待ってからmpp_timeoutでその組を失敗させるべきです。したがって、Strikeのようなライトニング中心のアプリからの比較的大きなライトニング出金が1分間保留された後に戻ってくる場合、それは資金を失ったのではなく、不完全なHTLCの組が期限切れになった可能性があります。Phoenixのように端末上で実際のライトニングノードを動かしてウォレット自身がこれらの部分を組み立てる場合でも、あなたが管理していないサーバー上でカストディアンが行う場合でも、シークレットはそれらを1つの支払いとして印付けします。

ペイメントシークレットvsペイメントハッシュ

ペイメントハッシュとペイメントシークレットは、どちらも1つのBOLT 11請求書における256ビットのフィールドであり、違いは誰がそれを見られるかにあります。すべてのホップはハッシュを知ります。各ホップが転送するHTLCをそのハッシュにロックするためです。一方、シークレットを知るのは最終ノードだけであり、これはオニオンの最も内側の層を運ばれます。ハッシュは支払いが決済されたかどうかに答え、それを開くプリイメージが領収書となります。シークレットは支払者があなたの書いた請求書に基づいて行動しているかどうかに答えますが、ハッシュにはそれができません。経路上の全員に見えるためです。符号化では両者は双子のように見えます。タグpとタグs、どちらも52文字で、どちらもそれ以外の長さでは拒否されます。

混同しやすい用語

よくある質問

ペイメントシークレットを自分で入力する必要はありますか?

いいえ、ウォレットが最初から最後まで処理します。受取側のウォレットが32バイトの値を生成して請求書に書き込み、支払側のウォレットがそれを最後のホップ向けのオニオンペイロードにコピーしますが、あなたに表示されることはありません。lnbc文字列を貼り付ける場合、シークレットはすでにその中に含まれています。

ペイメントシークレットはプリイメージと同じものですか?

いいえ。プリイメージは受取人の秘密であり、ペイメントハッシュを解錠してあなたの支払いの証明となるものです。一方、ペイメントシークレットは逆方向に、請求書から受取人へと渡り、支払者がその請求書に基づいて行動していることを示します。どちらも32バイトであり、混乱はたいていそこから始まります。

ライトニングの支払いがincorrect_or_unknown_payment_detailsで失敗したのはなぜですか?

最終ノードが何らかの問題を検出したものの、その内容を明かさないためです。BOLT 4では、この単一のエラーPERM|15が、不明なペイメントハッシュ、欠落または不一致のペイメントシークレット、請求書が要求した額を下回る金額、チェーン先端に近すぎるCLTV有効期限をまとめて表します。曖昧さは意図的なものです。具体的なエラーがあれば、誰かがあなたのノードに対して推測を試せるようになってしまうからです。

次に読む

関連用語

ライトニングとレイヤー2のその他の用語

このページを英語で読む