激活前任何人都可以使用 Pay-to-Taproot 输出

2021-07-24 07:17:01

在致力于对 transactionfee.info 的主根支持进行工作时,很明显主网上已经存在一些 Pay-to-Taproot (P2TR) 输出。任何人都可以使用这些输出,但它们是非标准的,因此无法在比特币中的节点之间进行中继点对点网络。但是,矿池可以在其区块中包含非标准交易。我们涵盖了主网上已经存在的六个 P2TR 输出,并解释了为什么任何人都可以在主根激活之前使用这些输出。在 f2pool.com 矿池的帮助下,四个 P2TR 输出被捐赠给 brink.dev,一家专注于支持开源比特币开发的非营利公司。 Taproot 是对比特币协议的软分叉升级,并收紧了共识规则。软分叉一旦激活就会禁止之前允许的东西。 Taproot 限制了原生 SegWit 输出的使用方式,witnessversion 为 1 和一个 32 字节的见证程序。其他见证版本、嵌套隔离见证和原生隔离见证输出的支出规则,其见证版本为 1,但更长或更短的见证程序不受影响。虽然可以在主根激活之前创建 P2TR 输出,但不建议这样做。同样,钱包不应该在激活前生成 P2TR 地址。尽管如此,在撰写本文时,比特币主网上已经有六个 P2TR 输出。第一个 P2TR 输出是在 2019 年 12 月 17 日在来自 purse.io 的提款交易中创建的。 Matthew Zipkin 向见证版本 1 bech32 地址发起了 5431 sat 的提款,以测试发送对见证版本 1 的支持。他将他的测试结果添加到比特币 OptechCompatibility Matrix 中,并提供了一张显示在 thepurse.io 前端提款的屏幕截图。地址中编码的公钥是 010 10101 01010101 010 101010101010 10 10 101010101 0101010101 0 101010 101,这很可能不是由私钥生成的。假设这个公钥的私钥是未知的,一旦主根激活,资金将无法使用。第二个 P2TR 输出创建于 2020 年 1 月 28 日。值为 700sat,接近默认的 SegWit 灰尘阈值 294 sat。此输出的创建者未知。第三个、第四个和第五个 P2TR 输出是在检查发送支持到 Pieter Wuille 于 2020 年 10 月 19 日发布到比特币开发邮件列表的见证 v1 bech32 地址时创建的测试输出。第三个 P2TR 输出的值为 3656 sat 和由 Riccardo Casatta 使用 Blockstream Aqua 钱包创建。价值 50.000 sat 的第四个 P2TR 输出很可能是 Mike Schmidt 使用 BRD 钱包创建的。不知道是谁创建了第五个 P2TR 输出,值为 100.000 sat。第六个 P2TR 输出,值为 1324 sat,创建于 2021 年 7 月 7 日。它是在 2021 年 6 月 13 日锁定主根后创建的唯一 P2TR 输出。其他 P2TR 输出是在尚不清楚主根何时或是否会被创建时创建的启用。

在主根激活之前,任何人都可以使用这六个 P2TR 输出。然而,这些 P2TR 输出还没有被花费,因为支出交易目前被认为是非标准的。非标准交易不会在比特币网络上中继。在接受交易到内存池之前,比特币核心会在 AreInputsStandard 函数中检查每个输入的标准性。如果花费的 UTXO 是 P2TR 输出,则该函数当前返回 false,表明交易具有非标准输入。节点不接受对其内存池的交易,并且不会将其转发给对等方。但是,当直接包含在一个区块中时,非标准交易仍然有效。在其他检查旁边,交易必须通过脚本验证。不检查标准。在 Bitcoin Core 中,VerifyScript 函数负责脚本验证。 SegWit 花费的脚本验证包括两部分:脚本评估和见证程序的验证。在脚本评估期间,首先评估 scriptSig。在从输入中引用的 UTXO 评估 scriptPubKey 时,结果堆栈用作初始堆栈状态。如果脚本评估完成且没有失败,堆栈不为空,并且堆栈顶部元素转换为真(不为零),则脚本评估成功。当使用原生 SegWit 输出(例如 P2TRoutputs)时,scriptSig 为空。 scriptPubKey 包含witnessversion 和witness 程序。由于 scriptSig 为空,因此使用空堆栈进行 scriptPubKey 评估。在那里,见证版本和见证程序被压入堆栈。脚本评估完成。由于堆栈不为空并且堆栈顶部元素是见证程序(通常不为零),脚本评估将成功。这种行为使 SegWit 成为软分叉。隔离见证交易对不支持隔离见证的节点有效,因为栈顶元素不为空。一旦主根激活,关键路径 P2TR 支出将是有效和标准的。任何人都可以支出的 P2TR 支出可能有一个空的见证人,但其他方面看起来是一样的。下一步,如果见证版本已知,则验证见证程序。如果见证版本未知,则将见证程序视为有效 1.在验证版本 1 见证程序期间(即当花费 P2TR 输出时)的第一个检查) 是如果设置了 SCRIPT_VERIFY_TAPROOT 脚本验证标志。如果未设置,则在检查见证程序之前验证成功。此标志仅在主根处于活动状态时设置。这导致主根输出在激活之前是任何人都可以使用的。见证程序未经过验证,见证可以留空。我们通过构建一个共识有效的非标准交易来证明在主根软分叉激活之前 P2TR 输出的支出。矿池 f2pool.com 通过在区块中包含非标准交易来提供帮助。对于我们的交易,我们从前面讨论的六个可用输出中选择第一个、第三个、第四个和第五个 P2TR 输出。值为 5.431 sat 的第一个输出在主根激活时将无法使用,否则将永远保留在 UTXO 集中。第三个(3.656 sat)、第四个(50.000 sat)和第五个(100.000 sat)P2TR 输出在测试交易中发送,知道资金很可能会丢失或捐赠给慈善机构。这使我们总共可以花费 159.087 sat。我们将另外两个 P2TR 输出(700 sat 和 1.324 sat)留给其他人在激活之前或之后使用。

我们的交易包含两个输出。第一个输出将全部输入量 159.087 sat(在撰写本文时约为 50 美元)捐赠给 brink.dev,以支持开源比特币开发。交易故意不支付矿工费以最大化捐赠金额。第二个输出是一个 OP_RETURN 输出,带有指向此博客文章的链接。这使得找到任何人都可以花费的交易的人有可能更多地了解为什么在 Taproot 激活之前 P2TR 输出是可以花费的。 { “TxID添加”: “b10c007c60e14f9d087e0291d4d0c7869697c6681d979c6639dbd960792b4d41”, “散列”: “b10c007c60e14f9d087e0291d4d0c7869697c6681d979c6639dbd960792b4d41”, “版本”:1, “大小”:234, “VSIZE”:234, “重量”:936, “LOCKTIME”:45324, “VIN” : [ { "txid" : "b53e3bc5edbb41b34a963ecf67eb045266cf841cab73a780940ce6845377f141", "vout" : 0, "scriptSig" : { "asm," 7", "16", "16", "7", "4 b48a59fa9e036e997ba733904f631b1a64f5274be646698e49fd542141ca9404" , “VOUT”:0 “scriptSig”:{ “ASM”: “”, “六角”: “”}, “序列”:45324},{ “TxID添加”: “7641c08f4bd299abfef26dcc6b477938f4a6c2eed2f224d1f5c1c86b4e09739d”, “VOUT”:1 , "scriptSig" : { "asm" : "" , "hex" : "" }, "sequence" : 45324 }, { "txid" : "fd43650477e0ba6825ae0482a8b0b2b509d5443fa2a87127s"{ig2a87271ds",scripta87s, dd0as ", sig2a87271d" " : "" , "hex" : "" }, "sequence" : 45324 }], "vout" : [ { "value" : 0.00159087, "n" : 0, "scriptPubKey" : { "asm" : "OP_HASH160 fb94f9a556bae3f98f44186e1c caa4f5ff6a3187 OP_EQUAL”, “六角”: “a914fb94f9a556bae3f98f44186e1ccaa4f5ff6a318787”, “reqSigs”:1, “类型”: “scripthash”, “地址”:[ “3QdFzfpU3u92GeRN4U5pLLezbBaHbj2ppr”]}},{ “值”:0.00000000中, “n”:1 “scriptPubKey”:{ “ASM”: “OP_RETURN 68747470733a2f2f623130632e6d652f37”, “六角”: “6a1168747470733a2f2f623130632e6d652f37”, “类型”: “nulldata”}}]}当在块709632直根激活,比特币核心v0.21.1和newerwill开始执行主根规则。只有通过为密钥路径花费提供有效签名或满足脚本路径花费的脚本要求,才有可能花费 P2TR。但是,不知道主根软分叉的旧节点将继续将 P2TR 花费视为任何人都可以花费。例如,如果矿池忘记升级并包含来自 P2TR 输出的交易支出,而没有满足网络强制执行的主根规则,这可能会成为一个问题。链将在执行主根的升级节点和未升级节点之间分裂。建议在激活主根之前升级生产和支付处理节点。我要感谢 f2pool.com 的合作。如果没有他们在一个区块中包含非标准交易,将 P2TR 输出捐赠给 brink.dev,将是不可能的。这允许通过未来的软分叉向当前未使用的见证版本引入新规则。见证程序验证在不知道软分叉的节点上成功。 ↩︎