1。Ethash算法
1.1Ethash
Ethash是以太坊1.0中使用的PoW(工作负载证明)算法,是Hashimoto算法结合Dagger的变种。。其特点是计算效率与CPU无关,与内存大小和内存带宽成正相关。因此,通过共享内存大规模部署的矿机芯片,挖掘效率无法线性或超线性提升。
该算法的一般流程如下:
首先根据块信息计算一个种子(C代码中的种子hash)
用这个种子计算一个16MB的缓存数据。轻型客户端需要存储这个缓存。
通过缓存,计算出一个初始大小为1GB的数据集(DAG),可以理解为一个完整的搜索空间,所有的客户端和挖掘器都需要存储完整的DAG。在挖掘过程中,需要从DAG中随机抽取重复数据,并与其他数据一起计算mixhash。DAG中每个元素的生成只依赖于缓存中的少量数据。每一个新时代DAG都会完全不同,其大小会随着时间线性增加。
由于DAG中指定位置的数据只需要根据缓存使用少量内存就可以快速计算出来,所以轻客户端只需要存储缓存就可以高效地进行检查。
1.2内存问题
由于比特币将哈希算法作为证明pow工作量的重要手段,后续各种采用pow的数字货币也延续了这种设计,以SHA256和MD5(MD5后来被证明不具有强碰撞性,数字货币中一般不使用MD5)为代表算法。。设计之初都是功耗敏感,也就是说计算资源是瓶颈,主频越高CPU哈希越快。这种设计直接导致了后来矿机的出现,使用ASIC芯片的矿机将这种计算能力翻倍。更多矿的出现让当时的比特币面临计算能力集中化的威胁。为了限制对计算能力的依赖,人们开始寻求新的算法。既然要限制CPU的容量,自然就把目光投向存储依赖,也就是内存依赖。
Hashimoto算法使用IO饱和策略对抗ASIC,使得内存读取成为挖掘过程中的限制因素。
Dag算法利用Dag(有向无环图)实现硬内存和易内存验证两个特性。主要原理是计算每个随机数需要DAG的一小部分。挖掘过程需要存储完整的DAG,禁止每次都计算DAG对应的子集,而验证过程是允许的。
1.3参数定义
2。DAG
DAG是ethash算法中需要频繁访问的数据集。,它是为每个时期生成的。DAG需要很长时间来生成,如果客户端至少在需要时生成DAG,则每个时期转换将不得不等待很长时间才能找到新时期的第一块。然而,DAG的生成仅取决于块的数量。因此,可以预先计算DAG,以避免在每个历元转换中等待太长时间。
DAG生成过程如下:
2.1Dag_size和Cache_size
。每个历元的dagsize和cachesize是不同的,创建时的初始值已经在上面定义了。以太坊还提供了一个表格来存储下一个2048纪元(大约20年)的值。.SeeofficialwebsiteorthesourcecodeCPP-ethereum/liberash/data_sizes.h.
fordetails.Themethodofobtainingdatasizeandcachesizeisasfollows:
.
2.2seedhash
算法需要一个种子hash,这个种子hash由下面的程序生成。从节目中可以看出,每个历元的种子都是不变的。
2.3Cache
Cachecalculationusingseedhash.
2.4DAG
最后使用cache计算DAG,cache数据保存在light参数中。
2.5DAG文件
DAG每次生成的时间都比较长,所以生成的时候需要保存在文件中,然后需要使用mmap映射到内存中。DAG文件的路径一般如下
Mac/Linux:$HOME/.Ethash/full-R-
Windows:$HOME/Appdata/Local/Ethash/full-R-
是ethash算法的版本号,在libethash/ethash中的REVISION中定义,h
表示上面计算的seedhash
路径下可能有多个DAG文件。这取决于是用户还是客户端删除过时的DAG文件。
格式:
DAG文件以一个8字节的幻数开头,值为0xfee1deadbaddcafe,以小端格式书写。。接下来是以小端格式编写的数据集数据。
三。实施ethash
3.1ethash
图1算法流程图
参数描述:
Header_hash:是当前块头数据的哈希值,是矿机调用get_ethwork时从任务参数中获取的。
Nonce:每次计算ethash使用不同的数字,不能重复。您可以将时间戳或随机数作为起始值,然后递增它。
对于挖掘者,如果结果值小于或等于目标值,则挖掘过程完成。,提交当前nonce和mix_hash作为工作负载证明;如果result的值大于target,则需要更改nonce的值,并再次调用ethash算法。
Ethash算法的程序如下:
从图中可以看出,每次ethash随机从DAG中取64128=8192字节,以GTX1070显卡为例。带宽256GB/s,每秒可承受256102410241024/8192=33554432次ethash运算,即33MH/s计算能力。可以看出,这种算法对内存带宽的要求很高。
3.2快速验证
在验证一个作业提交是否有效时,非常快速。
以下是快速验证程序: