术语表 /协议与升级
Speedy Trial
- Speedy Trial 是什么?
- Speedy Trial 是 Taproot 采用的激活方案:矿工在一个较短的信号窗口内表态,门槛降至90%,并将强制执行推迟到之后一个固定的区块高度。
规定于 BIP-341。
Speedy Trial 是对 BIP-9版本位部署的一种修改版,写在 BIP-341本身之中,而没有单独的 BIP。矿工有109天时间,自4月24日至2021年8月11日,在2,016个区块中的1,815个区块里设置第2位,强制执行固定在区块709,632。该强制执行高度在信号窗口开启之前就已确定,因此持有者知道规则变更发生的确切区块。
运作方式
Speedy Trial 沿用 BIP-9的计数方法,修改了其中两个数值,并增加了一个 BIP-9所没有的参数。
BIP-9在每个包含2,016个区块的难度调整周期内统计发出信号的区块,只要某个周期内这类区块数量足够,就将部署从 STARTED 状态转为 LOCKED_IN 状态。其门槛为1,916个区块,即一个周期的95%,其自身对窗口的建议时长为一年,即起始时间之后的31,536,000秒。起始和超时都以过去时间中位数(median time past)为准,即一个区块及其前十个区块时间戳的中位数,因此计时依据的是区块链,而不是任何人的手表。
Taproot 部署将门槛降至1,815个区块,即90%,并将窗口设为9,417,600秒,起止时间戳为纪元时间戳1619222400至1628640000。新增的参数是 min_activation_height。在未经修改的 BIP-9下,已锁定的部署在下一个难度调整周期的边界变为 ACTIVE,因此锁定只能把强制执行高度限定在其后的2,016个区块之内。在 Speedy Trial 下,LOCKED_IN 状态会持续循环,直到区块链达到所规定的高度,然后才转入 ACTIVE。主网的高度为709,632,恰好是352个难度调整周期,因此正好是一个周期的边界。该部署确实在此高度激活。
这种分离正是其核心思路。信号阶段很快回答一个问题,随后的长时间间隔则留给其他所有人升级,而不是用来争论。
在哪里会遇到它
Speedy Trial 的参数可以在2021年信号窗口期间挖出的每个区块的版本字段中看到。
发出信号的区块,其高位为001,再加上该部署自己的位,因此 Taproot 在第2位上的信号读作版本0x20000004。请求工作的矿工通过 getblocktemplate 接触到同一个部署,其 "rules" 键列出已经激活的软分叉,"vbavailable" 键则把每个待定的软分叉对应到其位。BIP-341给该部署起的名称,也就是矿工读到的字符串,就是 "taproot"。
testnet3 上同一部署的运行情况说明了这一延迟的用途。它使用相同的起始和超时时间戳,门槛为1,512个区块,即75%,min_activation_height 为0,因此除了 BIP-9自身的一个周期间隔之外没有推迟任何时间,并在高度2,011,968激活。主网多等了一段时间;测试网络没有需要保护的经济体系。在 signet 上,这些规则始终处于激活状态,因此那里没有进行试验。
Speedy Trial vs UASF
用户激活软分叉(UASF)从节点一侧强制得出结果,而 Speedy Trial 有意放弃了这种权力。
这种强制机制在 BIP-8中以 lockinontimeout 的形式写明。将其设为 true,部署就会在超时之前获得一个 MUST_SIGNAL 周期,在该周期内,一旦允许的未发信号区块配额用完,未发出信号的区块即成为无效区块,从而无论矿工是否配合,都保证锁定。BIP-8建议,凡是预期会遭到相当比例矿工政治性反对的软分叉,都使用该标志,并在同一文件中警告,运行该标志的节点可能在较长时间内跟随一条工作量较低的链,并可能需要优先与彼此建立连接。
Speedy Trial 没有这样的标志。在超时之前未达到门槛,部署就进入 FAILED 状态,别无其他后果,这正是它所作的取舍:不保证激活,没有链分裂的风险,无论结果如何,代价都很低。