Loading

以太坊挖矿算法是什么样的

2021-02-07 15:41:41 90

以太坊采用了与比特币类似的PoW共识机制,但其所选用的挖矿算法却与比特币不同。在比特币所使用的SHA-256挖矿算法中,挖矿的速度与机器的算力成正比,从而催生了利用大规模的专用矿机的集群进行合作挖矿的集中式矿场,降低了比特币的去中心化程度,因此,以太坊采取了Ethash 这种算法作为其工作量证明算法。Ethash 算法具有挖矿效率与内存大小和内存带宽正相关的特点,这就防止了部分矿场通过堆叠专用矿机算力而获取挖矿效率上的提升。

以太坊的挖矿算法Ethash 又名Dashimoto ( Dagger-Hashimoto) ,是Hashimoto算法结合Dagger算法产生的一-个变种算法。本书仅对该算法基本流程进行简要的介绍,不深入该算法的数学细节。

Ethash算法的大致流程如下:

(1)先根据相关区块的内容计算出一个种子(seed),再利用该种子产生一定大小(例如32MB)的伪随机数数据集,称为cache;

(2)基于cache,生成较大规模(1CB以上)的数据集,称为the DAG;DAG中的每一个元素都是利用cache中的某几个元素计算得出的,并且如果给出eache和其中的几个指定元素,可以很快计算出DAG中对应的元素;

(3)挖矿的过程即为从DAG中随机选取元素对其进行哈希,获得一个哈希值满足指定的“难度要求”的元素。


在这种挖矿设定下,挖矿的过程需要客户端保存DAG的全部信息,而对挖出的区块的验证过程仅需要较小的cache中的信息,即验证节点仅需要基于cache快速计算出DAG中指定位置的元素,然后验证该元素的哈希值结果符合难度要求。验证过程仅需要普通CPU及内存即可快速完成。

在以太坊的设定中,cache和对应的DAG每个周期更新一次,而一个周期的长度一般是几千个区块。因此,挖矿过程中的主要开销在于频繁地从DAG中读取数据进行计算,而不是对eache及DAG进行计算和更新,这即是Ethash算法内存敏感的原因。以太坊的挖矿难度调整是动态进行的,每个区块的难度系数都会根据上一区块的生成时间、上一区块的难度系数以及区块高度等因素,由指定计算公式计算得出,并写在相应的区块头中


由于以太坊尚处于不断的开发转变中,其具体使用的难度计算公式及其中的参数都处于不断的变化调整中。下面我们仅以以太坊Homestead阶段某时期的难度计算公式为例,对以太坊难度系数计算方法进行大致的介绍。

微信截图_20210207154501.png

其中,parentam为上一个区块的难度系数, block及parent分别为该区块及上区块产生的时间,block.number为当前区块的序号。可以看出,当前区块的难度标准由三项组成,其中第一项是上一个区块的难度标准,第二项为根据这一个区块产生的时间计算得出的难度调整,第三项是以太坊所引入的“难度炸弹"。其中前两项主要是为了在各种算力变化下保持以太坊的出块速度维持在15秒左右,而第三项难度炸弹则会随着每10000个区块的生成而翻倍,在后期会显薯影响以太坊的出块速度。