主页 > imtoken钱包苹果 > ProgPoW算法曝光漏洞,以太坊ASIC挖矿势不可挡?
ProgPoW算法曝光漏洞,以太坊ASIC挖矿势不可挡?
针对近期备受争议的ProgPoW算法,独立开发商kikx今日披露了该算法存在的漏洞,使其无法真正达到抗ASIC的目的。 Kikx 还补充说,这个漏洞是新发现的,不会对以太坊目前使用的 Ethash 算法构成威胁。
对此,以太坊开发者 Philippe Castonguay 评论道:
“看起来 ProgPoW 的当前实施,可能不是 ASIC 抗性,基本上 ProgPoW 哈希函数使用 64 位种子,ASIC 可以‘轻松’强制执行,而不是按预期进行挖掘。这需要更多地关注正式确认。”
此后,以太坊硬分叉协调员James Hancock确认了该漏洞的存在,并表示感谢。
那么这个漏洞到底是怎么回事呢?
我们来看看kikx披露的细节:
ProgPoW 的设计缺陷
ProgPow 有一个设计缺陷:
64 位种子太小以太坊可以用手机挖矿吗,允许 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 个步骤:
固定seed为任意64位值,然后计算mix_hash = hash_mix(block_number, seed); 搜索 extra_nonce,使 header_hash 满足难度条件; 搜索 nonce 以便 keccak_progpow_64(header_hash, nonce) == seed;
第一步,为固定的seed和block_number计算mix_hash。 由于 mix_hash 被设计为 seed 和 block_number 的函数,我们得到一个有效的三元组(seed、mix_hash、block_number)。 现在,我们的目标是找到满足以下两个条件的 header_hash 和 nonce:
(A) keccak_progpow_64(header_hash, nonce) == 种子; (B) keccak_progpow_256(header_hash, seed, mix_hash);
请记住,我们可以通过修改额外的随机数(在以太坊中使用 ExtraData)来生成任意数量的标头哈希。 因此,条件 (B) 在步骤 2 中很容易完成。现在,我们有一个固定的 (header_hash, seed, mix_hash, block_number),但是 nonce 是免费的。 最后,第 3 步扫描随机数以查找条件 (A)。 由于种子只有 64 位长,条件 (A) 仅提供 64 位安全性,步骤 3 可以由 ASIC 执行。
计算成本
有四个函数,keccak_1600、keccak_progpow_64、hash_mix和keccak_progpow_256。 成本的计算可以通过计算所需功能的调用来实现,这取决于网络的难度D。
在正常的哈希计算中,需要调用 keccak_1600 从 block_header 计算出 header_hash,并依次为每个 nonce 值调用其他函数。
在ASIC哈希计算中,第一步需要调用hash_mix,第二步调用keccak_1600和keccak_progpow_256,第三步调用keccak_progpow_64。
由于hash_mix在我们的ASIC计算中只调用了一次,所以我们可以使用host CPU来计算hash_mix。 其他函数是keccak哈希函数,不需要内存存储,可以很容易地在ASIC上计算。
我们需要将 keccak_progpow_64row 中的 D 与 2^64 进行比较。 简而言之,更大的 D 将使 ASIC 更有利可图。 估计threshold阈值很难,但是我觉得目前的难度(>2^50)已经足够大了。
演示
演示在此存储库中。
$ 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
在此演示中,种子被截断为 24 位宽以便在 CPU 上运行。 见代码。
测试代码很简单。
search_asic 在这里定义
由于这个漏洞的存在以太坊可以用手机挖矿吗,以太坊矿工是不是可以松一口气了?