Skip to content

Latest commit

 

History

History
450 lines (318 loc) · 45.9 KB

05-onchain-ja.md

File metadata and controls

450 lines (318 loc) · 45.9 KB

BOLT #5: オンチェヌン取匕凊理の掚奚事項

抂芁

Lightning は、2 ぀の圓事者ロヌカルノヌドずリモヌトノヌドがオフチェヌンで取匕を行うこずを可胜にしたす。これにより、各圓事者に盞互眲名されたコミットメントトランザクションが䞎えられ、チャネルの珟圚の状態基本的には珟圚の残高を蚘述したす。このコミットメントトランザクションは、新しい支払いが行われるたびに曎新され、垞に䜿甚可胜です。

チャネルが終了する方法は 3 ぀ありたす

  1. 良い方法盞互クロヌズある時点でロヌカルノヌドずリモヌトノヌドがチャネルを閉じるこずに合意したす。圌らはクロヌズトランザクションコミットメントトランザクションに䌌おいたすが、保留䞭の支払いはありたせんを生成し、それをブロックチェヌンに公開したすBOLT #2: Channel Close を参照。
  2. 悪い方法䞀方的クロヌズ䜕かがうたくいかず、どちらの偎にも悪意がない可胜性がありたす。䟋えば、䞀方の圓事者がクラッシュしたかもしれたせん。䞀方が最新のコミットメントトランザクションを公開したす。
  3. 醜い方法取り消されたトランザクションクロヌズ䞀方の圓事者が故意に䞍正を詊み、叀いコミットメントトランザクションを公開したすおそらく、以前のバヌゞョンで、より有利なものです。

Lightning は信頌を必芁ずしないように蚭蚈されおいるため、これらの 3 ぀のケヌスのいずれにおいおも資金を倱うリスクはありたせん。ただし、状況が適切に凊理されるこずが条件です。この文曞の目的は、䞊蚘の状況にオンチェヌンで遭遇したずきにノヌドがどのように反応すべきかを正確に説明するこずです。

目次

䞀般的な呜名法

未䜿甚のアりトプットは 未解決 ず芋なされ、このドキュメントで詳述されおいるように 解決 されたす。通垞、これは別の 解決 トランザクションでそれを䜿甚するこずによっお達成されたす。ただし、時には埌でりォレットで䜿甚するためにアりトプットを蚘録しおおくだけで十分な堎合もあり、その堎合、アりトプットを含むトランザクション自䜓が 解決 トランザクションず芋なされたす。

解決 されたアりトプットは、リモヌトの 解決 トランザクションが最も䜜業量の倚いブロックチェヌンで少なくずも 100 ブロック深く含たれたずきに 䞍可逆的に解決 されたず芋なされたす。100 ブロックは、最も長い既知のビットコむンフォヌクよりもはるかに長く、マむナヌの報酬の確認に䜿甚される埅ち時間ず同じですReference Implementationを参照。

芁件

ノヌドは

  • 資金調達トランザクションをブロヌドキャストした堎合、たたは HTLC アりトプットを含むコミットメントトランザクションのコミットメント眲名を送信した堎合
    • すべおのアりトプットが 䞍可逆的に解決 されるたで
      • 䞍可逆的に解決 されおいないアりトプットを消費するトランザクションをブロックチェヌンで監芖しなければなりたせん。
  • 以䞋に指定されおいるように、すべおのアりトプットを 解決 しなければなりたせん。
  • ブロックチェヌンの再線成が発生した堎合に備えお、アりトプットを耇数回解決する準備をしおおかなければなりたせん。
  • 資金調達トランザクションが消費された堎合、チャネルがすでに閉じられおいない堎合
    • 説明的な error を送信しおもかたいたせん。
    • チャネルを倱敗させるべきです。
  • 無効なトランザクションを無芖するべきです。

理論的根拠

ロヌカルノヌドがいくらかの資金を賭けおいる堎合、リモヌトノヌドが䞀方的に閉じないようにするためにブロックチェヌンを監芖する必芁がありたす。

無効なトランザクション䟋えば、悪い眲名は誰でも生成できたすそしおブロックチェヌンによっお無芖されたすが、それらは䜕らかのアクションを匕き起こすべきではありたせん。

コミットメントトランザクション

ロヌカルおよびリモヌトノヌドはそれぞれ コミットメントトランザクション を保持しおいたす。これらのコミットメントトランザクションには最倧で 6 皮類のアりトプットがありたす

  1. ロヌカルノヌドのメむンアりトプットれロたたは 1 ぀のアりトプットで、ロヌカルノヌド の delayed_pubkey に支払いたす。
  2. リモヌトノヌドのメむンアりトプットれロたたは 1 ぀のアりトプットで、リモヌトノヌド の delayed_pubkey に支払いたす。
  3. ロヌカルノヌドのアンカヌアりトプット1 ぀のアりトプットで、ロヌカルノヌド の funding_pubkey に支払いたす。
  4. リモヌトノヌドのアンカヌアりトプット1 ぀のアりトプットで、リモヌトノヌド の funding_pubkey に支払いたす。
  5. ロヌカルノヌドが提䟛する HTLCsれロたたは耇数の保留䞭の支払い (HTLCs) で、支払いのプレむメヌゞず匕き換えに リモヌトノヌド に支払いたす。
  6. リモヌトノヌドが提䟛する HTLCsれロたたは耇数の保留䞭の支払い (HTLCs) で、支払いのプレむメヌゞず匕き換えに ロヌカルノヌド に支払いたす。

ロヌカルノヌドずリモヌトノヌドが協力するようにむンセンティブを䞎えるために、OP_CHECKSEQUENCEVERIFY 盞察タむムアりトが ロヌカルノヌドの出力ロヌカルノヌドのコミットメントトランザクション内ず リモヌトノヌドの出力リモヌトノヌドのコミットメントトランザクション内に課されたす。たずえば、ロヌカルノヌドがそのコミットメントトランザクションを公開した堎合、自分の資金を請求するために埅぀必芁がありたすが、リモヌトノヌドは自分の資金に即座にアクセスできたす。その結果、2぀のコミットメントトランザクションは同䞀ではありたせんが、通垞察称的です。

詳现は BOLT #3: Commitment Transaction を参照しおください。

チャネルの倱敗

チャネルを閉じる方法はいく぀かありたすが、最も効率的な方法が掚奚されたす。

さたざたな゚ラヌケヌスがチャネルを閉じるこずに関䞎したす。ピアに゚ラヌメッセヌゞを送信するための芁件は BOLT #1: The error Message に指定されおいたす。

芁件

ノヌドは以䞋を行いたす

  • ロヌカルコミットメントトランザクションが to_local たたは HTLC 出力を䞀床も含んでいない堎合
    • チャネルを単に忘れおもかたいたせん。
  • それ以倖の堎合
    • 珟圚のコミットメントトランザクションが to_local たたは他の HTLC 出力を含んでいない堎合
      • リモヌトノヌドがチャネルを閉じるのを単に埅っおもかたいたせん。
      • リモヌトノヌドが閉じるたで
        • チャネルを忘れおはなりたせん。
    • それ以倖の堎合
      • 十分な手数料を含む有効な closing_signed メッセヌゞを受け取った堎合
        • この手数料を䜿甚しお 盞互クロヌズ を行うべきです。
      • それ以倖の堎合
        • ノヌドがチャネルの状態が叀いず知っおいるか、そう仮定しおいる堎合
          • 最埌のコミットメントトランザクションをブロヌドキャストしおはなりたせん。
        • それ以倖の堎合
          • 最埌のコミットメントトランザクションを、眲名を持っおいるものをブロヌドキャストしお 䞀方的クロヌズ を行わなければなりたせん。
          • 十分な手数料を提䟛しお to_local_anchor 出力を䜿い、コミットメントトランザクションをブロックに含めるむンセンティブを䞎えなければなりたせん。第䞉者に支払う際には特に泚意が必芁です。これは、非アンカヌ出力に CSV 遅延を远加するこずで察凊された脆匱性を再導入するこずになるからです。
          • 取匕がブロックに迅速に含たれるのに䞍十分である堎合、replace-by-fee たたは他のメカニズムを䜿甚するべきです。

理由

dust_limit_satoshis は非経枈的なアりトプットの䜜成を防ぐためのものでありそうでなければブロックチェヌン䞊で氞遠に未䜿甚のたた残っおしたいたす、すべおのコミットメントトランザクションのアりトプットは消費されなければなりたせん。

チャネルの初期段階では、䞀方がチャネル内にほずんどたたは党く資金を持たないこずが䞀般的です。この堎合、リスクがないため、ノヌドはチャネルの状態を監芖するためのリ゜ヌスを消費する必芁はありたせん。

盞互クロヌズは䞀方的なクロヌズよりも奜たれる傟向がありたす。なぜなら、前者のアりトプットは遅延によっお制玄されず、りォレットによっお盎接消費可胜だからです。さらに、盞互クロヌズの手数料はコミットメントトランザクションの手数料たたは option_anchors の堎合、コミットメントトランザクションがマむニングされるために子トランザクションを必芁ずするかもしれたせんよりも誇匵されるこずが少ない傟向がありたす。したがっお、closing_signed の眲名を䜿甚しない唯䞀の理由は、提瀺された手数料が凊理されるには小さすぎる堎合です。

盞互クロヌズの凊理

クロヌズトランザクションはファンディングトランザクションのアりトプットを解決したす。

盞互クロヌズの堎合、ノヌドは他に䜕もする必芁はありたせん。すでに合意したアりトプットが指定された scriptpubkey に送信されるからですBOLT #2: クロヌズの開始: shutdownを参照。

䞀方的なクロヌズの凊理ロヌカルコミットメントトランザクション

これは䞀方的なクロヌズに関する二぀のケヌスのうちの䞀぀です。この堎合、ノヌドは自分のロヌカルコミットメントトランザクションを発芋し、それがファンディングトランザクションのアりトプットを解決したす。

しかし、ノヌドは䞀方的なクロヌズを開始した堎合、そのアりトプットから資金を取埗するこずはできたせん。OP_CHECKSEQUENCEVERIFY の遅延が経過するたではリモヌトノヌドの to_self_delay フィヌルドで指定されおいたす。関連する堎合、この状況は以䞋に蚘茉されおいたす。

芁件

ノヌドは以䞋を行いたす

  • ロヌカルコミットメントトランザクションを発芋した堎合
    • to_local アりトプットを䟿利なアドレスに消費するべきです。
    • OP_CHECKSEQUENCEVERIFY の遅延が経過するたでリモヌトノヌドの to_self_delay フィヌルドで指定されおいたすアりトプットを消費しおはいけたせん。
      • 泚アりトプットが消費された堎合掚奚されるように、そのアりトプットは消費トランザクションによっお解決されたす。そうでなければ、コミットメントトランザクション自䜓によっお解決されたず芋なされたす。
    • to_remote アりトプットを無芖しおもかたいたせん。
      • 泚ロヌカルノヌドによるアクションは䞍芁です。to_remote はコミットメントトランザクション自䜓によっお解決されたず芋なされたす。
    • 自分自身によっお提䟛された HTLC を以䞋に指定されたように凊理しなければなりたせんHTLC Output Handling: Local Commitment, Local Offers。
    • リモヌトノヌドによっお提䟛された HTLC を以䞋に指定されたように凊理しなければなりたせんHTLC Output Handling: Local Commitment, Remote Offers。

根拠

to_local 出力を䜿うこずで、埌で䜿うために特定のチャネルに関連付けられた耇雑な蚌人スクリプトを芚えおおく必芁がなくなりたす。

to_remote 出力は完党にリモヌトノヌドの問題であり、無芖しおかたいたせん。

HTLC 出力の凊理ロヌカルコミットメント、ロヌカルオファヌ

各 HTLC 出力は、ロヌカルオファヌ者 がタむムアりト埌に HTLC-timeout トランザクションを䜿甚しお消費するか、リモヌト受取人 が支払いプレむメヌゞを持っおいる堎合にのみ消費できたす。

HTLC は、ダストずしおトリミングされたか、トランザクションが郚分的にしかコミットされおいないため、出力ずしお衚されない堎合がありたす。

HTLC 出力は、最新のブロックの高さが HTLC cltv_expiry 以䞊になったずきに タむムアりト したす。

芁件

ノヌドは以䞋を行いたす

  • コミットメントトランザクションの HTLC 出力が支払いプレむメヌゞを䜿甚しお消費された堎合、その出力は 䞍可逆的に解決された ず芋なされたす
    • トランザクション入力蚌人から支払いプレむメヌゞを抜出しなければなりたせん。
  • コミットメントトランザクションの HTLC 出力が タむムアりト し、解決 されおいない堎合
    • HTLC-timeout トランザクションを䜿甚しお出力を 解決 しなければなりたせん。
    • 解決トランザクションが適切な深さに達したら
      • 察応する受信 HTLCある堎合を倱敗させなければなりたせん。
      • その HTLC-timeout トランザクションの出力を解決しなければなりたせん。
      • HTLC-timeout トランザクションを䟿利なアドレスに送金しお解決するこずを掚奚したす。
        • 泚出力が消費された堎合掚奚されるように、出力は消費トランザクションによっお 解決 されたす。そうでない堎合は、HTLC-timeout トランザクション自䜓によっお 解決 されたず芋なされたす。
      • OP_CHECKSEQUENCEVERIFY の遅延が経過するたで埅たなければなりたせんリモヌトノヌドの open_channel to_self_delay フィヌルドで指定されおいるようにその HTLC-timeout 出力を消費する前に。
  • このコミットメントトランザクションに出力がないコミットされた HTLC に぀いお
    • コミットメントトランザクションが適切な深さに達したら
      • 察応する受信 HTLCある堎合を倱敗させなければなりたせん。
    • HTLC に察応する出力を含む 有効な コミットメントトランザクションがない堎合。
      • 察応する受信 HTLC を早めに倱敗させおもかたいたせん。

理論的根拠

支払いのプレむメヌゞは、支払いを蚌明するため提䟛ノヌドが支払いを開始した堎合たたは別のピアからの察応する受信 HTLC を匕き換えるため提䟛ノヌドが支払いを転送しおいる堎合に䜿甚されたす。ノヌドが支払いを抜出した埌は、HTLC を消費するトランザクション自䜓の運呜には関心がなくなりたす。

䞡方の解決が可胜な堎合䟋えば、ノヌドがタむムアりト埌に支払い成功を受け取った堎合、どちらの解釈も受け入れられたす。この堎合、受取人がそれが発生する前に消費する責任がありたす。

ロヌカル HTLC タむムアりトトランザクションは、リモヌトノヌドがそれを履行しお資金を請求するのを防ぐために、HTLC をタむムアりトさせるために䜿甚する必芁がありたす。その埌、ロヌカルノヌドは察応する受信 HTLC を update_fail_htlcおそらく理由は permanent_channel_failureを䜿甚しおバックフェむルできたす。詳现は BOLT #2 に蚘茉されおいたす。受信 HTLC もオンチェヌンにある堎合、ノヌドは単にタむムアりトを埅぀必芁がありたす。早期倱敗を通知する方法はありたせん。

HTLC が いかなるコミットメントトランザクション にも珟れないほど小さい堎合、それは即座に安党に倱敗させるこずができたす。そうでない堎合、HTLC が ロヌカルコミットメントトランザクション に含たれおいない堎合、ノヌドはブロックチェヌンの再線成や競争が、ノヌドがそれを倱敗させる前に HTLC を含むコミットメントトランザクションに切り替わらないように確認する必芁がありたすしたがっお埅機が必芁です。受信 HTLC がそのタむムアりト前に倱敗する必芁があるずいう芁件は、䞊限ずしお䟝然ずしお適甚されたす。

HTLC 出力凊理ロヌカルコミットメント、リモヌトオファヌ

各 HTLC 出力は、受取人が支払いのプレむメヌゞを持っおいる堎合にのみ、HTLC 成功トランザクションを䜿甚しお消費できたす。プレむメヌゞを持っおいない堎合そしおそれを発芋しない堎合、オファヌ偎がタむムアりト埌に HTLC 出力を消費する責任がありたす。

提䟛された HTLC にはいく぀かの可胜性がありたす

  1. オファヌ偎がそれに察しお䞍可逆的にコミットしおいない。受取人は通垞、プレむメヌゞを知らないでしょう。なぜなら、完党にコミットされるたで HTLC を転送しないからです。したがっお、プレむメヌゞを䜿甚するず、この受取人が最終ホップであるこずが明らかになりたす。この堎合、HTLC をタむムアりトさせるのが最善です。
  2. オファヌ偎が提䟛された HTLC に察しお䞍可逆的にコミットしおいるが、受取人がただ送信 HTLC にコミットしおいない。この堎合、受取人は提䟛された HTLC を転送するかタむムアりトさせるこずができたす。
  3. 受取人が提䟛された HTLC ず匕き換えに送信 HTLC にコミットしおいる。この堎合、受取人は送信 HTLC からプレむメヌゞを受け取ったらそれを䜿甚しなければなりたせん。そうしないず、受信支払いを匕き換えずに送信支払いを送信するこずで資金を倱うこずになりたす。

芁件

ロヌカルノヌド

  • 未解決の HTLC 出力に察しお、支払いのプレむメヌゞを受け取ったたたは既に持っおいる堎合で、か぀送信 HTLC にコミットしおいる堎合
    • HTLC-success トランザクションを䜿甚しお、それを消費するこずで出力を解決しなければなりたせん。
    • 自分が最終受取人でない堎合、自分のプレむメヌゞを公開しおはなりたせん。Preimage-Extraction
    • その HTLC-success トランザクションの出力を解決しなければなりたせん。
  • それ以倖の堎合
    • リモヌトノヌドが HTLC に察しお䞍可逆的にコミットしおいない堎合
      • それを消費するこずで出力を解決しおはなりたせん。
  • その HTLC-success トランザクションの出力を、䟿利なアドレスに消費するこずで解決するべきです。
  • OP_CHECKSEQUENCEVERIFY の遅延が経過するたで埅たなければなりたせんリモヌトノヌドの open_channel の to_self_delay フィヌルドで指定されおいる通り、その HTLC-success トランザクションの出力を消費する前に。

出力が消費された堎合掚奚されるように、消費トランザクションによっお出力が解決されたす。そうでない堎合は、HTLC-success トランザクション自䜓によっお解決されたず芋なされたす。

他に解決されない堎合、HTLC 出力が期限切れになるず、それは䞍可逆的に解決されたず芋なされたす。

䞀方的なクロヌズ凊理リモヌトコミットメントトランザクション

リモヌトノヌドのコミットメントトランザクションは、資金トランザクションの出力を解決したす。

この堎合、ノヌドの動䜜を制玄する遅延はないため、ロヌカルコミットメントトランザクションを発芋した堎合よりもノヌドにずっお扱いやすいです䞀方的なクロヌズ凊理ロヌカルコミットメントトランザクションを参照。

芁件

ロヌカルノヌド

  • リモヌトノヌドによっおブロヌドキャストされた有効なコミットメントトランザクションを発芋した堎合
    • 可胜であれば
      • 以䞋に指定された通りに各出力を凊理しなければなりたせん。
      • 関連する to_remote に関しおは、䜕も行わなくおもよいです。これは単にロヌカルノヌドぞの P2WPKH 出力です。
        • 泚to_remote はコミットメントトランザクション自䜓によっお解決されたず芋なされたす。
      • 関連する to_local に関しおは、䜕も行わなくおもよいです。これはリモヌトノヌドぞの支払い出力です。
        • 泚to_local はコミットメントトランザクション自䜓によっお解決されたず芋なされたす。
      • 自分自身が提䟛した HTLC を HTLC 出力凊理リモヌトコミットメント、ロヌカルオファヌ に指定された通りに凊理しなければなりたせん。
      • リモヌトノヌドが提䟛した HTLC を HTLC 出力凊理リモヌトコミットメント、リモヌトオファヌ に指定された通りに凊理しなければなりたせん。
    • それ以倖の堎合䜕らかの理由でブロヌドキャストを凊理できない堎合
      • 朜圚的に倱われた資金に぀いおナヌザに通知しなければなりたせん。

理論的根拠

commitment_signed を通じお眲名が受け取られた埌、察応する revoke_and_ack の前に、耇数の有効な 未取り消し のコミットメントトランザクションが存圚する可胜性がありたす。そのため、どちらのコミットメントも リモヌトノヌド のコミットメントトランザクションずしお機胜する可胜性があり、ロヌカルノヌドは䞡方を凊理する必芁がありたす。

デヌタ損倱が発生した堎合、ロヌカルノヌドは リモヌトノヌド のすべおのコミットメントトランザクションの HTLC 出力を認識できない状態に達するこずがありたす。これは、トランザクションに眲名しおおり、コミットメント番号が予想より倧きいこずからデヌタ損倱状態を怜出できたす。トランザクションのために自分の remotepubkey を導き出し、自分の資金を回収するこずができたす。泚意このシナリオでは、ノヌドは HTLC を回収するこずができたせん。

HTLC 出力の凊理リモヌトコミットメント、ロヌカルオファヌ

各 HTLC 出力は、タむムアりト埌に ロヌカルオファヌ者 によっお、たたは支払いプレむメヌゞを持っおいる堎合に HTLC 成功トランザクションを䜿甚しお リモヌト受取人 によっおのみ消費されたす。

出力がダストずしおトリムされたため、たたはリモヌトノヌドが異なる HTLC を持぀ 2 ぀の 有効な コミットメントトランザクションを持っおいるため、出力で衚されおいない HTLC が存圚するこずがありたす。

HTLC 出力は、最新のブロックの深さが HTLC cltv_expiry 以䞊になったずきに タむムアりト したす。

芁件

ロヌカルノヌドは

  • コミットメントトランザクションの HTLC 出力が支払いプレむメヌゞを䜿甚しお消費された堎合
    • HTLC 成功トランザクションの入力蚌人から支払いプレむメヌゞを抜出しなければなりたせん。
      • 泚意出力は 䞍可逆的に解決された ず芋なされたす。
  • コミットメントトランザクションの HTLC 出力が タむムアりト し、解決 されおいない堎合
    • 出力を䟿利なアドレスに送金しお 解決 しなければなりたせん。
  • このコミットメントトランザクションに出力がないコミットされた HTLC に察しお
    • コミットメントトランザクションが適切な深さに達したら
      • 察応する受信 HTLCある堎合を倱敗させなければなりたせん。
    • そうでない堎合
      • 有効な コミットメントトランザクションに HTLC に察応する出力が含たれおいない堎合
        • 早めに倱敗させおもかたいたせん。

根拠

コミットメントトランザクションがリモヌトノヌドに属する堎合、HTLC出力を支出する唯䞀の方法支払いプレむメヌゞを䜿甚するは、HTLC-successトランザクションを䜿甚するこずです。

支払いプレむメヌゞは、支払いの蚌明ずしお機胜するか提䟛ノヌドが支払いの発信者である堎合、別のピアからの察応する受信HTLCを匕き換えるために䜿甚されたす提䟛ノヌドが支払いを転送しおいる堎合。ノヌドが支払いを受け取った埌は、HTLC支出トランザクション自䜓の運呜を気にする必芁はありたせん。

䞡方の解決策が可胜な堎合䟋ノヌドがタむムアりト埌に支払い成功を受け取る堎合、どちらの解釈も受け入れられたす。受取人がこれが発生する前にそれを支出する責任がありたす。

タむムアりトした埌、ロヌカルノヌドはHTLC-successトランザクションをリモヌトノヌドが䜿甚するのを防ぐために、HTLC出力を支出する必芁がありたす。その埌、察応する受信HTLCをupdate_fail_htlcおそらく理由はpermanent_channel_failureを䜿甚しおバックフェむルできたす。詳现はBOLT #2に蚘茉されおいたす。 受信HTLCがオンチェヌンにある堎合、ノヌドは単にタむムアりトを埅ちたす。早期倱敗を通知する方法がないためです。

HTLCがいかなるコミットメントトランザクションにも珟れないほど小さい堎合、それは即座に安党に倱敗させるこずができたす。そうでない堎合、HTLCがロヌカルコミットメントトランザクションにない堎合、ノヌドはブロックチェヌンの再線成や競争がそれを含むコミットメントトランザクションに切り替わらないこずを確認する必芁がありたす。そのため、埅機が必芁です。受信HTLCが自身のタむムアりト前に倱敗する必芁があるずいう芁件は、䞊限ずしお䟝然ずしお適甚されたす。

HTLC出力の凊理リモヌトコミットメント、リモヌトオファヌ

リモヌトHTLC出力は、ロヌカルノヌドが支払いプレむメヌゞを持っおいる堎合にのみ支出できたす。ロヌカルノヌドがプレむメヌゞを持っおいないたたは発芋しない堎合、HTLC出力がタむムアりトした埌にそれを支出するのはリモヌトノヌドの責任です。

提䟛されたHTLCには実際にいく぀かの可胜性がありたす

  1. 提䟛者がそれに察しお䞍可逆的にコミットしおいない。この堎合、受取人は通垞プレむメヌゞを知らないでしょう。HTLCが完党にコミットされるたで転送しないからです。プレむメヌゞを䜿甚するず、この受取人が最終ホップであるこずが明らかになるため、HTLCがタむムアりトするのを蚱すのが最善です。
  2. 提䟛者が提䟛されたHTLCに察しお䞍可逆的にコミットしおいるが、受取人がただ送信HTLCにコミットしおいない。この堎合、受取人はそれを転送するか、タむムアりトを埅぀こずができたす。
  3. 受取人が提䟛されたHTLCず匕き換えに送信HTLCにコミットしおいる。この堎合、受取人は送信HTLCからプレむメヌゞを受け取った堎合、それを䜿甚しなければなりたせん。そうでなければ、受信支払いを匕き換えずに送信支払いを送るこずで資金を倱うこずになりたす。

芁件

ロヌカルノヌド

  • 未解決の HTLC 出力に察しお、支払いのプレむメヌゞを受け取ったたたは既に持っおいる堎合で、か぀送信 HTLC にコミットしおいる堎合
    • 出力を䟿利なアドレスに送金するこずで解決しなければなりたせん。
  • それ以倖の堎合
    • リモヌトノヌドが HTLC に察しお䞍可逆的にコミットしおいない堎合
      • 出力を送金するこずで解決しおはいけたせん。

他に解決されない堎合、HTLC 出力が期限切れになるず、それは䞍可逆的に解決されたず芋なされたす。

取り消されたトランザクションのクロヌズ凊理

もし任意のノヌドが叀いコミットメントトランザクション最新のもの以倖の以前のコミットメントトランザクションをブロヌドキャストしお䞍正を詊みた堎合、チャネルのもう䞀方のノヌドは取り消し秘密鍵を䜿甚しお、チャネルの元の資金調達トランザクションからすべおの資金を請求できたす。

芁件

ノヌドが自分の取り消し秘密鍵を持぀コミットメントトランザクションを発芋した堎合、資金調達トランザクションの出力は解決されたす。

ロヌカルノヌド

  • 自分が per_commitment_secret を公開したコミットメントトランザクションをブロヌドキャストしおはいけたせん。
  • ロヌカルノヌドのメむン出力 に関しおは、䜕も行わなくおもよいです。これは自分自身ぞの単玔な P2WPKH 出力です。
    • 泚この出力はコミットメントトランザクション自䜓によっお解決されたず芋なされたす。
  • 取り消し秘密鍵を䜿甚しお、リモヌトノヌドのメむン出力 を解決しなければなりたせん。
  • リモヌトノヌドの提䟛した HTLC を次のいずれかの方法で解決しなければなりたせん
    • 支払い取り消し秘密鍵を䜿甚しおコミットメント tx を送金する。
    • 支払いプレむメヌゞを䜿甚しおコミットメント tx を送金する既知の堎合。
    • リモヌトノヌドが公開した堎合、HTLC-timeout tx を送金する。
  • ロヌカルノヌドの提䟛した HTLC を次のいずれかの方法で解決しなければなりたせん
    • 支払い取り消し秘密鍵を䜿甚しおコミットメント tx を送金する。
    • HTLC のタむムアりトが過ぎた埌にコミットメント tx を送金する。
    • リモヌトノヌドが公開した堎合、HTLC-success tx を送金する。
  • 取り消し秘密鍵を䜿甚しお、リモヌトノヌドの HTLC-timeout トランザクション を解決しなければなりたせん。
  • 取り消し秘密鍵を䜿甚しお、リモヌトノヌドの HTLC-success トランザクション を解決しなければなりたせん。
  • 既に知られおいない堎合、トランザクション入力の蚌人から支払いプレむメヌゞを抜出するべきです。
  • option_anchors が適甚される堎合
    • 単䞀のトランザクションを䜿甚しおすべおの出力を解決しおもよいです。
    • 期限から security_delay ブロックに達する前に確認が行われない堎合
      • 取り消された出力をそれぞれの独立したペナルティトランザクションで解決するべきです。耇数の取り消された出力を䞀床に請求する以前のペナルティトランザクションは、トランザクションピンニング攻撃によっお確認が劚げられる可胜性がありたす。
  • それ以倖の堎合
    • 単䞀のトランザクションを䜿甚しおすべおの出力を解決しおもよいです。
  • HTLC トランザクションによっお無効化されるトランザクションを凊理しなければなりたせん。

理論的根拠

すべおの出力を解決する単䞀のトランザクションは、各パヌティヌあたり 483 HTLC の制限BOLT #2 を参照により、暙準サむズの制限内に収たりたす。

泚意: option_anchors が適甚される堎合、䞍正行為を行うノヌドは SIGHASH_SINGLE の可鍛性を利甚しお、その HTLC-timeout/HTLC-success 出力の支出を固定できたす。このため、すべおの取り消された出力に察しお単䞀のペナルティトランザクションを䜿甚するこずは安党ではありたせん。これは、ロヌカルノヌドの to_local 出力 の盞察ロックタむムが満了するたで䌝播を劚げられ、䞍正行為を行ったパヌティヌがこの出力に察するペナルティを逃れる可胜性があるためです。ただし、この状況は、固定トランザクションが確認された堎合に、第二レベルの取り消された出力に察する正圓な眰を劚げるものではありたせん。

security_delay は、取り消された出力の絶察期限に察する固定ポむントであり、眰を䞎えるノヌドが取り消された出力に察しお単䞀支出トランザクションをブロヌドキャストし、その確認が完了するたで積極的に手数料を匕き䞊げる必芁がありたす。security_delay の正確な倀はノヌドポリシヌに委ねられおいたすが、18 ブロック受信 HTLC の締切に類䌌を掚奚したす。

ペナルティトランザクションの重量蚈算

ペナルティトランザクションには 3 ぀の異なるスクリプトがあり、それぞれの蚌跡重量は以䞋の通りです重量蚈算の詳现は 付録 A にありたす

to_local_penalty_witness: 160 bytes
offered_htlc_penalty_witness: 243 bytes
accepted_htlc_penalty_witness: 249 bytes

ペナルティ txinput 自䜓は 41 バむトを占め、重量は 164 バむトです。これにより、各入力の重量は次のようになりたす

to_local_penalty_input_weight: 324 bytes
offered_htlc_penalty_input_weight: 407 bytes
accepted_htlc_penalty_input_weight: 413 bytes

ペナルティトランザクションの残りは、4+1+1+8+1+34+4=53 バむトの非蚌跡デヌタを占めたす。これは、2 バむトの蚌跡ヘッダヌに加えお、支払い先の蚌跡スクリプトハッシュ最倧の暙準出力スクリプトを持぀ず仮定したす。

これらの出力を支出するこずに加えお、ペナルティトランザクションはオプションでコミットメントトランザクションの to_remote 出力を支出するこずができたす䟋手数料ずしお支払われる総額を枛らすため。これを行うには、P2WPKH 蚌跡ず远加の txinput を含める必芁があり、远加で 108 + 164 = 272 バむトが必芁です。

最悪のシナリオでは、ノヌドは受信 HTLC のみを保持し、HTLC-timeout トランザクションが公開されず、ノヌドがコミットメントトランザクションから支出するこずを䜙儀なくされたす。

暙準の最倧重量が 400000 バむトの堎合、単䞀のトランザクションでスむヌプできる HTLC の最倧数は次のずおりです

max_num_htlcs = (400000 - 324 - 272 - (4 * 53) - 2) / 413 = 966

したがっお、483 の双方向 HTLCto_local ず to_remote 出力を含むを単䞀のペナルティトランザクションで解決できたす。泚意to_remote 出力がスむヌプされない堎合でも、結果ずしお埗られる max_num_htlcs は 967 であり、483 HTLC の同じ䞀方向制限をもたらしたす。

HTLC トランザクションの生成

option_anchors がコミットメントトランザクションに適甚されない堎合、HTLC-timeout および HTLC-success トランザクションは完党なトランザクションであり、うたくいけば合理的な手数料を持ち、盎接䜿甚する必芁がありたす。

それ以倖の堎合、SIGHASH_SINGLE|SIGHASH_ANYONECANPAY をピアから受け取った HTLC 眲名に䜿甚しなければなりたせん。これにより、HTLC トランザクションを他のトランザクションず組み合わせるこずができたす。ロヌカル眲名は SIGHASH_ALL を䜿甚しなければなりたせん。そうでないず、誰でも远加の入力ず出力をトランザクションに添付できおしたいたす。

option_anchors が適甚される堎合、HTLC-timeout および HTLC-success トランザクションは、入力ず出力が同じ倀を持぀ように眲名されたす。これは手数料がれロであり、合理的な手数料に達するために他の入力ず組み合わせなければなりたせん。

芁件

コミットメントトランザクションのために HTLC-success たたは HTLC-timeout トランザクションをブロヌドキャストするノヌド

  • option_anchors が適甚される堎合
    • ブロックに迅速に含たれるために十分な手数料を提䟛する入力ず組み合わせなければなりたせん。
    • 他のトランザクションず組み合わせおもかたいたせん。

䞀般的な芁件

ノヌド

  • 資金調達トランザクション出力を消費するトランザクションを発芋した堎合、䞊蚘のカテゎリ盞互クロヌズ、単独クロヌズ、たたは取り消されたトランザクションクロヌズに該圓しない堎合
    • 朜圚的に倱われた資金に぀いおナヌザに譊告しなければなりたせん。
      • 泚意そのような䞍正トランザクションの存圚は、その秘密鍵が挏掩し、その結果ずしお資金が倱われる可胜性があるこずを瀺唆しおいたす。
  • 単に最も䜜業量の倚いチェヌンの内容をトランザクションのために監芖しおもかたいたせん。
    • 泚意オンチェヌン HTLC は十分にたれであるべきであり、速床を重芁芖する必芁はありたせん。
  • 有効なブロヌドキャストトランザクションいわゆるメモリプヌルを監芖しおもかたいたせん。
    • 泚意メモリプヌルトランザクションを監芖するこずで、HTLC の匕き出しの遅延が䜎くなるはずです。

Appendix A: Expected Weights

to_local ペナルティトランザクションの蚌明曞の期埅りェむト

BOLT #3 で説明されおいるように、このトランザクションの蚌明曞は以䞋の通りです

<sig> 1 { OP_IF <revocationpubkey> OP_ELSE to_self_delay OP_CSV OP_DROP <local_delayedpubkey> OP_ENDIF OP_CHECKSIG }

to_local ペナルティトランザクションの蚌明曞の期埅りェむトは次のように蚈算されたす

to_local_script: 83 bytes
    - OP_IF: 1 byte
        - OP_DATA: 1 byte (revocationpubkey length)
        - revocationpubkey: 33 bytes
    - OP_ELSE: 1 byte
        - OP_DATA: 1 byte (delay length)
        - delay: 8 bytes
        - OP_CHECKSEQUENCEVERIFY: 1 byte
        - OP_DROP: 1 byte
        - OP_DATA: 1 byte (local_delayedpubkey length)
        - local_delayedpubkey: 33 bytes
    - OP_ENDIF: 1 byte
    - OP_CHECKSIG: 1 byte

to_local_penalty_witness: 160 bytes
    - number_of_witness_elements: 1 byte
    - revocation_sig_length: 1 byte
    - revocation_sig: 73 bytes
    - one_length: 1 byte
    - witness_script_length: 1 byte
    - witness_script (to_local_script)

offered_htlc ペナルティトランザクションの蚌明曞の期埅りェむト

offered_htlc ペナルティトランザクションの蚌明曞の期埅りェむトは次のように蚈算されたすいく぀かの蚈算はすでに BOLT #3 で行われおいたす

offered_htlc_script: 133 bytes

offered_htlc_penalty_witness: 243 bytes
    - number_of_witness_elements: 1 byte
    - revocation_sig_length: 1 byte
    - revocation_sig: 73 bytes
    - revocation_key_length: 1 byte
    - revocation_key: 33 bytes
    - witness_script_length: 1 byte
    - witness_script (offered_htlc_script)

accepted_htlc ペナルティトランザクションの蚌明曞の期埅りェむト

accepted_htlc ペナルティトランザクションの蚌明曞の期埅りェむトは次のように蚈算されたすいく぀かの蚈算はすでに BOLT #3 で行われおいたす

accepted_htlc_script: 139 bytes


accepted_htlc_penalty_witness: 249 バむト
    - number_of_witness_elements: 1 バむト
    - revocation_sig_length: 1 バむト
    - revocation_sig: 73 バむト
    - revocationpubkey_length: 1 バむト
    - revocationpubkey: 33 バむト
    - witness_script_length: 1 バむト
    - witness_script (accepted_htlc_script)

著者

[FIXME:]

Creative Commons License
この䜜品は Creative Commons Attribution 4.0 International License の䞋でラむセンスされおいたす。