阅读 3

Qtum量子链发布全新难度调整算法,QIP-9如何让出块时间更加平稳?


前 言


Qtum 使用 PoS 共识机制,设计平均区块间隔 128 秒。实际网络运行状态显示平均区块间隔约 144 秒且出块时间波动巨大。为了解决这个问题,QIP-9 提出了新的难度调整算法,将平均区块间隔降到平均 128 秒,并通过增大 nPoWTargetTimespan 大大降低区块间隔的波动


另外现有的全网算力估计算法计算结果方差过大,上下波动可达 40%,用户难以获得较准确的全网算力数据。QIP-9 通过固定原先算法中分母的取值显著减小计算结果的方差,使得估计的挖矿收益率更为准确


QIP-9 难度调整算法


1.Qtum 难度调整算法分析


QIP-9 难度调整算法的核心改动在[1]与[2]。改动有两处:

  1. 将难度调整算法由线性型改为指数型;

  2. 将 nPoWTargetTimespan 从 960 改变为 4000。


对于包含 coins 个币的 UTXO,它挖出一个区块的条件是

Hash(kernel)<coins×THash(kernel)<coins×

T
,其中
T
是挖矿目标。结合 Qtum 难度调整算法公式[1]下一个区块挖矿目标 Tn+1与当前区块挖矿目标 Tn 的关系,即挖矿难度调整算法可以化简为


硬分叉前:


硬分叉后:


其中tn 是当前区块的区块间隔,

α=64⋅(⌊nPoWTargetTimespan/128⌋+1)α=64⋅(⌊nPoWTargetTimespan/128⌋+1) 是调整系数。如果当前区块间隔大于 128 秒,下一区块的挖矿目标增大,难度减小,以此达到稳定区块间隔的效果,反之亦然。通过改变 α 的大小可以改变难度调整的幅度,调整幅度越大会导致挖矿难度变化越大,那么区块间隔波动也会相应变大。通过计算可知硬分叉前 α=512, 分叉后 α=2048


截止区块高度 390000,Qtum 主网所有 PoS 区块间隔平均值 144.22 秒,标准差 152.95 秒。而理想状态(区块间隔服从期望值 128 秒的几何分布)下,区块间隔 128 秒,标准差 119.73 秒。可见实际运行结果中区块间隔平均值与标准差远远大于设计值。这是由于难度调整算法不合适以及参数 α=512 过小导致。


2.QIP-9 对难度调整算法的改动


从难度调整算法公式不难看出,增大 α 的值可以减小挖矿难度的变化,区块间隔波动也会相应减小。我们模拟了两种算法在取不同的 α 值时对区块间隔平均值、标准差以及大间隔(出块时间超过 10 分钟)的区块数量的影响,得到以下数据:

可见 QIP-9 指数型调整算法对线性型调整算法在各项数据上表现都更好,它在平均区块间隔数据上十分接近设计值 128 秒是其正确性的体现。由上述表格的数据可知,当 α≥2000 时,各项指标变化已经比较缓慢,并且区块间隔标准差与大间隔区块占比已经很接近理想值。所以 QIP-9 的难度调整算法是合理的。


QIP-9 全网算力估计


1.全网算力估计算法介绍


定义全网算力为全网所有挖矿的币的总量。对于区块 n,记dn为其难度值,tn为其区块间隔, Wn 为其全网算力。由共识算法可以计算得:

我们对上述公式取最近 72 个区块的平均值:

上述公式就是原先的全网算力估计算法,取平均可以看做是对估计的光滑处理。QIP-9 提出了一种新的估计算法:


它将分母上的区块间隔替换为设计平均值 128,下面我们将用模拟来对比两种算法的效果。


2.全网算力估计算法对比


我们分别对新老算力估计算法进行模拟,第一张图代表难度调整算法修改前的模拟结果,第二张图代表难度调整算法修改后的模拟结果:


可以发现难度调整算法修改前即 α 较小时,两种算力估计算法的模拟结果大致相同,α 更小时 QIP-9 提出的全网算力估计的方差比原算法更大。当难度调整算法修改后即 α 较大时,新的全网算力估计曲线更光滑且方差更小,在实际算力波动较小的现实条件下是更优的算法。所以硬分叉后,QIP-9 提出的全网算力估计算法比原算法更优。


QIP-9 硬分叉升级带来的影响


QIP-9 将带来最显著的变化是平均区块间隔从 144.7 秒缩短为 128.0 秒,平均每天产生的区块数从 597 个大幅增加为 675 个。另外平均区块间隔的减小使得挖矿年收益率增加 13.0% (例如 7% → 7.91%),挖矿收益率有显著增加。


由于 QIP-9 带来共识的改变仅限于难度调整算法,对链上的交易只有在计算 lockTime 时间戳时需要注意。对于普通用户,只需及时升级钱包即可保证正常使用。


参考文献

[1] https://github.com/qtumproject/qtum/blob/733061a2b54d4d50365b07e9b48a9a8d455eadd6/src/pow.cpp#L109-L122

[2] https://github.com/qtumproject/qtum/blob/733061a2b54d4d50365b07e9b48a9a8d455eadd6/src/chainparams.cpp#L96



关注下面的标签,发现更多相似文章
评论