跳转到正文
buybitcoinsmart

术语表 /开发者参考

见证脚本

见证脚本是什么?
见证脚本包含 P2WSH 输出的真实花费条件,随见证数据一同传输,其字节按通常成本的四分之一计权。

规定于 BIP-141。

隔离见证(SegWit)为脚本在交易中设立了独立区域,花费 bc1q 保险库时,进入该区域的就是见证脚本。见证数据中的每个字节只计为1个权重单位,而不是4个,即75%的折扣,该折扣于2017年8月在区块481,824生效。这一折扣使多重签名托管不再昂贵。

运作方式

输出中的一个普通 SHA-256哈希承诺了见证脚本,该脚本在有人花费之前一直保密。花费者先用条件所需的参数填充见证栈,再将序列化后的脚本作为最后一项附加上去。节点对这一项做哈希,将所得的32个字节与承诺核对,然后执行刚刚验证过的内容。

共识规则对其适用的脚本上限与传统花费相同:10,000字节的脚本和201条有效指令。转发策略则远低于此,为3,600字节,且栈上不超过100项,因此更大的脚本需要与矿工直接安排,而不能走普通广播。

改变行为的是其中的算术。2-of-2脚本为71字节:两次推入33字节的公钥,两个计数操作码和一个验证操作码。在见证数据中,这71字节的成本为71个权重单位,不到18个虚拟字节。同样的71字节若按旧方式放在签名脚本中,成本为284个权重单位,即71个虚拟字节。安全性没有任何变化,变化的只是使用它的价格。

在哪里会遇到它

闪电网络依赖见证脚本运行。每个通道都注资到一个2-of-2输出中,通道内的承诺交易由 BOLT 3规定的一小批撤销脚本和哈希锁定支付脚本构建而成,这意味着其中大多数脚本被创建和销毁的过程都不会上链。

签名硬件会将它们视为一个有名称的字段。PSBT 格式在输入和输出上都定义了见证脚本字段,因此协调者可以把正在满足的确切条件交给共同签名者,设备也可以向用户显示其同意的内容,而不是一串哈希。

您也会遇到被包装的形式。嵌套的 P2SH-P2WSH 地址常见于从未更新提币界面的交易所,它带有一个34字节的赎回脚本,其唯一作用是指向见证程序,真正起作用的是下面的见证脚本。

备份需要脚本字节,而不仅仅是密钥。请将输出描述符与每个助记词一同保存,因为没有人记录的见证脚本,会让签名齐全的签名阈值变成无人能够动用的比特币。

见证脚本 vs Tapscript

见证脚本是一个完整公开的单一脚本;tapscript 叶子则是树的一个分支,只有您使用的那个分支才会被公布。在 BIP-341下,输出承诺的是覆盖多个叶子的默克尔根,因此一个有五条独立恢复路径的保险库在花费时只显示其中一条,其余四条永远保密。Tapscript 还取消了10,000字节的限制,停用 OP_CHECKMULTISIG,改用便于批量验证的 OP_CHECKSIGADD,并对签名检查采用权重预算,而不是固定的指令数量。如果您的钱包写出的是 bc1q,您用的就是见证脚本;bc1p 则表示采用 Taproot 设计。

请勿混淆

常见问题

如果丢失了见证脚本但保留了所有密钥,会怎么样?

这些比特币将无法花费。输出承诺的是脚本的哈希,任何节点都不会接受无法还原该哈希的花费,因此必须将脚本或记录该脚本的描述符与您的助记词备份一同保存。

见证脚本与 tapscript 叶子是一回事吗?

不是。见证脚本在输出被花费时会被完整公开,而 Taproot 输出承诺的是一棵叶子树,只公开实际使用的分支,其他所有花费路径都保持私密。

相关术语

开发者参考中的更多术语

阅读本页英文版