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ïŒãšçµã¿åãããããšã§ã
ãŠãŒã¶ãŒã¯äºåã«æå®ããããªã«ããªãŒãã¹ãé€ããæå®ãããã³ã€ã³ãä»»æã®å®å
ã«äœ¿çšãããåã«é
å»¶æéã匷å¶ããããšãã§ããã
ãã®ææžã®ã©ã€ã»ã³ã¹ã¯3æ¡é BSDã©ã€ã»ã³ã¹
Bitcoinãä¿ç®¡ããéã®å±éºæ§ã¯ããç¥ãããŠãããBitcoinã®ãŠãŒã¶ãŒã¯ãç§å¯éµãä¿è·ããããã«å€å€§ãªåªåãæãå¿ èŠãããã äžåºŠããããžã§ãã³ã°ãããä¿ç®¡ã·ã¹ãã ããé²åãç¶ããç¶ç¶çãªè åšã«å±ããªãããšãæãã äŸµå®³ãæ€åºãããå ŽåããŠãŒã¶ãŒã«ã¯ä»å ¥ããææ®µãã»ãšãã©ãªãããã®ææ¡ã§ã¯ã éµã®äŸµå®³ã«ããææªã®çµæã§ããã³ã€ã³ã®æå€±ãå€§å¹ ã«è»œæžããä»çµã¿ãå°å ¥ãããŠããã
äºæãã¬æ¯æãã«ä»å ¥ããæ¹æ³ãå°å ¥ããããšã§ããŠãŒã¶ãŒã¯å®å šæ§ã®é«ãéµã®ä¿ç®¡æ¹æ³ãã ææªã®å Žåã«ããè¡äœ¿ãããªããããªïŒãã以å€ã®å Žåã ãšæ³å€ãªïŒã éåžžãšã¯ç°ãªããã©ãŒã«ããã¯æŠç¥ãåãå ¥ããããšãã§ããããã®ææ¡ã®ç®æšã¯ã ãã®æŠç¥ãæå°éã®è€éãã§ããããèŠæš¡ã®ç®¡çè ã«äœ¿çšã§ããããã«ããããšã
å人ãBitcoinã管çããå Žåã®äžè¬çãªæ§æã¯ãããŒããŠã§ã¢ãŠã©ã¬ããã䜿çšãããã·ã³ã°ã«ã·ã°ãšãã¹ãã¬ãŒãºã«ãªãã ãã®ãããªæ§æã䜿çšãããŠãŒã¶ãŒã¯ãããŒããŠã§ã¢ãžã®ç©ççãªã¢ã¯ã»ã¹ã ãã§ãªãã éµã®ç®¡çãåäžã®ã¡ãŒã«ãŒã«äŸåããããšã«äŒŽããªã¹ã¯ãæžå¿µããå¯èœæ§ãããã
ãã®ãããªå人ã¯ãOP_VAULTã䜿çšããŠãå¯èœæ§ã®äœããªã«ããªãŒãã¹ãšããŠéåžžã«å®å
šãªéµãå©çšãããšåæã«ã
äŸãã°äœ¿çšããéã«1æ¥ã®é
å»¶æéãèšå®ããåŒãåºãçšã®ããªã¬ãŒéµã§æ¢åã®çœ²åæé ãå®è¡ã§ããããã«ããã
ãªã«ããªãŒãã¹ã®éµã¯æ§è³ªäžãéåžžã«å®å šãªãã®ã§ããå¿ èŠããããããæ¥åžžã®äœ¿çšã«ã¯åããªãå¯èœæ§ããããäŸãã°ã éµã¯äœããã®ã¢ããã°æ¹åŒã§çæãããããšãããã°ãïŒãã®åŸç Žæ£ãããïŒå€ãã³ã³ãã¥ãŒã¿ãŒã§çæããã ç§å¯éµã¯çŽã®åœ¢åŒã§ã®ã¿è€è£œãããããããã¯ãéµã¯ç°ãªãã¡ãŒã«ãŒã®ããã€ã¹ã䜿çšãã2-of-3ã®ãã«ãã·ã°ã§ããå¯èœæ§ãããã ããããéµã¯å°ççãŸãã¯ç€ŸäŒçã«åæ£ãããŠããã
ä»»æã®Bitcoinã¹ã¯ãªããããªã·ãŒã䜿çšã§ããããããªã«ããªãŒéµã«ã¯å€ãã®äœ¿çšæ¡ä»¶ãå«ããããšãã§ãããããšãã°ã å®å šæ§ã®é«ãéµã®å®å šæ§ãé«ããªããããå Žåã«åããŠãæéé å»¶ã®ãããããç°¡åãªããªã«ããªãŒæ¹æ³ãåããã
ãŠãŒã¶ãŒã¯ã¢ãã€ã«ããã€ã¹äžã§ãVaultã®Outpointã®äœ¿çšããããã¯ãã§ãŒã³ã§ç£èŠãããœãããŠã§ã¢ãå®è¡ã§ããã ããVaultã«é ããã³ã€ã³ããäºæããªãæ¹æ³ã§ç§»åãããå ŽåããŠãŒã¶ãŒã¯ããã«ãªã«ããªãŒãã¹ã«ããããåŒãäžããããšãã§ãããã æ¥åžžçã«ã³ã€ã³ã䜿çšããããšã¯ïŒäœ¿çšã®ããã®é å»¶ãé€ãã°ïŒä¿ç®¡åãšåæ§ã«æ©èœããã
Bitcoinã®æ©é¢ç®¡çè ãåæ§ã®æ¹æ³ã§Vaultã䜿çšããå¯èœæ§ãããã
ãã®ææ¡ã¯$5ã¬ã³ãæ»æãç·©åãããã®ã ã 䜿çšå¯èœã«ãªããŸã§ã®é å»¶ãäžé±éã«èšå®ããããé·ãçžå¯Ÿçã¿ã€ã ããã¯ã匷å¶ããã¹ã¯ãªããããªã«ããªãŒãã¹ãšããŠäœ¿çšããããšã§ã Vaultã®ææè ã¯ãã®ã³ã€ã³ã«ããã«ã¢ã¯ã»ã¹ã§ããªãããšã蚌æã§ãããèè ã®ç¥ãéãã ã¿ã€ã ããã¯ãããã³ã€ã³ãæ°žç¶çã«ããŒãªã³ã°ãããããsãã©ã€ã§ãããµãŒãããŒãã£ã«äŸåãããããã«ã ãã®é²åŸ¡ãæ§æããã«ã¯ãããå¯äžã®æ¹æ³ã ã
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ãšçµã¿åããå¯èœã ã
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ãè©äŸ¡ããéãã¹ã¿ãã¯ã®äºæããã圢åŒã¯äžããäžã«ä»¥äžã®ããã«ãªãã
<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_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ã«ãã®ã€ã³ãããã®é以äžã®
- é
å»¶ãã¥ãŒã«å
¥ããŠã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以å€ã®å Žå
- ã€ã³ãããã®nSequenceçªå·ã
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ãäœæããã
ã³ã€ã³ãä¿ç®¡ããã«ã¯ã以äžã®åœ¢åŒã®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ã¯å°æ¥ã®ã¹ã¯ãªããæ©èœã«ã察å¿ã§ããããã«ãªãã
- ããã¯ãããªã¬ãŒã¹ã¯ãªããã®äžäŸã ããä»»æã®ã¹ã¯ãªããã®æçã䜿ã£ãŠæ§ã
ãªã¿ã€ãã®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ã¢ãã¬ã¹ã«åœ±é¿ããïŒ
- å éšéµïŒãªã«ããªãŒãŠã©ã¬ããã«ããå¯èœæ§ãããïŒ
- ãªã«ããªãŒãªãŒã
- ããªã¬ãŒãªãŒã
- 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ã®ä»¥åã® å±éãšãã䌌ãŠããã
- [bitcoin-dev] Bitcoin Vaults (2016)
- [bitcoin-dev] Simple lock/unlock mechanism (2018)
- [bitcoin-dev] On-chain vaults prototype (2020)
- [bitcoin-dev] TAPLEAF_UPDATE_VERIFY covenant opcode (2021)
- Custody Protocols Using Bitcoin Vaults (2020)
- Vaults and Covenants (2023)
èè ã¯ä»¥äžãæè¬ããŠããã
- AJ TownsãšGreg Sandersãšã®è°è«ã«ãããŠãææ¡ãæ¹åããããã®å€æ°ã®ææ¡ãšã¢ããã€ã¹ãæäŸããŠããã
- Jeremy Rubinããã®ã€ã³ã¹ãã¬ãŒã·ã§ã³ãã¢ããã€ã¹ãæå°
- BLãšã®è°è«ãšæŽå¯
- John Moffettã«ã¯ãæ©æã®ãã£ãŒãããã¯ãšååž°çã¹ã¯ãªããè©äŸ¡æ»æãå®èšŒãããã¹ãã±ãŒã¹ã®æäŸãã
- Johan Halsethã«ã¯ãæŠå¿µçãªã¬ãã¥ãŒãšPinningæ»æã«ã€ããŠã®ææãã
- Pieter Wuilleã«ã¯å®è£ äžã®ã¢ããã€ã¹ãã

