跳转到正文
buybitcoinsmart

术语表 /挖矿与共识

区块 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 预算定价,它也是协议中最接近字节与签名检查之间汇率的东西。

请勿混淆

常见问题

区块 sigop 限制为什么是80,000?

因为 BIP141 是对旧规则按比例重新缩放,而不是取而代之。隔离见证(SegWit)之前的上限是每个区块20,000个签名操作,BIP141 将计数和上限都乘以四,使由传统脚本构成的区块面对的约束与此前完全相同,这也是该变更能够以软分叉方式上线的原因之一。

Taproot 花费是否计入区块 sigop 限制?

不计入。BIP342 将 tapscript 签名操作移出了全区块范围的80,000,并改为为每个脚本设定各自的预算:50,加上该输入见证的序列化大小,每当执行一个附带非空签名的签名操作码,就扣减50。

区块 sigop 限制会影响我转移比特币所支付的费用吗?

仅当您的交易相对其大小而言签名异常密集时才会如此,对大多数人来说,这指的是创建裸多重签名输出,而不是花费这类输出。Bitcoin Core 的 bytespersigop 值为20,它将一笔交易的计费大小取为其实际权重与其 sigop 成本乘以20之积中的较大者,因此普通的单密钥或 Taproot 花费不受影响。

花费旧的多重签名输出会占用区块 sigop 额度吗?

仅当该输出被包装在脚本哈希中时才会占用。pay-to-script-hash 赎回脚本或 P2WSH 见证脚本中的 sigop 计入花费它们的那笔交易,而直接位于裸多重签名 scriptPubKey 中的 sigop 已经计入创建该输出的交易,因此花费这类输出不会增加额度占用。

接着阅读

相关术语

挖矿与共识中的更多术语

阅读本页英文版