APP
抗ASIC的工作量证明:究竟是现实还是幻想?(二)
2019-09-06 33305 0

本文是世界门罗大会演讲第一辑。离RandomX上线还有一个月时间,门罗是否能迈向一个新的境界,加密货币否能在挖矿平等化这个领域到达前所未有的高度,取决于10月份的升级和之后的网络表现。推荐广大门罗爱好者,尤其是矿工阅读。

演讲人 | Howard Chu:

软件工程师和优化天才,拥有世界上最快的多处理器TCP堆栈,世界上最快的Appletalk堆栈,世界上最快的LDAP服务器,比实时语音识别更快,比实时雷达数据解复用器/解码器更快等。

现在,你认为什么是工作量证明算法呢?如今工作量证明只是一个延迟循环。工作量证明的目标是耗时又耗能,而且还低效。这于我而言,是一种精神上的打击,我花费毕生精力在构建高效软件、调优编译器上,只为追求低能耗高效率。但你静下心沉思时,就能发现哪种运算昂贵,哪种运算低廉。这赋予我们一个如何写出最低效算法的特殊视角。另一个我陷入的难题是隐私、去中心化这两样东西与效率无法共存。高效系统无一例外都倾向于中心化,事实上,不仅工作量证明证实了这一点,大部分系统中心化的话效率也就更高。比如网络通信,你如何保证跨网络的通信安全?整个周末我们探讨了大量隐私相关话题,大家将隐私(privacy)和保密(secrecy)混为一谈,两者有一个很大区别:隐私只是保密的一个子集。如果你在两个端点间有一条加密通信渠道,比如TLS协议层,你保证了通信渠道中的信息安全,但事实你并没有保证通信渠道的安全。外人知道你在通信,虽是私人间的对话,但并不保密。保护自己的隐私并不会破费太多,AES加密通道费用相当低廉,而且我们有AES加速硬件。但如果要保密某件事,防止他人得知,那么成本就会高出许多。保证通信渠道隐私,就必须在渠道中添加大量噪音,用噪音掩盖你真正发送的信息。所以当你追求高效时,就与隐私和保密相违背,因此采用低效、去中心化的工作量证明着实困扰着我,但我们还是努力去攻克它。

我们想要把RandomX设计成一种既低效又耗能,还要应用大量的CPU的算法。从一张AMD Zen core的区块图可以得知,在图的上方是前端,有指令缓存、解码器、分叉预测器、运算缓存;在中层,有整数运算单位、浮点数运算单位;在底层有内存接口和数据缓存。

运行RandomX需要应用Core的所有组件,除此之外不应用任何组件。CPU芯片拥有其他交互界面。RandomX有一个PCI Express接口,有一个管理总线用于芯片间通信、系统管理,这些是我们无法真正高效利用的功能,因为这些功能都是某些设备专有的。虽然无法将这些功能从一枚芯片解析到另一枚芯片上,但我们可以利用所有核心组件和内存接口。

如何做到?先生成一个随机程序,将随机程序翻译为机器代码,然后执行随机程序并转换输出,最有趣且最重要的是第三步。我们期望第一步和第二步的成本趋近于0,因为这两步并没有真正贡献。

前面我也有提到,生成随机程序这一步有点麻烦,如果你使用的是一种高级语言,就必须根据严格的规则构建程序,否则代码不会执行程序。所以标准的方法是构建一棵抽象语法树,树上的每一个支点都是随机程序的语句。从抽象语法树下载源代码,然后将源代码提交给编译器,编译器解析源代码,并转换为一棵抽象语法树。这样会产生大量多余工作。如果构建一个ASIC芯片来处理,就可以避免多余工作,提高效率。因此构建RandomJS的想法破裂了。现在最好的方法是生成随机字节,不用语法,不按照构建规则。

然后将随机程序转换为CPU原生机器代码,并非只适用x86架构,还需适用当今ARM和CPU这样的大型架构。因此我们需要使用简单的机器指令,才能轻松地映射到真正的机器指令中。只是我们没有剩余时间来开发一个优化版的编译器,因为分析和重写代码花费的时间,等于没有生成哈希的时间。

所以实际的程序都必须应用尽可能多的CPU组件,为了使用芯片上所有的可用缓存层,我们解析了大量CPU配置文件。我们正在使用芯片上的指令缓存,充分利用整数运算以及浮点数运算,真正打败了内存控制器。

我们使用的是Blake 2B,一个专门运行在CPU设备上的加密哈算法,来计算最终结果。对于大型计算,我们仍使用AES算法,AES运算出色是因为大多数现代CPU都有AES加速硬件。如果无加速硬件,就不能应用AES算法。

如果你要分析一个程序,会出现一个问题,你需要高度优化部分运算,你可以查看该程序计算你的交易是否较慢,如果慢你可以跳过。如果运算较快,我就会执行该程序,快速获得哈希值。因此为了优化部分运算,我们必须链接多个程序,强制执行实现,要么运行整个程序,要么跳过程序。

链接程序的一个关键阻碍是,验证时间必须与Cryptonight大致相同。因此给程序不能过于复杂。

我们使用大量内存是让你不再使用芯片内存,所以我们使用2字节以上,现实中如今的芯片可以建立2字节内存,但非常昂贵。我们预计内存数量能满足未来几年的需求。而且,未来我们可能会增加内存大小。

我们的轻模式无需2字节RAM内存,只需256 mb即可,如果进一步减少内存,减少至128mb,速度上可能要慢上3700倍。

当前RandomX代码已预备好运行在monerod x86系统中。但我们仍需在ARM上实现RandomX。GPU方面工作正在进行中,还支持在Nvidia、CUDA实现以及用一种OpenCL版来支持AMD GPU(非通用版OpenCL),此版本的OpenCL仍使用大量AMD特定汇编代码。当前我们已完成4次安全审计。

原文:https://www.monerooutreach.org/monero-konferenco/h...

稿源(译):https://first.vip/shareNews?id=2092&uid=1

翻译 | Tracey_头等仓

采编 | 筋斗云_头等仓

内容来源:头等仓

版权声明:本文仅为传播消息之用,不代表币源社区立场,文章不构成投资建议。如需转载,请务必注明文章原作者以及来源,部分图片来源于网络,我们尊重版权,如有疑问敬请联系,我们将核实并删除。

我要评论
字数上限500
评论(0)