术语表 /协议与升级
见证承诺
- 见证承诺是什么?
- 见证承诺是 coinbase 交易某个输出中的一个32字节哈希,它把区块中每个 wtxid 纳入区块头已有的默克尔树。
规定于 BIP-141。
隔离见证需要在不改动区块头的前提下记录第二个默克尔根,BIP-141把它放在 coinbase 的一个输出中,使这一改动得以作为软分叉发布。该脚本长度必须至少为38字节,并以0x6a24aa21a9ed 开头。该承诺把授权您的比特币的签名与挖出这些比特币的区块绑定在一起,因为 txid 在构造上不包含见证数据。
运作方式
BIP-141把见证承诺规定到了操作码一级,节点在接受区块之前会重新计算该值。
节点基于区块构建第二棵默克尔树,以 wtxid 代替 txid 作为叶节点,并按区块头自身那棵树的构建方式进行组合。coinbase 交易自身的叶节点并不是它真实的 wtxid:BIP-141假定该值为32个零字节,因为被计算的数值就位于这笔交易之内,而任何东西都无法对自身求哈希。写入该输出的内容,是见证根哈希与一个32字节见证保留值拼接后的双重 SHA-256,而该保留值必须作为唯一一项出现在 coinbase 输入自身的见证字段中。
逐字节来看,该输出脚本依次为:1个字节的 OP_RETURN(0x6a),1个字节表示压入后续的36个字节(0x24),4个字节的承诺头(0xaa21a9ed),然后是32字节哈希。这些加起来共38字节,从第39个字节起的内容是可选数据,没有共识含义。
有两条边界规则防止该模式被操纵或被过度套用。当多个输出都匹配时,以输出索引最高的那个为准,因此放在前面的诱饵无法取代真实的值。而当区块中没有任何交易携带见证数据时,该承诺是可选的。这一规则通过 BIP9 版本位以 segwit 之名在第1位上发布,主网的信号窗口从 UTC 2016年11月15日零点至 UTC 2017年11月15日零点。
在哪里会遇到它
在区块浏览器中,见证承诺表现为 coinbase 交易的一个输出,其脚本以 OP_RETURN 开头。
打开任意一个近期区块的第一笔交易,输出分为两类:一类支付给矿池及其客户,另一类的脚本十六进制以6a24aa21a9ed 开头。该前缀之后的32个字节就是承诺本身,前38个字节之后的部分则是可自由使用的空间。
挖矿软件比其他任何人都更常遇到这个字段。该值是对区块中每个 wtxid 的哈希,因此每当候选交易集发生变化就必须重新计算,并在对区块头求哈希之前写回 coinbase。
保留值是值得留意的部分。BIP-141目前没有赋予它共识含义,而是有意将其保留,以便未来的软分叉可以先把新值与保留值一起求哈希,从而把新的承诺嵌套在现有承诺之内。该文件禁止合并挖矿等非共识用途占用这一空间,并指明了保留它的用途:针对手续费的求和树、区块大小和 sigops 的计数器,以及指向交易花费输出的反向链接。这些加在一起,将使轻客户端得到的是区块无效的简短证明,而不是区块本身。
见证承诺 vs 默克尔根
见证承诺和默克尔根是两棵不同的树的根,其中只有一个在区块头中占有位置。
默克尔根是区块头字段,其叶节点是 txid,而 txid 在构造上不包含见证数据。见证承诺位于交易输出中,其叶节点是包含这些数据的 wtxid,且其 coinbase 叶节点被置零。嵌套正是其中的关键。coinbase 交易在较早的那棵树中和其他叶节点一样占有一席,因此修改承诺会改变 coinbase,进而改变区块头的默克尔根,即使对从未了解隔离见证的软件,也会使该区块失效。