ETH-Pow算法分析

当前位置:首页 > 币圈百科 > ETH-Pow算法分析

ETH-Pow算法分析

2023-01-05币圈百科275

1。Ethash?算法

1.1 Ethash

Ethash是以太坊1.0中使用的PoW(工作量证明)算法,是Hashimoto算法结合Dagger的变种。其特点是计算效率基本不依赖于CPU,而与内存大小和内存带宽成正相关。所以通过共享内存大规模部署的矿机芯片,在挖掘效率上是不可能线性或超线性增长的。

这个算法的一般流程如下:

首先根据块信息计算一个种子(C代码中的seedhash)。使用此种子计算16MB缓存数据。客户端需要存储这个缓存。通过缓存,计算1GB(初始大小)的数据集(DAG)。DAG可以理解为一个完整的搜索空间。所有客户端和矿工都需要存储完整的DAG。在挖掘过程中,需要从DAG中随机抽取重复数据,并将其与其他数据一起计算mixhash。DAG中每个元素的生成只依赖于缓存中的少量数据。每一个新时代DAG都会完全不同,其大小会随着时间线性增加。因为DAG中指定位置的数据只需蓑衣网小编2022 要根据缓存就可以用少量内存快速计算出来,所以轻客户端只需要存储缓存就可以高效地进行检查。

1.2内存难解决

随着比特币将哈希算法作为证明pow工作量的重要手段,以下采用pow的数字货币也延续了这种设计,以SHA256和MD5(MD5后来被证明无法强碰撞,数字货币中一般不使用MD5)为代表算法。设计之初都是力敏的,也就是说计算资源是瓶颈,主频越高CPU哈希越快。这种设计直接导致了后来矿机的出现。使用ASIC芯片的矿机计算能力翻倍。更多矿的出现,让当时的比特币面临计算能力集中化的威胁。为了限制对计算能力的依赖,人们开始寻求新的算法。既然要限制CPU的容量,自然就把目光投向存储依赖,也就是内存依赖。

?桥本算法采用IO饱和策略对抗ASIC,使得内存读取成为挖掘过程中的限制因素。

?Dagger算法利用DAG(有向无环图)实现了硬存储和易验证两个特点。主要原理是每个nonce的计算需要DAG的一小部分,挖掘过程需要存储完整的DAG。禁止每次都计算DAG的对应子集,但允许验证过程。

1.3参数定义

的字节数WORD _ BYTES 4 WORD DATASET _ BYTES _ init 2 * * 30 1gb数据集的初始大小|DATASET_BYTES_GROWTH2**23每个纪元中8MB数据集增量| CACHE _ BYTES _ init 2 * * 4 216 MB缓存的初始大小|CHCHE_BYTES_GROWTH2**17每个纪元中128KB缓存增长| cache _ multiplier 1024相对于缓存的大小| EPOCH_LENGTH30000每个纪元的块数|宽度cache _ rounds 3计算cache | accesses 64 Hashimoto cycles |

2DAG

DAG是ethash算法中需要频繁访问的数据集,每个历元生成一个。 DAG需要很长时间才能生成。如果客户端至少在需要时生成它,那么在找到新时段的第一块之前,每个时段转换将不得不等待很长时间。而DAG的生成只取决于块数,所以可以提前计算DAG,避免每个历元等待时间过长。

DAG的生成过程如下:

2.1 Dag_size和Cache_size

每个epoch的dagsize和cachesize是不同的,上面已经定义了创建时的初始值。以太坊还提供了一个表来存储接下来2048个纪元(大约20年)的值。种子官网或者源码CPP-ether eum/libesh/data _ sizes . h .

。获取datasize和cachesize的方法如下:

2.2 seedhash

算法需要一个seedhash,epoch由下面的程序生成,由下面的程序生成。

2.3缓存

使用seedhash计算缓存。

2.4 DAG

最后,使用cache计算DAG,cache数据保存在light参数中。

2.5 DAG文件

DAG每次生成都需要很长时间。一般DAG文件的路径如下

MAC/Linux: $ home/。ethash/full-r-

Windows:home/appdata/local/ethash/full-r-

是ethash算法的修订号,在libethash/ethash中,h

是上面计算的seedhash

路径。该路径下可能有多个DAG文件,具体取决于是用户还是客户端删除过期的DAG文件。

格式:

DAG文件以8字节的幻数开头,值为0xfee1deadbaddcafe,以little-endian格式编写。接下来是以little-endian格式编写的数据集数据。

3 Ethash实现

3.1 et hash

图1算法流程图

参数描述:

Header_hash:是当前块头数据的hash值。在矿机中调用get _ _。

Nonce:对ethash的每次计算使用不同的数字,该数字不能重复。您可以将时间戳或随机数作为起始值,然后递增它。

对于挖掘者,如果result的值小于或等于target,则挖掘过程完成,当前nonce和mix_hash作为工作量证书提交;如果result的值大于target,那么您需要更改nonce的值并再次调用ethash算法。

Ethash算法程序如下:

蓑衣网小编2022

从图中可以看出,Ethash每次从DAG中随机取64128=8192字节。以GTX1070显卡为例,带宽2500。可以看出,这种算法对内存带宽的要求很高。

3.2快速验证

在验证一个作业提交是否有效时,速度很快。

下面是快速验证程序:

感谢HPB团队整理。

关于我

蓝莲花(王小明),微信/QQ: 263305605,微信官方账号:xm123798。朝夕网(zhaoxi.co)创始人。致力于推广区块链的应用。

ETH-Pow算法分析 | 分享给朋友: