ProgPoW算法被曝漏洞,以太坊ASIC挖矿已不可阻挡?

栏目: IT技术 · 发布时间: 4年前

内容简介:对于近期备受争议的ProgPoW算法,独立开发者kikx在今日披露了该算法存在的一个漏洞,这使其无法真正实现抗ASIC的目标,kikx还补充表示,这一漏洞是新发现的,并且不会对以太坊当前使用的Ethash算法造成威胁。对此,以太坊研发人员Philippe Castonguay评论称:“看起来ProgPoW的当前实现,可能并没有那么抗ASIC,基本上,ProgPoW哈希函数使用了一个64位种子,ASIC可以“轻松”地强制执行,而不是像预期的那样进行挖矿。这需要更多的关注来正式确认。”

对于近期备受争议的ProgPoW算法,独立开发者kikx在今日披露了该算法存在的一个漏洞,这使其无法真正实现抗ASIC的目标,kikx还补充表示,这一漏洞是新发现的,并且不会对以太坊当前使用的Ethash算法造成威胁。

对此,以太坊研发人员Philippe Castonguay评论称:

“看起来ProgPoW的当前实现,可能并没有那么抗ASIC,基本上,ProgPoW哈希函数使用了一个64位种子,ASIC可以“轻松”地强制执行,而不是像预期的那样进行挖矿。这需要更多的关注来正式确认。”

此后,以太坊硬分叉协调员James Hancock对这一漏洞的存在进行了确认,随后表示了感谢。 ProgPoW算法被曝漏洞,以太坊ASIC挖矿已不可阻挡?

那这一漏洞到底是肿么一回事呢?

我们来看看kikx披露的细节吧:

ProgPoW的设计漏洞

ProgPow存在一个设计缺陷:

64位 seed 太小了,这允许ASIC无需存储访问即可计算哈希。

初步实现

感谢chfast提供了可读的实现!

ProgPoW 哈希函数被定义为:

result hash(const epoch_context& context, int block_number, const hash256& header_hash,
uint64_t nonce) noexcept
{
const uint64_t seed = keccak_progpow_64(header_hash, nonce);
const hash256 mix_hash = hash_mix(context, block_number, seed, calculate_dataset_item_2048);
const hash256 final_hash = keccak_progpow_256(header_hash, seed, mix_hash);
return {final_hash, mix_hash};
}

ASIC友好计算

假设给出了一个区块头 block_header 以及一个区块数 block_number

然后,执行以下3个步骤:

  1. seed 固定为任何64位值,然后计算 mix_hash = hash_mix(block_number, seed)
  2. 搜索 extra_nonce ,以便 header_hash 满足难度条件;
  3. 搜索 nonce ,以便 keccak_progpow_64(header_hash, nonce) == seed
第一步,为固定 seedblock_number 计算 mix_hash 。由于 mix_hash 被设计为 seedblock_number 的函数,所以我们得到一个有效的三元组 (seed,mix_hash,block_number) 。现在,我们的目标是找到满足以下两个条件的 header_hashnonce

    keccak_progpow_64(header_hash, nonce) == seed
    keccak_progpow_256(header_hash, seed, mix_hash) <= boundary
    
记住,我们可以通过修改额外的随机数(在以太坊中使用ExtraData)来生成任意数量的header哈希。因此,条件(B)很容易在步骤2中完成。现在,我们有一个固定的 (header_hash, seed, mix_hash, block_number) ,但 nonce 是自由的。 最后,步骤3扫描 nonce 以查找条件(A)。由于 seed

只有64位长度,所以条件(A)仅提供64位安全性,并且可以由ASIC执行步骤3。

计算成本

有四个函数, keccak_1600keccak_progpow_64hash_mix 以及 keccak_progpow_256 。成本的计算,可通过计算所需函数的调用来实现,这取决于网络难度 D

ProgPoW算法被曝漏洞,以太坊ASIC挖矿已不可阻挡?

在正常的哈希计算中,需要一个 keccak_1600 调用,才能从 block_header 计算出 header_hash ,并针对每个 nonce 值依次调用其他函数。

而在ASIC哈希计算中,在步骤1中需要一个 hash_mix 调用,在步骤2中则要调用 keccak_1600keccak_progpow_256 ,在步骤3中将调用 keccak_progpow_64

由于 hash_mix 在我们的ASIC计算中仅被调用一次,因此我们可以使用主机CPU来计算 hash_mix 。而其它函数都是keccak哈希函数,不需要memory存储,并且可以在ASIC上轻松计算。

我们需要比较 keccak_progpow_64 row中的 D2^64 。简单地说,更大的 D 会使ASIC更有利可图。估计阈值门槛是困难的,但我认为目前的难度 (> 2^50)是足够大的。

Demo

演示位于此存储库中。

$ git clone https://github.com/kik/progpow-exploit.git
$ cd progpow-exploit
$ mkdir build
$ cd build
$ cmake ..
$ make
$ ./test/ethash-test --gtest_filter=asic.search

在此演示中,seed被截断为24位宽度,以便在CPU上运行。参见代码。

测试代码是简单的。

这里定义了search_asic

由于这一漏洞的存在,以太坊矿机商们是不是可以松一口气了?


以上所述就是小编给大家介绍的《ProgPoW算法被曝漏洞,以太坊ASIC挖矿已不可阻挡?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Apache源代码全景分析第1卷

Apache源代码全景分析第1卷

2009-5 / 88.00元

《Apache源代码全景分析第1卷:体系结构与核心模块》是“Apache源代码全景分析”的第1卷。书中详细介绍了Apache的基础体系结构和核心模块的实现机制,包括配置文件、模块化结构、多任务并发,以及网络连接和请求读取,其中多任务并发体系结构是《Apache源代码全景分析第1卷:体系结构与核心模块》分析的重点,讨论了Prefork、Worker及WinNT三种MPM。《Apache源代码全景分析......一起来看看 《Apache源代码全景分析第1卷》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具