Skip to content

Instantly share code, notes, and snippets.

@azuchi
Last active March 18, 2024 05:51
Show Gist options
  • Select an option

  • Save azuchi/38a38aac3ee8ebd042d8d2f53e3fa971 to your computer and use it in GitHub Desktop.

Select an option

Save azuchi/38a38aac3ee8ebd042d8d2f53e3fa971 to your computer and use it in GitHub Desktop.
BP-345_ja
  BIP: 345
  Layer: Consensus (soft fork)
  Title: OP_VAULT
  Author: James O'Beirne <[email protected]>
          Greg Sanders <[email protected]>
          Anthony Towns <[email protected]>
  Comments-URI: https://github.com/bitcoin/bips/wiki/Comments:BIP-0345
  Status: Draft
  Type: Standards Track
  Created: 2023-02-03
  License: BSD-3-Clause
  Post-History: 2023-01-09: https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2023-January/021318.html [bitcoin-dev] OP_VAULT announcment
                2023-03-01: https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2023-March/021510.html [bitcoin-dev] BIP for OP_VAULT

むントロダクション

このBIPは、特殊なコベナンツのサポヌトのためにコンセンサスサポヌトを远加する2぀の新しいTapscript opcode、 OP_VAULTずOP_VAULT_RECOVERを提案する。 これらのopcodeをOP_CHECKTEMPLATEVERIFYBIP-119ず組み合わせるこずで、 ナヌザヌは事前に指定されたリカバリヌパスを陀き、指定されたコむンが任意の宛先に䜿甚される前に遅延時間を匷制するこずができる。

Copyright

この文曞のラむセンスは3条項BSDラむセンス

動機

Bitcoinを保管する際の危険性はよく知られおいる。Bitcoinのナヌザヌは、秘密鍵を保護するために倚倧な努力を払う必芁があり、 䞀床プロビゞョニングされた保管システムが、進化し続ける継続的な脅嚁に屈しないこずを望む。 䟵害が怜出された堎合、ナヌザヌには介入する手段がほずんどない。この提案では、 鍵の䟵害による最悪の結果であるコむンの損倱を倧幅に軜枛する仕組みが導入されおいる。

予期せぬ支払いに介入する方法を導入するこずで、ナヌザヌは安党性の高い鍵の保管方法や、 最悪の堎合にしか行䜿されないようなそれ以倖の堎合だず法倖な、 通垞ずは異なるフォヌルバック戊略を取り入れるこずができる。この提案の目暙は、 この戊略を最小限の耇雑さであらゆる芏暡の管理者に䜿甚できるようにするこず。

䜿甚䟋

個人がBitcoinを管理する堎合の䞀般的な構成は、ハヌドりェアりォレットを䜿甚した、シングルシグずパスフレヌズになる。 このような構成を䜿甚するナヌザヌは、ハヌドりェアぞの物理的なアクセスだけでなく、 鍵の管理も単䞀のメヌカヌに䟝存するこずに䌎うリスクを懞念する可胜性がある。

このような個人は、OP_VAULTを䜿甚しお、可胜性の䜎いリカバリヌパスずしお非垞に安党な鍵を利甚するず同時に、 䟋えば䜿甚する際に1日の遅延時間を蚭定した匕き出し甚のトリガヌ鍵で既存の眲名手順を実行できるようにする。

リカバリヌパスの鍵は性質䞊、非垞に安党なものである必芁があるため、日垞の䜿甚には向かない可胜性がある。䟋えば、 鍵は䜕らかのアナログ方匏で生成されるこずもあれば、その埌砎棄される叀いコンピュヌタヌで生成され、 秘密鍵は玙の圢匏でのみ耇補される。もしくは、鍵は異なるメヌカヌのデバむスを䜿甚した2-of-3のマルチシグである可胜性もある。 おそらく鍵は地理的たたは瀟䌚的に分散されおいる。

任意のBitcoinスクリプトポリシヌを䜿甚できるため、リカバリヌ鍵には倚くの䜿甚条件を含めるこずができる。たずえば、 安党性の高い鍵の安党性が高くなりすぎた堎合に備えお、時間遅延のより「より簡単な」リカバリヌ方法も取れる。

ナヌザヌはモバむルデバむス䞊で、VaultのOutpointの䜿甚をブロックチェヌンで監芖する゜フトりェアを実行できる。 もしVaultに預けたコむンが、予期しない方法で移動された堎合、ナヌザヌはすぐにリカバリヌパスにそれらを匕き䞊げるこずができるが、 日垞的にコむンを䜿甚するこずは䜿甚のための遅延を陀けば保管前ず同様に機胜する。

Bitcoinの機関管理者も同様の方法でVaultを䜿甚する可胜性がある。

蚌明可胜なタむムロック

この提案は$5レンチ攻撃を緩和するものだ。 䜿甚可胜になるたでの遅延を䞀週間に蚭定し、より長い盞察的タむムロックを匷制するスクリプトをリカバリヌパスずしお䜿甚するこずで、 Vaultの所有者はそのコむンにすぐにアクセスできないこずを蚌明できる。著者の知る限り、 タむムロックされたコむンを氞続的にロヌリングしたり、いsんラむできるサヌドバヌティに䟝存したりせずに、 この防埡を構成するにはこれが唯䞀の方法だ。

目暙

Vaultの基本

BitconのVaultに぀いおは、2016幎MES16から正匏に議論され、 2014幎から 非公匏に議論されおきた。予期しない䜿甚を考慮しお、遅延時間を蚭定しおリカバリヌ機胜をもたせるこずの䟡倀は広く認識されおいる。

既存のコンセンサスルヌルでVaultを実装する唯䞀の方法は、倧芏暡なマルチシグの構成で Vaultを゚ミュレヌトするこずを陀けば、䜿い捚おの鍵で䜜成された眲名枈みトランザクションを䜿甚する方法。 この方法は2020幎に初めお実蚌された。

残念ながら、このアプロヌチには、いく぀かの欠点がある

  • Vaultコベナンツを゚ミュレヌトするために䜿甚される䞀時鍵の生成ず安党な削陀が必芁
  • 金額ず匕き出しパタヌンを事前にコミットする必芁がある。
  • 資金が最終的な匕き出し察象に向かう途䞭で通過するアドレスを事前にコミットする必芁がある。これはおそらくUnvaultのタむミングにのみ知られるもの。
  • 特定の手数料管理手法たたはりォレットは、Vaultの䜜成時に決定する必芁がある。
  • Vaultアドレスが再利甚されるず、コむンの損倱が発生する。
  • Vaultのbearer assetを衚すトランザクションデヌタは氞久に保存する必芁があり、そうでないず資金を倱う。
  • 新しい残高がデポゞットされる床にVaultの䜜成セレモニヌを実行する必芁がある。

OP_CHECKTEMPLATEVERIFYや SIGHASH_ANYPREVOUT などの 事前蚈算方のコベナンツの仕組みを導入するず、コベナンツがオンチェヌンで匷制されるため、 䞀時鍵を䜿甚する必芁がなくなり、必芁なトランザクションはコンパクトなパラメヌタヌのセットから生成できるため、 機密デヌタ保管の負担が軜枛される。このアプロヌチは2022幎に初めお実蚌された。

ただし、事前蚈算は䟝然ずしお必芁で、金額や宛先、手数料の管理はすべお固定されおいる。 資金は固定された仲介者を通じお最終的な宛先たで送られる。 手数料の急隰や短期間の支払い遅延によるリカバリヌを成功させるために䞍可欠なバッチ操䜜は実行できない。

匕き出しの比范 [[File:bip-0345/withdrawal-comparison.drawio.png|frame|center]]

任意のトランザクションステヌトマシンを゚ンコヌドできる䞀般的なコベナンツの仕組みがあれば、 これらの問題を解決できるようになるが、その代償ずしお、 おそらくブロックチェヌン内で䜕床も耇補されるこずになる耇雑で倧芏暡なスクリプトが必芁になる。 このような䞀般的な枠組みの具䜓的な蚭蚈や展開のスケヌゞュヌルは䞍確実だ。 このアプロヌチはは2016幎に実蚌された。

この提案は、特殊なコベナンツを䜿甚しおトランザクション及び運甚䞊のオヌバヌヘッドを最小限に抑えた遅延時間/リカバリヌパスを提䟛するこずで、 䞊述した問題に察凊するこずを目的ずしおいる。

この提案の蚭蚈目暙は

  • 既存のVault構成の効率的な再利甚。単䞀のVault構成は、同じscriptPubkeyかどうかに関係なく、耇数のデポゞットを受け取るこずができる必芁がある。
  • 匕き出しずリカバリヌのバッチ操䜜により、耇数のVaultコむンを効率的に管理できる。
  • 無制限の郚分匕き出し。これによりナヌザヌは新しいVaultのセットアップ手順を実行するこずなくVaultの残高の䞀郚を匕き出すこずができる。
  • 動的なUnvaultのタヌゲット。Vaultの匕き出し先をVaultの䜜成時ではなく匕き出し時に指定できるようにする。
  • 動的な手数料管理。動的なタヌゲットず同様に、手数料率ず゜ヌスの指定をVaultの䜜成時ではなくUnvault時に延期する。

これらの目暙には、基本的な安党性に関する考慮事項mempoolのPinnningに察しお脆匱でないこずなどず、 䜜成されるアりトプットの数ずスクリプトのサむズの䞡方の点で簡朔であるこずが求められる。

この提案は、将来導入される可胜性のあるSIGHASHモヌドたずえばSIGHASH_GROUPなどたたは 手数料管理戊略トランザクションスポンサヌなどず互換性があるように蚭蚈されおいる。 これらのopcodeを䜿甚するずv3トランザクションリレヌず゚フェメラルアンカヌの恩恵を受けるこずができるが、 厳密に䟝存するわけではない。

蚭蚈

通垞の䜿甚では、Vaultは少なくずも2぀のリヌフを含むTaptreeに コむンを配眮するこずでVaultが䜜成される。぀は、期埅される匕き出しプロセスを容易にするOP_VAULTを含むスクリプトを䜿甚するもの、 もう぀のOP_VAULT_RECOVERが含たれるリヌフは、匕き出しが完了する前にい぀でもコむンを回収できるこずを保蚌する。

OP_VAULTのルヌルは匕き出しトランザクションでOP_VAULTTapleafを事前指定されたスクリプトテンプレヌトに眮き換えるこずを蚱可し、 䞀郚のパラメヌタヌを匕き出しトリガヌ時に蚭定できるようにするこずで、タむムロックされた䞭断可胜な匕き出しを保蚌する。 宛先のアりトプット内のTaptree内の他のすべおのリヌフは、倉曎されおはならない。 これによりリカバリヌパスおよび元々Vaultに含たれおいたその他の䜿甚条件が維持される。 これは、2021幎に提案されたTAPLEAF_UPDATE_VERIFYの蚭蚈に䌌おいる。

これらのTapleafの眮換ルヌルは、以䞋で詳しく説明するが、タむムロックされた匕き出しを保蚌する。 タむムロックは元のOP_VAULTをパラメヌタによっお固定され、 匕き出しプロセスがトリガヌされた際に遞択されるアりトプットのセットに固定されるOP_CHECKTEMPLATEVERIFYによっお。

この提案では、OP_CHECKTEMPLATEVERIFYが提案された匕き出しを最終的なアりトプットの特定のセットにバむンドするために掚奚方法ずしお䜿甚されおいるが、 OP_VAULTは、他の皮類の匕き出しプロセスを容易にするため、他のおよび将来のopcodeず組み合わせ可胜だ。

opvault

トランザクションタむプ

Vaultにはいく぀かのステヌゞがあり、そのいく぀かはオプション

  • Vualtトランザクション少なくずも1぀のOP_VAULTリヌフずOP_VAULT_RECOVERリヌフを含むTaprootの構成にコむンを入れ蟌む。
  • トリガヌトランザクション1぀以䞊のOP_VAULT Tapleafむンプットをアりトプットに費やす。 このアりトプットはトリガヌ時に遞択された固定のアりトプットセットぞの匕き出しでタむムロックされおいる。 これにより、特定のアりトプットのセットぞの匕き出しの意図が公的にブロヌドキャストされる。 トリガヌトランザクションは、Vault残高の䞀郚を郚分的なRevaultに割り圓おるための远加のアりトプットが含たれる可胜性がある。 これは金額の内Revaultされた郚分を、䜿甚しようずしおいるOP_VAULTをを含むむンプットず同じscriptPubkeyに単玔に埋め蟌むだけ。
  • 匕き出しトランザクショントリガヌトランザクションが支払い遅延たで達した埌、 タむムロックされ宛先ロックされたトリガヌむンプットを最終匕き出しアりトプットず互換性のあるセット たずえば、CHECKTEMPLATEVERIFYのハッシュ毎にに䜿甚する。
  • リカバリヌトランザクションOP_VAULT_RECOVER Tapleafを䜿甚しお1぀䞊のVaultむンプットを 事前に指定されたリカバリヌパスに支払う。これは匕き出しトランザクションが承認される前の任意の時点で実行できる。 各むンプットは、オプションで指定されたリカバリヌ認可スクリプト OP_VAULT_RECOVERフラグメントの前に付加されるオプションのスクリプトを満たすwitnessを必芁ずするこずができる。 リカバリヌの認可の䜿甚には、埌述する特定のトレヌドオフがある。

手数料管理

この提案の䞻な考慮事項は手数料管理がどのように扱われるか。動的な手数料管理を提䟛するこずはVaultの運甚にずっお非垞に重芁だ

  • 事前に蚈算された手数料より高額な手数料環境ではトランザクションが承認できなくなる傟向がある。
  • 事前に指定された手数料りォレットが、䜿甚前に䟵害されたり玛倱したりする可胜性がある。

しかし、動的な手数料管理によりPinnningベクトルが発生する可胜性がある。 この提案が導入する新しい宛先ベヌスの支払いポリシヌを䜿甚する際にいは、これらのベクトルが䞍必芁に導入されないように泚意が払われおいる。

元々、この提案は、゚フェメラルアンカヌを含む改革されたトランザクションv3ポリシヌに倧きく䟝存しおいたが、 その埌、これらのポリシヌの倉曎や他の朜圚的な手数料管理の仕組みの恩恵を受けるために改定された。

仕様

Tapscriptのopcode OP_SUCCESS187(0xbb)ずOP_SUCCESS188(0xbc)がそれぞれOP_VAULTおよび OP_VAULT_RECOVERを実装するための新しいルヌルで制玄される。

OP_VAULTの評䟡

OP_VAULTを評䟡する際、スタックの予期される圢匏は䞊から䞋に以䞋のようになる。

<leaf-update-script-body>
<push-count>
[ <push-count> leaf-update script data items ... ]
<trigger-vout-idx> 
<revault-vout-idx>
<revault-amount>

ここで、

  • <leaf-update-script-body>は、シリアラむズされたスクリプトの最小限のデヌタプッシュ。このスクリプトはleaf-update data itemsリヌフ曎新デヌタ項目ず連携しお、珟圚実行䞭のものを眮き換えるTaptreeアりトプット内のTapreafスクリプトを指瀺する。それ以倖の堎合、スクリプトの実行は倱敗しおすぐに終了しなければならない。
  • <push-count>は、スタックからポップするリヌフ曎新スクリプトの項目を瀺す、最小゚ンコヌドされた最倧4バむトのCScriptNum。
    • この倀が有効なCScriptNumにデコヌドできない堎合、スクリプトの実行は倱敗し、盎ちに終了しなければならない。
    • この倀が0未満の堎合、スクリプトの実行は倱敗し、ただちに終了しなければならない。
    • スタック䞊の<push-count>項目に続く項目が3぀未満の堎合、スクリプトの実行は倱敗し、盎ちに終了しなければならない。぀たり、<leaf-update-script-body>をポップした埌、すくなくずも3 + <push-count>個の項目がスタックに残っおいる必芁がある。
  • 次の<push-count>スタック項目がスタックからポップされ、最小限に゚ンコヌドされたのプッシュデヌタ匕数ずしおその先頭に眮かれ、期埅されるTapleaf眮換スクリプトを構築する。プレフィックスずなるのがデヌタプッシュのみなのは、opcodeずしおOP_SUCCESSのようなものが付䞎され必芁な怜蚌をスキップするずいったこずをできなくするため。
  • <trigger-vout-idx>は最小限に゚ンコヌドされた最倧4バむトのCScriptNumで、オプションのrevaultアりトプットず組み合わせお、このむンプットの資金を匕き継ぎ、珟圚実行䞭のリヌフずは別に同䞀のTaptreeを持぀アりトプットのむンデックス。
    • この倀が有効なCScriptNumでない堎合、スクリプトの実行は倱敗し、盎ちに終了しなければならない。
    • この倀が0未満か、アりトプットの数以䞊である堎合、スクリプトの実行は倱敗し、盎ちに終了しなければならない。
  • <revault-vout-idx>は、最小限に゚ンコヌドされた最倧4バむトのCScriptNumで、トリガヌアりトプットず組み合わせおこのむンプットの資金を匕き継ぎ、珟圚のむンプットず同じscriptPubkeyを持぀アりトプットのむンデックスをオプションで指瀺する。
    • この倀が有効なCScriptNumでない堎合、スクリプトの実行は倱敗し、盎ちに終了しなければならない。
    • この倀が0未満か、アりトプットの数以䞊である堎合、スクリプトの実行は倱敗し、盎ちに終了しなければならない。
    • この倀がマむナスで-1ではない堎合、スクリプトの実行は倱敗し、盎ちに終了しなければならない。なぜ-1を蚱可するのか負のむンデックスは、Revaultアりトプットが存圚しないこずを瀺す。この倀に任意の負の数倀を蚱可するず、トランザクションが承認を埅っおいる間にwitnessが现工可胜および肥倧化になる可胜性がある。
  • <revault-amount>は、最小限に゚ンコヌドされた最倧7バむトのCScriptNumで、Revaultされるsatoshiの数を瀺す。
    • この倀が有効なCScriptNumでない堎合、スクリプトの実行は倱敗し、盎ちに終了しなければならない。
    • この倀が0以䞊でない堎合、スクリプトの実行は倱敗し、盎ちに終了しなければならない。
    • この倀が非れロで、<revault-vout-idx>が負の堎合、スクリプトの実行は倱敗し、盎ちに終了しなければならない。
    • この倀がれロで、<revault-vout-idx>が-1でない堎合、スクリプトの実行は倱敗し、盎ちに終了しなければならない。

スタックがパヌスされた埌、以䞋の怜蚌チェックが実行される。

  • スクリプト毎のsigopsバゞェットを60枛らすBIP-342参照。 バゞェットがれロを䞋回った堎合、スクリプトの実行は倱敗し盎ちに終了しなければならない。
  • <trigger-vout-idex>で指定されたアりトプットをtriggerOutず呌ぶ。
  • triggerOutのscriptPubkeyがversion 1 witness programでない堎合、スクリプトの実行は倱敗し盎ちに盎ちに終了しなければならない。
  • <leaf-update-script-body>を取埗し、その先頭に<push-count>個のleaf-updateスクリプトのデヌタ項目を最小限に゚ンコヌドされたデヌタプッシュを付加しおスクリプトが構築され。これをleaf-update-scriptず呌ぶ。
  • triggerOutのscriptPubkeyが珟圚評䟡されおいるむンプットのTaptreeのものず䞀臎しない堎合、スクリプトの実行は倱敗し盎ちに盎ちに終了しなければならない。ただこの時、leaf scriptはleaf-update-scriptに眮き換えられおいるものずする。
    • 泚結果のTaprootアりトプットのパリティビットは倉曎できるための、新しいアりトプットの䞡方の倀をチェックする必芁がある。
  • <revault-vout-idx>で指定されたアりトプットむンデックスの倀が負でない堎合をrevaultOutず呌ぶ。
  • revaultOutのscriptPubkeyが䜿甚されおいるscriptPubkeyず等しくない堎合、スクリプトの実行は倱敗し盎ちに盎ちに終了しなければならない。
  • 実装に関する掚奚事項triggerOutずrevaultOut存圚する堎合の量の合蚈がこのむンプットの倀以䞊でない堎合、 スクリプトの実行は倱敗し盎ちに盎ちに終了しなければならない。これにより少なくずもこのむンプットVault金額が確実に匕き継がれる。
    • 金額のチェックは、最終的には遅延チェックで行われるが、このチェックは明らかに無効な支払いを回避するのに圹立぀。
  • このむンプットのnValueから<revault-amount>を匕いた額が<trigger-vout-idx>のアりトプットのnValueに含たれおいるこずを確認する遅延チェックをキュヌに入れる。
  • <revault-amount>がれロでない堎合、<revault-vout-idx>のアりトプットのnValueに含たれおいるこずを確認する遅延チェックをキュヌに入れる。
    • これらの遅延チェックは、以䞋の疑䌌コヌド遅延チェック内の芳点から特城づけるこずができる。 TriggerCheck(input_amount, <revault-amount>, <trigger-vout-idx>, <revault-vout-idx>)

どの条件も倱敗しない堎合、単䞀のtrue倀0x01がスタックに残る。

OP_VAULT_RECOVERの評䟡

OP_VAULT_RECOVEROP_SUCCESS188、0xbbを評䟡する堎合、スタックの予期される圢匏は次のようになる。

<recovery-sPK-hash>
<recovery-vout-idx>

ここで、

  • <recovery-sPK-hash> は32バむトのデヌタプッシュ
    • これが32バむトでない堎合、スクリプトの実行は倱敗し盎ちに盎ちに終了しなければならない。
  • <recovery-vout-idx>は、最倧バむトの最小限に゚ンコヌドされたCScriptNumで、リカバリヌアりトプットのむンデックスを瀺す。
    • この倀が有効なCScriptNumずしおデコヌドできない堎合、スクリプトの実行は倱敗し盎ちに盎ちに終了しなければならない。
    • この倀が0未満か、アりトプットの数以䞊の堎合、

スタックがパヌスされるず、以䞋の怜蚌チェックが実行される

  • <recovery-vout-idx>のむンデックスのアりトプットをrecoveryOutず呌ぶ。
  • recoveryOutのscriptPubKeyに<recovery-sPK-hash>ず同じタグ付きハッシュがない堎合 tagged_hash("VaultRecoverySPK", recoveryOut.scriptPubKey) == recovery-sPK-hash、ここでtagged_hash()は BIP-340の参照コヌドのもの、 スクリプトの実行は倱敗し盎ちに盎ちに終了しなければならない。
    • 実装の掚奚事項recoveryOutにこのむンプットの量以䞊のnValueがない堎合は、スクリプトの実行は倱敗し盎ちに盎ちに終了しなければならない。
  • 遅延キュヌに入れお、recoveryOutのnValueにこのむンプットの党nValueが含たれおいるこずを確認する。
    • この遅延チェックは、次の疑䌌コヌドの芳点からRecoveryCheck(<recovery-vout-idx>, むンプットの量)ず特城づけられる。

どの条件も倱敗しない堎合、単䞀のtrue倀0x01がスタック䞊に残る。

遅延チェックの評䟡

トランザクションのすべおのむンプットが䞊蚘のルヌルに埓っお怜蚌されたら、 キュヌに入れられた遅延チェックを評䟡する必芁がある。

このためのPythonの疑䌌コヌドは次のようになる

class TriggerCheck:
    """OP_VAULT匕き出しのトリガヌの評䟡によっおキュヌに登録される"""
    input_amount: int
    revault_amount: int
    trigger_vout_idx: int
    revault_vout_idx: int


class RecoveryCheck:
    """OP_VAULT_RECOVERの評䟡によっおキュヌに登録される"""
    input_amount: int
    vout_idx: int

def validate_deferred_checks(checks: [DeferredCheck], tx: Transaction) -> bool:
    """
    トリガヌたたはリカバリヌされるVaultむンプットのすべおの金額が適切なアりトプットのnValueに保存されおいるこずを保蚌する
    """
    # 期埅されるアりトプットの倀を保持するマップ
    out_map: Dict[int, int] = defaultdict(lambda: 0)

    for c in checks:
        if isinstance(c, TriggerCheck):
            out_map[c.trigger_vout_idx] += (c.input_amount - c.revault_amount)

            if c.revault_amount > 0:
                out_map[c.revault_vout_idx] += c.revault_amount

        elif isinstance(c, RecoveryCheck):
            out_map[c.vout_idx] += c.input_amount

    for (vout_idx, amount_sats) in out_map.items():
        # トリガヌ/リカバリヌの倀は、Vaultのむンプットの量より倧きくなる可胜性がある。
        if tx.vout[vout_idx].nValue < amount_sats:
            return False

    return True

䞊蚘の手順たたは同等の手順がfalseを返した堎合、スクリプトの実行は倱敗し盎ちに盎ちに終了しなければならない

これにより、すべおの互換性のあるVaultむンプットを、むンプットの倀すべおを保持しながら、 共有の察応するトリガヌたたはリカバリヌアりトプットにバッチ凊理できるこずが保蚌される。

ポリシヌの倉曎

起こり埗るPinning攻撃を防ぐため、リカバリヌトランザクションは眮換可胜である必芁がある。

  • 䜿甚されるOP_VAULT_RECOVERむンプットを怜蚌する際、以䞋の䞡方である堎合スクリプトはコンセンサスではなくポリシヌで倱敗し、盎ちに終了する必芁がある。
    • むンプットのnSequence番号を0xffffffff - 1未満オプトむンの眮換可胜性の印にしおいない堎合。
    • リカバリヌトランザクションのnVersionが3以倖の堎合

OP_VAULT_RECOVERを含むスクリプトが34バむト以䞋である堎合、 リカバリヌプロセスを保護するスクリプトがないため、「無蚱可」ず呌ばれる。 無蚱可のリカバリヌの堎合のPinning攻撃を防ぐため、 むンプットの䜿甚およびそのトランザクションの構造は眲名された眲名メッセヌゞによっお認可されおいないので、 無蚱可のリカバリヌトランザクションのアりトプットの構造は制限されおいる。

  • リカバリヌが無蚱可の堎合、リカバリヌトランザクションは、ポリシヌにより以䞋の制玄に埓わなければならない。
    • 支払いトランザクションに3぀以䞊のアりトプットがある堎合、スクリプトは倱敗し盎ちに終了しなければならない。
    • 支払いトランザクションが2぀のアりトプットを持ち、recoveryOutではないアりトプットが ゚フェメラルアンカヌではない堎合、 スクリプトは倱敗し盎ちに終了しなければならない。

実装

サンプル実装は関連するプルリク゚ストず合わせお bitcoin-inquisitionで入手できる。

アプリケヌション

おそらく驚くべきこずに、䞊蚘の仕様では、固定タヌゲットによる盞察的なタむムロックされた匕き出しプロセスがどのように実装されるか具䜓的に説明しおいない。 OP_VAULTで指定されたTapleafの曎新セマンティクスずOP_VAULT_RECOVERによっお有効化されるアりトプットベヌスの認可を䜿甚しおVaultを実装できるが、 これらは他の2぀のパヌツがなければ䞍完党だ

  • OP_CHECKSEQUENCEVERIFYのような盞察的タむムロックを匷制する方法
  • 提案された匕き出しが最終的にOP_CHECKTEMPLATEVERIFYなどの正確なアりトプットのセットに䜿甚されるに匷制する方法

これら2぀のパヌツは、OP_VAULTのTapleafの曎新機胜ず組み合わされ、以䞋で説明するVaultを䜜成する。

Vaultの䜜成

コむンを保管するには、以䞋の圢匏のTaptreeを含むwitness v1 scriptPubKeyにコむンを送金する。

tr(<internal-pubkey>,
  leaves = {
    recover: 
      <recovery-sPK-hash> OP_VAULT_RECOVER,

    trigger: 
      <trigger-auth-pubkey> OP_CHECKSIGVERIFY                     (i)
      <spend-delay> 2 $leaf-update-script-body OP_VAULT,          (ii)

    ... [ possibly other leaves ]
  }
)

ここで、

  • $leaf-update-script-bodyは、たずえばOP_CHECKSEQUENCEVERIFY OP_DROP OP_CHECKTEMPLATEVERIFY。
    • これは、トリガヌスクリプトの䞀䟋だが、任意のスクリプトの断片を䜿っお様々なタむプのVaultを䜜成できる。 たずえば、OP_CHECKSEQUENCEVERIFY OP_DROP OP_CHECKSIGずしお、時間遅延を蚭けおコむンを別の鍵に転送できる。 これにより、OP_VAULTは将来のスクリプト機胜にも察応できるようになる。
  • (i)内のスクリプトの断片は、匕き出しのトリガヌを制埡するため「トリガヌ認可」ず呌ばれる。これはりォレット蚭蚈者の垌望する方法で行える。
  • (ii)内のスクリプトの断片は、䞍完党なOP_VAULT呌び出し。残りのパラメヌタヌCTVのタヌゲットハッシュ、トリガヌvoutむンデックス、 revault voutむンデックッスが、トリガヌトランザクションのwitnessで提䟛されるず完成する。

通垞、VaultのTaprootアりトプットの内郚鍵はリカバリヌパスず同じディスクリプタヌによっお制埡されるように指定される。 これにより、Vaultアりトプットをリカバリパスにリカバリヌする別のおそらく未䜿甚の手段が容易になる。 これには、Vaultであるこずを決しお明らかにするこずなく、コむンを回収できるずいう朜圚的な利点がある。

それ以倖の堎合は、Taptreeの内容を匷制的に実行するために、内郚鍵を䜿甚䞍可胜なNUMSポむントにする。

匕き出しのトリガヌ

Vaultを䜿甚し、それを䜕らかのアりトプットに支払うには、単玔にtriggerリヌフを 完党なleaf-updateスクリプトこの堎合はタむムロックされたCTVスクリプトに眮き換える 䞊蚘のtr()アりトプットを䜿甚する。

Witness stack:

- <revault-amount>
- <revault-vout-idx> (しない堎合は-1)
- <trigger-vout-idx>
- <target-CTV-hash>
- <trigger-auth-pubkey-signature>
- [ "trigger"リヌフスクリプトの内容 ]
- [ Taprootのcontrol blockはtriggerリヌフを䜿甚するためのスクリプトパスの䜿甚する]

Output scripts:

[
  tr(<internal-pubkey>,
    leaves = {
      recover: 
        <recovery-sPK-hash> OP_VAULT_RECOVER,               <--  倉曎なし

      trigger:
        <target-CTV-hash> <spend-delay> 
        OP_CHECKSEQUENCEVERIFY OP_DROP OP_CHECKTEMPLATEVERIFY  <-- OP_VAULTのleaf-updateルヌルに埓っお倉曎される
       ... [ possibly other leaves ]
     }
   ),                                                               

   [ 元のVaultアりトプットず同じscriptPubkeyを持぀オプションのRevaultアりトプット],
]

OP_VAULTにより、triggerリヌフがタむムロックされたCTVスクリプトにTaptreeを倉換でき、 これにより発衚された匕き出しが実際に容易になる。recoverリヌフは元のTaptreeから正確に保存されるため、 匕き出しはリカバリヌパスによっお䞭断できる。

CTVハッシュは、witnessスタックを䜿甚しお支払時に指定され、アりトプット内でその存圚を怜蚌する OP_VAULTの䜿甚ルヌルによっおロックむンされるこずに泚意。

Vaultの資金は、recoverリヌフを䜿甚したスクリプトパスの䜿甚により、 タむムロックされたCTVスクリプトの䜿甚前にい぀でもリカバリヌできる。

リカバリヌの認可

Vaultを蚭定する際、ナヌザヌはrecoverリヌフ内のOP_VAULT_RECOVER呜什の前に付加されるスクリプトの断片によっお リカバリヌプロセスを制埡するかどうか決める必芁がある。この䜿甚にはトレヌドオフが䌎う。

未認可のリカバリヌ

未認可のリカバリヌは、VaultのOutPointずリカバリヌパスの堎所以倖の远加情報が必芁ないため、Vaultの䜿甚がシンプルになる。 認可は単にリカバリヌパス、぀たり、<recovery-sPK-hash>のプリむメヌゞを明らかにするだけ。

ただし、この公開は、Vaultコむンをリカバリヌするために必芁な唯䞀の認可であるため、 芳察者はOutPointを知っおいればこのリカバリヌをリプレむできるため、 ナヌザヌはそのようなVaultを䞀床にリカバリヌするこずを期埅する必芁がある。

さらに、耇数の異なるリカバリヌパスにわたる未認可のリカバリヌを同じトランザクションで実行するこずはできず、 手数料制埡はより制限される。これは、未認可のリカバリヌに察しおアりトプットの構造が制限されおいるため、 手数料管理は、手数料に䜿甚されるむンプットたたはオプションの゚フェメラルアンカヌやパッケヌゞリレヌの䜿甚に䟝存する。

これらの制限はPinning攻撃を回避するためのもの。

認可されたリカバリヌ

認可されたリカバリヌでは、結ヌザヌは远加情報、 ぀たりリカバリヌが必芁なずきにリカバリヌ認可スクリプトの断片を解決する方法を蚘録しおおく必芁がある。

この鍵を玛倱するず、ナヌザヌはコむンのリカバリヌプロセスを開始できなくなる。 攻撃者がリカバリヌ鍵を入手した堎合、䜎手数料率のリカバリヌトランザクションを構築しブロヌドキャストするこずで、 リカバリヌプロセス䞭にナヌザヌを邪魔する可胜性があるただし、リカバリヌトランザクションには 眮換可胜性芁件があるため、Pinningするこずはできない。

ただし、認可されたリカバリヌの蚭定には倧きな利点がある。 互換性のないリカバリヌパラメヌタヌを持぀Vaultのバッチリカバリヌが可胜になる。 認可されたリカバリヌトランザクションは、自由圢匏であり、手数料を凊理するために無関係なむンプットずアりトプットを远加できるため、 手数料管理ははるかに柔軟になる。

掚奚シンプルな、オフラむンリカバリヌ認可鍵シヌドを䜿甚する

認可されたリカバリヌが提䟛するバッチ凊理ず手数料管理の利点はずおも倧きい。 リカバリヌ認可鍵が攻撃者の手に枡った堎合でも、臎呜的な結果にはならないが、 ナヌザヌがリカバリヌ認可鍵ずトリガヌ鍵を玛倱した堎合は、コむンの損倱が発生する可胜性がある。 したがっお、䜜成者は、オフラむンで曞き留めお、耇補できる単玔なシヌドをリカバリヌ認可鍵に䜿甚するこずを掚奚する。

リカバリヌ認蚌鍵は、リカバリヌパス鍵ではない。これはリカバリヌパス鍵自䜓の粟補方法に関する掚奚事項ずは倧きく異なるこずに泚意。

アドレスの再利甚ずリカバリヌ

Vaultを䜜成する際、4぀のファクタヌが生成されるP2TRアドレスに圱響する

  1. 内郚鍵リカバリヌりォレットにある可胜性がある
  2. リカバリヌリヌフ
  3. トリガヌリヌフ
  4. Taptree内に存圚するその他のリヌフ

゚ンドナヌザヌは、トリガヌ認可公開鍵などの鍵管理に圱響を䞎えるこずなくVaultアドレスの再利甚を避けるために、 ディスクリプタヌに沿っお特定の内容を倉曎する倉曎する遞択肢を持っおいる。

未認可のリカバリヌを䜿甚する堎合、リカバリヌのscriptPubKeyの公開により、 VaultのOutPointを芋぀けるこずができれば、芳察者はリカバリヌパラメヌタヌが䞀臎するVaultのリカバリヌプロセスを開始できるこずに泚意しおほしい。 その結果、同䞀の未認可の<recovery-sPK-hash>を共有するすべおのアりトプットが䞀緒にリカバリヌされるこずを期埅するこずを掚奚する。

この状況は、単䞀のディスクリプタヌに沿った各VaultのリカバリヌscriptPubKeyの生成を倉曎するこずで回避できるが、 これにより、耇数の個別のVaultを単䞀のリカバリヌアりトプットにリカバリヌできなくなるこずに泚意しおほしい。

内郚鍵を倉曎するず、耇数のVaultむンプットのトリガヌを単䞀のトリガヌアりトプットにバッチ凊理するこずができなくなる。 したがっお、アドレスの再利甚が望たしくない堎合は、代わりにtrigger leafスクリプトの䞀郚の内容を倉曎するこずを掚奚する。 ナヌザヌはディスクリプタヌに沿っおトリガヌ公開鍵を倉曎し、リカバリヌパスず内郚公開鍵を同じに保぀こずができ、 これによりアドレスの再利甚が回避され、トリガヌおよびリカバリヌ操䜜のバッチ凊理が可胜になる。

掚奚: 新しいトリガヌ鍵甚に新しいリカバリヌアドレスを生成する

未認可のリカバリヌを䜿甚する堎合、個別のトリガヌ鍵間でリカバリヌのscriptPubkeyを共有しないこずを掚奚する。 1぀のトリガヌ鍵が䟵害されるず、そのトリガヌ鍵を䜿甚するすべおのVaultの未認可のリカバリヌをする必芁gああり、 これによりリカバリヌパスのプリむメヌゞが明らかになる。これは芳察者が䟵害されおいないトリガヌ鍵によっお制埡されおいる Vaultのリカバリヌを開始できる可胜性があるこずを意味する。

手数料管理

手数料はさたざたな方法で管理できるが、トリガヌトランザクションずリカバリヌトランザクションの䞡方で Vaultむンプットの合蚈倀を保持する必芁があるので、Vaultに保管された資金を手数料の支払いに再利甚できないこずに泚意しおほしい。 これは、任意の金額を割り圓おるこずが可胜な匕き出しトランザクションには適甚されない。

リカバリヌ認可を䜿甚するVaultの堎合、すべおのトランザクションは無関係のむンプットずアりトプットずいう圢で 独自の手数料を蚭ける可胜性がある。これらのトランザクションは関連するリレヌポリシヌが展開されるず、 ゚フェメラルアンカヌを自由に指定するこずもできる。これは、リカバリヌ認可を䜿甚するVaultがv3リレヌポリシヌの展開に䟝存しないこずを意味する。

未認可のリカバリヌを䜿甚するVaultの堎合、リカバリヌトランザクションはむンプットをすべお手数料ずしお䜿甚するか、 ゚フェメラルアンカヌアりトプットの䜿甚に䟝存する。これは、 リカバリヌ認可を䜿甚しないVaultは基本的に、展開されるv3リレヌポリシヌに䟝存しおいるこずを意味する。

バッチ凊理

トリガヌ䞭

同じTaptreeを持぀OP_VAULTアりトプットは、わずかにトリガヌのリヌフが異なるこずを陀けば、 同じ匕き出しプロセスで䞀緒にバッチ凊理できる。2぀のトリガヌリヌフは、同じOP_VAULT匕数を持぀堎合、互換性がある。

これにより、バッチ凊理を可胜にしながら、トリガヌの認可OP_VAULT呌び出しの前に付䞎されるスクリプトを 倉曎できるこずに泚意しおほしい。

各セットに適切な関連triggerOutアりトプットがある堎合、 トリガヌトランザクションは耇数の互換性のないOP_VAULTむンプットのセットで動䜜できる。

SIGHASH_DEFAULTは、トリガヌ認可に䜿甚できるため、無関係のむンプットずアりトプットを含めるこずができ、 おそらく手数料管理や互換性のないVaultのバッチ匕き出しを容易にするこずができる。vaults.

匕き出し䞭

最埌の匕き出し䞭、同䞀の<target-CTV-hash>パラメヌタヌを共有する堎合、 同じ匕き出しトランザクションで耇数のトリガヌアりトプット䜿甚できる。

リカバリヌ䞭

同じ<recovery-sPK-hash>を持぀OP_VAULT_RECOVERアりトプットは、 同じアりトプットにリカバリヌできる。

認可されたリカバリヌを持぀リカバリヌ非互換Vaultは、<recovery-sPK-hash>によっおグルヌピングされる 各セットに関連付けられたrecoveryOutがある限り、同じトランザクションでリカバリヌできる。 これにより、無関係のリカバリヌで共通の手数料管理を共有できる。

りォッチタワヌ

Vaultの䟡倀は、予期せぬ支払いが起きたずきに所有者に譊告する監芖を導入しおいるかどうかによっお決たる。 これは、自動化やりォッチタワヌぞのトラストにより、さたざたな方法で実行できる。

トラストを最倧にする堎合、りォッチタワヌは保管されおいるすべおのコむンを完党に認識でき、 䜿甚が事前にりォッチタワヌに報告されおいない堎合、リカバリヌプロセスを開始できる手段を持っおいる。

トラストを最小にする堎合、ナヌザヌは監芖したいコむンの確率フィルタヌを提䟛できる。 りォッチタワヌは、フィルタヌに䞀臎するコむンが移動した堎合にナヌザヌに譊告する。 ナヌザヌは誀怜知を無芖しおリカバリヌの開始を凊理する責任がある。

アりトプットディスクリプタヌ

Vault関連のアりトプット甚のアりトプットディスクリプタヌは、埌続のBIPでカバヌされるだろう。

展開

アクティベヌトの仕組みはこれから決定される。

Vaultを最倧限に掻甚できるようにするには、このBIPをBIP-119ず同時に展開する必芁がある。

埌方互換性

OP_VAULTずOP_VAULT_RECOVERは、それぞれwitness v1のopcode OP_SUCCESS187ずOP_SUCCESS188を より厳栌な怜蚌セマンティクスに眮き換える。したがっお、以前は有効であったこれらのopcodeを䜿甚するスクリプトは、 この倉曎により無効になる。

OP_SUCCESSx opcodeに察するより厳栌な怜蚌セマンティクスは゜フトフォヌクであるため、 既存の゜フトりェアはマむニングずブロック怜蚌を陀きアップグレヌドしなくおも完党に機胜する。

埌方互換性に関する考慮事項は、OP_CHECKLOCKTIMEVERIFYず OP_CHECKSEQUENCEVERIFYの以前の 展開ずよく䌌おいる。

論拠

参照

謝蟞

著者は以䞋を感謝しおいる。

  • AJ TownsずGreg Sandersずの議論においお、提案を改善するための倚数の提案ずアドバむスを提䟛しおもらう
  • Jeremy Rubinからのむンスピレヌション、アドバむス、指導
  • BLずの議論ず掞察
  • John Moffettには、早期のフィヌドバックず再垰的スクリプト評䟡攻撃を実蚌するテストケヌスの提䟛を。
  • Johan Halsethには、抂念的なレビュヌずPinning攻撃に぀いおの指摘を。
  • Pieter Wuilleには実装䞊のアドバむスを。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment