跳转到正文
buybitcoinsmart

术语表 /协议与升级

见证数据

又称 Witness。

见证数据是什么?
见证数据是 SegWit 交易在单独区域中携带的签名材料,每字节按一个权重单位计,并完全不计入 txid。

规定于 BIP-144。

每个输入都有自己的见证:一个由若干项组成的栈,最常见的是一个签名和一个公钥。该区域位于输出之后,前面有两个字节的标记和标志,用来告知软件该交易采用的是较新的格式。运行2017年升级之前软件的节点从不请求它,也看不到它。

运作方式

见证数据在交易的字节布局中有自己的位置,由 BIP-144定义。

较新格式的序列化交易依次为:版本、标记字节0x00、标志字节0x01、输入、输出,然后是按相同顺序排列的每个输入对应的一个见证栈,最后是 locktime。兼容性的关键就在标记上:在旧解析器看来,值为零意味着零个输入,这是不合理的,因此收到新格式的旧软件会立即知道这并不是发给它的,而旧版对等节点根本不会收到这种格式。

由此产生两种标识符。txid 是对去掉标记、标志和见证之后的交易做双重 SHA-256得到的值,因此见证内部的任何内容都无法改变它。wtxid 则对完整的序列化数据做哈希。每个区块都在一个 coinbase 输出中承诺其 wtxid 的默克尔根,该输出是一个 OP_RETURN,其脚本至少为38字节,并以四字节标签0xaa21a9ed 开头,因此这些数据虽然位于较早的承诺之外,依然受到保护。

折扣体现在成本上。见证之外的内容每字节按四个权重单位计费,见证之内的内容每字节按一个计费,每个区块的上限为4,000,000个权重单位。将权重除以四,即得到虚拟字节,手续费率就是以此为单位报价的。

在哪里会遇到它

在区块浏览器中打开任意一笔交易,大小、虚拟大小和权重会并列显示。当它们不一致时,差值就是见证。没有任何见证的支付,其大小等于 vsize;Taproot 支付的 vsize 可能仅为原始大小的四分之一左右。

在现代区块浏览器中展开单个输入,即可看到栈本身。对于 bc1q 支付,它包含两项:一个约71或72字节的签名,以及一个33字节的压缩公钥;对于 Taproot 密钥路径花费,它只有一项,恰好64字节。这个数量正是较新的输出类型花费成本更低的全部原因。

该字段也出现在您的硬件钱包处理的文件中。部分签名比特币交易的每个输入都有一条见证 UTXO 记录和一条最终见证记录,多重签名交易在收集签名期间,协调器应用来回传递的正是这些内容。

见证数据 vs 见证脚本

见证数据是整个栈;见证脚本是其中的一项。对于 P2WSH 花费,栈中的最后一项是输出所承诺哈希对应的脚本,其前面的所有内容都是为了满足该脚本。这一关系完全沿用了较早的模式,即赎回脚本是 P2SH 签名脚本的最后一项。因此,每个见证脚本都是见证数据,而大多数见证数据,包括每一笔普通的单密钥花费,并不包含任何见证脚本。

请勿混淆

常见问题

为什么我的交易大小与虚拟大小不同?

差值来自见证数据。虚拟大小是权重除以四,而见证字节每字节只计一个权重单位,而不是四个,因此任何花费 SegWit 输入的交易,其虚拟大小都小于原始字节数。

交易确认后,见证数据可以丢弃吗?

打算自行验证历史的节点不能丢弃,因为每个区块都承诺了见证标识符的默克尔根。修剪节点会丢弃各类旧区块数据,但它在此之前已经验证过这些见证。

相关术语

协议与升级中的更多术语

阅读本页英文版