主页 > imtoken安全吗 > ETH-Pow 算法分析
ETH-Pow 算法分析
1. Ethash 算法1.1 Ethash
Ethash 是以太坊中使用的 PoW1.0(工作量证明)算法,是 Hashimoto 算法结合 Dagger 的变体。它的特点是计算效率基本与CPU无关,但与内存大小和内存带宽正相关。因此,通过共享内存大规模部署矿机芯片,挖矿效率不可能有线性或超线性的提升。
算法的大致流程如下:
1.2 内存难解决
因为比特币使用哈希算法作为pow工作量的重要证明作为手段,后续使用pow的数字货币也延续了这种设计,用SHA256、MD5(MD5后来被证明没有强碰撞数字一般不使用货币)作为代表算法。在设计之初,它们都是计算能力敏感的,这意味着计算资源是瓶颈,CPU的频率越高,Hash越快。这种设计直接导致了后来矿机的出现。使用 ASIC 芯片的矿机将这种计算能力提高了一倍。更多矿场的出现,使得比特币当时面临着算力中心化的威胁。为了限制对算力的依赖,人们开始寻求新的算法。既然要限制CPU的能力,重点自然是存储依赖,也就是内存依赖。
Hashimoto 算法针对 ASIC 使用 IO 饱和策略,使内存读取成为挖矿过程中的限制因素。
Dagger算法使用DAG(有向无环图)同时实现内存难处理和内存易验证两个特性。主要原则是计算每个nonce需要DAG的一小部分,挖掘过程需要存储完整的DAG,禁止每次计算对应的DAG子集,允许验证过程。
1.3个参数定义WORD_BYTES4Word的字节数
DATASET_BYTES_INIT
2**30 1GB
初始数据集大小|
DATASET_BYTES_GROWTH
2**23 8MB
每个时期的数据集增长|
CACHE_BYTES_INIT
2**24 16MB
缓存初始大小|
CHCHE_BYTES_GROWTH
2**17 128KB
每个 epoch 缓存 DAG 相对于缓存的大小 |
CACHE_MULTIPLIER
1024
DAG 相对于缓存的大小 |
EPOCH_LENGTH
30000
每个 epoch 的块数|
MIX_BYTES
128
混合宽度|
HASH_BYTES
64
哈希长度|
DATASET_PARENTS
256
每个数据集元素的父级数量|
CACHE_ROUNDS
3
计算缓存时的轮数|
访问
64
p>
桥本循环数|
2 天
DAG 是 ethash 算法中需要经常访问的数据集,它是针对每个 epoch 生成的。 DAG 需要很长时间才能生成,如果客户端至少生成所需的数量,则每个 epoch 转换都必须等待很长时间才能找到新 epoch 的第一个块。但是,DAG 的生成只取决于块的数量,因此可以预先计算 DAG,以避免每次 epoch 转换的等待时间过长。
DAG的生成过程如下:
2.1 Dag_size 和 Cache_size
每个 epoch 的 dagsize 和 cachesize 都不一样,上面已经定义了 genesis 的初始值,以太坊也提供了一个表来存储接下来 2048 个 epoch(大约 20 年)的各种值。详情见或源码cpp-ethereum/libethash/data_sizes.h。
datasize和cachesize的获取方法如下:
2.2 种子哈希
算法需要一个seedhash,由以下程序生成。从程序中可以看出,每个epoch的种子是不变的。
2.3 缓存
使用种子哈希计算缓存。
2.4 DAG
最后用cache计算DAG,light参数存储cache数据。
p>
2.5 个 DAG 文件
DAG每次生成的时间比较长eth算法,所以生成的时候需要保存在文件中,然后使用mmap映射到内存中。 DAG文件路径一般如下
Mac/Linux:$HOME/.ethash/full-R–
Windows:$HOME/Appdata/Local/Ethash/full-R–
p>
是 ethash 算法的版本号,由 libethash/ethash.h 中的 REVISION 定义。
就是上面计算的seedhash
路径下可能有多个DAG文件,具体取决于用户或客户端删除过期的DAG文件。
格式:
DAG 文件以一个 8 字节的幻数开头,值为 0xfee1deadbaddcafe,以 little-endian 格式编写。接下来是小端格式写入的数据集数据。
3 Ethash 实现3.1 Ethash
图1算法流程图
参数说明:
Header_hash:是当前区块头数据的哈希值,是矿工调用get_ethwork时从任务参数中获取的。
Nonce:每次计算 ethash 使用不同的数字,不能重复。您可以将时间戳或随机数作为起始值,然后将其递增。
对于矿工eth算法,如果result的值小于等于target,则挖矿过程完成,提交当前nonce和mix_hash作为工作量证明;如果result的值大于target,则需要改变nonce的值,再次调用ethash算法。
Ethash算法程序如下:
从图中,ethash每次从DAG中随机选择64个字节
128=8192Bytes,以GTX1070显卡为例,带宽为256GB/s,则可承受256*
1024*
1024*
1024/8192=33554432个ethash操作,即33MH/s的算力。可见该算法对内存带宽的要求很高。
3.2 快速验证
验证作品提交是否有效时速度很快。
快速验证流程如下:
感谢 HPB 团队组织这次活动。
来源:巴比特信息(…)