术语表 /挖矿与共识
区块 sigop 限制
- 区块 sigop 限制是什么?
- 区块 sigop 限制将每个比特币区块的签名操作成本上限定为80,000个单位,这是一项验证预算,与4,000,000个权重单位的大小预算分开计算。
规定于 BIP-141。
验证签名需要消耗节点的时间,因此共识规则用单独的预算来计量这项工作,而不是将其计入区块空间。BIP141 将计量上限设为80,000个单位,并将每个传统(legacy)签名操作按四个单位计价,使原先20,000的上限扩大为四倍。普通的单密钥或 Taproot 花费只消耗少量单位,因此对几乎所有转移比特币的人来说,这一上限是感觉不到的。
运作方式
区块 sigop 限制是一个累计总数,节点在连接区块时逐笔交易累加,总数超过80,000的区块无效。
得出这个总数并不需要执行任何脚本:节点只扫描脚本字节并统计操作码,因此即使某个分支中的签名检查在该笔花费中永远不会被执行,也会被全额计入。这种悲观算法是有意为之:节点必须在验证任何内容之前就确认区块的成本在承受范围之内。
三项统计会被相加,它们并不都落在同一笔交易上。传统统计读取交易自身的输入脚本和输出脚本,并乘以四,因此写入 scriptPubKey 的操作由创建输出的一方承担,而不是由日后花费它的一方承担。pay to script hash 统计读取花费输入所揭示的赎回脚本,同样乘以四。见证统计按面值计算:P2WPKH 输入计一个单位,P2WSH 脚本的计费方式与其在 P2SH 下完全相同。
这些扫描之间有一处差异会带来实际的成本。P2SH 和见证的读取采用 BIP141 的折扣规则:OP_CHECKMULTISIG 前面若是 OP_1至 OP_16,则按一至十六次计算,而不是固定的二十次;传统扫描从不适用这一规则。裸的三选二多重签名输出按全部二十次操作计费,即八十个预算单位,并且在创建时计费。
Tapscript 则完全不在这一预算之内。BIP342 将 tapscript 签名操作移出了全区块范围的80,000,并为每个脚本设定了各自的额度:50个单位,加上该输入见证的序列化大小,每当执行一个附带真实签名的签名操作码,就扣减50。五十来自四百万权重单位除以八万个 sigop,即两个上限之间的比值。
在哪里会遇到它
中继策略在共识规则之前很早就会触及区块 sigop 限制,原因是 Bitcoin Core 中有三个比网络规则更严格的常量。
单笔交易占用的份额不得超过区块预算的五分之一,即16,000个单位。标准的 pay to script hash 输入所揭示的赎回脚本最多只能包含15个签名操作。第三项统计读取非见证操作实际可能被执行的位置,而不是它们所在的位置,当每笔交易超过2,500时停止中继;它读取的是被花费的 scriptPubKey,而全区块统计在创建时已经将其计入。
该限制也会影响您支付的手续费。Bitcoin Core 的 bytespersigop 设置默认为20,它将交易的权重替换为其实际权重与其 sigop 成本乘以二十这两者中的较大值,因此相对于其大小包含大量签名操作的交易,会被按比其实际更大的体量计价。创建裸多重签名输出是触发这一情况的常见方式。
矿工遇到的是与权重并列的第二项约束,BIP342 将此作为移除 tapscript 的理由:两个上限使区块构建比只有一个上限时更困难。Core 在填充区块模板之前,会为 coinbase 输出预留400个单位。
区块 sigop 限制 vs 区块权重
区块权重计量的是数据,区块 sigop 限制计量的是验证工作,区块一旦触及其中任何一个上限就算已满。普通区块最先触及的是权重上限,因为 P2WPKH 输入只消耗一个单位,而 Taproot 花费完全不增加单位,所以只有装满旧式脚本的区块,才会由 sigop 预算决定结果。将一个上限除以另一个上限,得到每个签名操作对应50个权重单位,BIP342 沿用这一比值为 tapscript 预算定价,它也是协议中最接近字节与签名检查之间汇率的东西。