主页 > imtoken安全吗 > ETH-Pow 算法分析

ETH-Pow 算法分析

imtoken安全吗 2024-01-26 05:14:34

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

每个时期的数据集增长|

eth算法

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

混合宽度|

eth算法

HASH_BYTES

64

哈希长度|

DATASET_PARENTS

256

每个数据集元素的父级数量|

CACHE_ROUNDS

3

计算缓存时的轮数|

访问

64

p>

桥本循环数|

2 天

DAG 是 ethash 算法中需要经常访问的数据集,它是针对每个 epoch 生成的。 DAG 需要很长时间才能生成,如果客户端至少生成所需的数量,则每个 epoch 转换都必须等待很长时间才能找到新 epoch 的第一个块。但是,DAG 的生成只取决于块的数量,因此可以预先计算 DAG,以避免每次 epoch 转换的等待时间过长。

eth算法

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>

eth算法

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时从任务参数中获取的。

eth算法

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 团队组织这次活动。

来源:巴比特信息(…)