主页 > 下载最新版imtoken钱包 > 【区块链学习笔记】6:比特币挖矿难度调整

【区块链学习笔记】6:比特币挖矿难度调整

下载最新版imtoken钱包 2023-11-16 05:12:59

挖矿难度

挖矿就是不断尝试区块头中nonce和extra nonce的值,这样:

H(blockheader)≤targetH(block\header)\leq targetH(blockheader)≤target

显然,目标阈值越小,越难挖掘。因此,调整挖掘难度就是调整目标,调整目标空间在整个输出空间中的比例。

比特币使用的哈希函数是SHA-256,生成的哈希值是256位,所以整个输出空间是22562^{256}2256。在这个问题中调整目标空间的比例是直观的。看看最终的hash值前面有多少个0(这只是一个通俗直观的观点,可能第一个非0位小于4),0越多,值越小,也就是采矿变得更加困难。

挖掘难度与目标阈值的大小成反比:

难度=difficulty_1_targettargetdifficulty = \frac{difficulty\_1\_target}{target}difficulty=targetdifficulty_1_target​

上式中的常数difficult_1_target是指当挖矿难度定义为1时,目标阈值target的值。最小挖矿难度为1,所以这个常数是目标允许的最大值。

为什么要调整挖矿难度?

系统中的总计算能力越来越强。如果挖矿难度保持不变,平均出块时间会越来越短,会造成一些问题。

假设平均出块时间减少到 1 秒,即每隔 1 秒左右,在比特币网络上发布一个包含一系列交易的新区块,而在比特币网络上,这个区块传播到大大多数节点可能需要几十秒。如果两个节点几乎同时发布块,就会发生分叉:

在这里插入图片描述

这是一种二叉分叉的情况,如果出块时间很短,就会导致这种分叉成为常态。而且不只是两个叉子,可能有很多叉子。

分叉过多不利于比特币系统达成共识,会危及比特币系统的安全。比如上面提到的分叉攻击,在正常情况下,由于大部分节点都是诚实的,恶意节点想要利用这段时间中心化算力计算出来的新链,在6次确认后覆盖最长的合法链。上链很困难,因为诚实的节点也将他们的计算能力集中在扩展最长的合法链上。如果出块时间很短,会导致分叉太多(因为相比出块时间,可以认为网络上的传输时间变长了),这样诚实节点的算力就会是分散的,并且是恶意的 对于一个节点执行 51% 攻击,

比特币10分钟的平均出块时间可能不是最优的,以太坊的出块时间(后面会学到)减少到15秒。出块时间大大减少,因此以太坊不得不设计一个新的共识协议——GHOST。在这个协议中,分叉产生的孤块不能简单地丢弃,还必须给予一定的奖励——叔叔奖励。

总之比特币难度调整,在不同的区块链账本系统中,无论出块时间设计多长比特币难度调整,都尽量保持稳定,而不是让它随着系统总算力的增加而无限减少。

如何调整挖矿难度?

比特币协议规定,目标阈值目标应每 2016 个区块(大约每 2 周)重新调整一次。具体的迭代更新公式为:

target=target×actualtimeexpectedtimetarget = target \times \frac{actual\ time}{expected\ time}target=target×expectedtimeactualtime​

这里,预期时间是两次调整之间的预期间隔,即2016乘以10分钟;而实际时间是在系统中生成最新的2016块所需的实际时间。

为避免系统出现一些意外情况,导致系统波动非常大,每次对目标阈值target的最大调整不能超过4次,最小不能小于14\frac{1}{4 }41​. 即上式中的actualtimeexpectedtime\frac{actual\ time}{expected\ time}expectedtimeactualtime​即使超过4也被4使用,小于14也仅被14\frac{使用\frac{ 1}{4}41​ 1}{4}41​使用。

恶意节点不调整目标怎么办

目标是用比特币系统的代码编写的,代码也是开源的。如果有一个节点在该调整的时候没有调整目标怎么办。对于大多数节点来说,这也是一个诚实的问题。如果不调整目标,则已发布的块头(目标的 32 字节压缩版本)中的 4 字节 nBits 字段是不正确的,诚实节点。此类区块将不被接受。