EIP-969: 修改 ethash 以使现有的专用硬件实现失效
Authors | David Stanfill <david@airsquirrels.com> |
---|---|
Created | 2018-04-03 |
Discussion Link | https://gitter.im/ethereum/topics/topic/5ac4d974109bb043328911ce/eip-969-discussion |
简单总结
这个 EIP 修改了 ethash,目的是破坏专门为当前 ethash 采矿算法设计的 ASIC 矿机。
摘要
目前有一些公司已经生产了基于专用硬件的以太坊矿机,并且可能正在积极挖矿。本 EIP 旨在通过以低风险的方式修改区块挖矿算法来 “破坏” 这些矿机(如果它们实际上是作为传统 ASIC 构建的),从而达到 “釜底抽薪” 的目的。
动机
基于 ASIC 的矿机将比基于 GPU 的矿机具有更低的操作成本,这将导致基于 GPU 的挖矿迅速变得无利可图。鉴于基于 ASIC 的矿机的生产进入门槛高,市场参与者少,这将导致挖矿算力集中化的趋势。
风险包括单个制造商可能利用生产库存进行自我挖矿,在其硬件中引入后门,或促成 51% 攻击,否则这些攻击是不可行的,从而导致市场支配地位。
这种中心化趋势对网络安全产生负面影响,将对网络的重大控制权掌握在少数实体手中。
Ethash 仍具有 ASIC 抵抗性,但是 ASIC 制造商的技术正在进步,ethash 可能需要进一步的更改,以便对无法预料的设计技术保持抵抗性。本 EIP 明确旨在争取时间,在此期间,新开发的 ASIC 技术将面临障碍,同时可以探索更长期的机制以确保持续的 ASIC 抵抗性。
规范
如果 block.number >= ASIC_MITIGATION_FORK_BLKNUM
,则要求密封该区块的 ethash 解决方案是使用 ethashV2
挖掘的。
EthashV2
ethashV2
在规范上将与当前的 ethash
(v1) 算法相同,但 fnv
的实现除外。
新算法将 hashimoto
内部当前使用的 5 个 fnv
替换为 5 个独立的实例,定义为 fnvA
、fnvB
、fnvC
、fnvD
和 fnvE
,并使用
FNV_PRIME_A=0x10001a7
FNV_PRIME_B=0x10001ab
FNV_PRIME_C=0x10001cf
FNV_PRIME_D=0x10001e3
FNV_PRIME_E=0x10001f9
fnvA
替换 DAG 项目选择步骤中的 fnv
;
fnvB
替换 DAG 项目混合步骤中的 fnv
;
fnvC(fnvD(fnvE
替换压缩混合步骤中的 fnv(fnv(fnv(
。
在 DAG 项目创建中使用时,fnv
应该保持不变。
代理更改(可选变体)
JSON-RPC eth_GetWork
调用可以选择性地返回提议区块的算法。
虽然矿工或矿池可以根据提供的 seedHash 的计算 epoch 推断出对 ethashV2
的要求,但显式提供此字段是有益的,因此矿工在选择不实现 ASIC_Mitigation
硬分叉的链上进行挖矿时不需要特殊配置。
由于与已经向 GetWork
添加额外参数的实现的兼容性问题,因此希望按照 https://github.com/ethereum/go-ethereum/issues/2333 中的建议,将 BlockNumber
作为显式的第 4 个参数添加。然后应根据 block.number >= ASIC_MITIGATION_FORK_BLKNUM
标准将 Algorithm 作为 "ethash"
或 "ethashV2"
返回。
理由
本 EIP 旨在通过对现有 ethash 算法进行少量更改来破坏现有的基于 ASIC 的矿机。我们希望完成以下目标:
- 破坏现有的基于 ASIC 的矿机。
- 在将来生产 ASIC 矿机的情况下,表明进行分叉的意愿。
目标 #1 是只有在详细了解现有 ASIC 矿机设计的情况下才能概率性地完成的事情。已知的已发布矿机可在此处购买 here,预计将于 2018 年夏季中期交付。
我们的方法应在更改挖矿算法所涉及的固有安全风险与我们所做的更改不会破坏利用部分或完全可配置逻辑的现有 ASIC 矿机的风险之间取得平衡。本 EIP 倾向于通过对算法进行最小的更改来最大程度地降低安全风险,从而承担该更改可能不会破坏利用部分或完全可配置逻辑的专用硬件矿机的风险。
此外,我们不希望引入可能改变现有 GPU 硬件的功耗或性能特征的重大算法更改。
更改 FNV 常量是一项最小的更改,可以跨各种网络节点和矿机实现快速实现。
建议 ASIC_MITIGATION_FORK_BLKNUM
不超过 5550000(epoch 185),从而为节点和矿机开发人员提供大约 30 天的通知,并为专家对更改进行正式分析提供足够的窗口。我们必须权衡这个窗口,以对应允许可能存在的 ASIC 继续在网络上传播所带来的风险,以及为 ASIC 开发人员提供过多高级警告的风险。
还需要理解的是,此更改不会阻止使用新的 ASIC 芯片重新设计现有的专用硬件。此更改的目的仅在于禁用当前活动或正在生产中的硬件,并为 POS 开发以及专家对更大的算法更改进行充分分析提供时间。
FNV 常量的选择是基于 https://tools.ietf.org/html/draft-eastlake-fnv-14#section-2.1 处的正式规范进行的。
@goobur 提供了以下 python 代码来输出符合此条件的素数:
candidates = [2**24 + 2**8 + _ for _ in xrange(256)]
candidates = [_ for _ in candidates if is_prime(_)]
["0x%x" % _ for _ in candidates if _ % (2**40 - 2**24 - 1) > (2**24 + 2**8 + 2**7)]
最小素数约束已放宽,这在 ethashV1
中已经存在。
典型的 ASIC 合成工具会优化 FNV 算法中常量的乘法,同时根据常量汉明权重来减少乘法器所需的面积。为了减少通过细微掩码更改进行 ASIC 适配的机会,我们建议选择具有较大汉明权重的新常量,但是应注意不要选择权重太大的常量。
当前的 FNV 素数 0x1000193
的汉明权重为 6。
HammingWeight(0x10001a7) = 7;
HammingWeight(0x10001ab) = 7;
HammingWeight(0x10001cf) = 8;
HammingWeight(0x10001e3) = 7;
HammingWeight(0x10001ef) = 9; // 未选择
HammingWeight(0x10001f9) = 8;
HammingWeight(0x10001fb) = 9; // 未选择
可以使用以下代码段对这些常量与 0x01000193
相比的分散程度进行分析。
// https://eips.ethereum.org/EIPS/eip-969
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main() {
u_int32_t candidate = 0;
u_int32_t dups = 0;
u_int32_t fnv_candidate = 0x10001a7; // MODIFY!
u_int8_t *counts = malloc(0xFFFFFFFF);
memset(counts, '\0', 0xFFFFFFFF);
for (candidate = 0; candidate < 0xFFFFFFFF; candidate++) {
u_int32_t result = (u_int32_t)(candidate * fnv_candidate);
u_int8_t oldCount = counts[result];
counts[result] = counts[result]+1;
if (oldCount != 0) {
dups++;
}
//// progress display: remove comment to speed down
//if ((candidate & 0xFFFFF) == 0xFFFFF) printf("0x%08x\n", candidate);
}
printf("\nFNV candidate 0x%08x : %i dups\n", fnv_candidate, dups);
return 0;
}
可以凭经验确认,使用这些常量,在 32 位字空间中最多发生 1 个重复项。
值得注意的是,FNV 不是加密哈希,并且在 ethash 中不这样使用。也就是说,可以考虑更具侵入性的哈希算法更改。
一个建议是 MurmurHash3。
Other suggestions have been made: Argon2, Zcash 的著名算法 Equihash 和 Balloon Hashing。
另一个可能的候选者是 Cuckoo Cycle,尽管人们对未解决的优化漏洞表示担忧。可以在 here 找到一篇评论。
一旦知道了已发布 ASIC 的确切机制,并且可以充分评估其针对优化的有效性,就可以考虑这一点。
向后兼容性
此更改实现了基于工作量证明的区块挖掘的向后不兼容的更改。所有现有的矿工都需要更新到实现此新算法的客户端,并且所有节点都需要更新以接受来自新工作量证明算法的解决方案。
测试用例
TODO:将需要为与共识更改相对应的 ethereum/tests
存储库生成测试用例。
实施
TODO
版权
通过 CC0 放弃版权和相关权利。
Citation
Please cite this document as:
David Stanfill <david@airsquirrels.com>, "EIP-969: 修改 ethash 以使现有的专用硬件实现失效 [DRAFT]," Ethereum Improvement Proposals, no. 969, April 2018. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-969.