ASIC 矿机中心化太严重?我们设计了一种对抗“矿霸”的算法_unsig:TPS

编者按:本文来自QuarkChain,作者:QuarkChain团队,星球日报经授权转载。

我们写作这篇文章的目的,主要是想通过展示我们关于这个主题的一些初步想法,来和同行进行讨论,欢迎大家提意见。动机

众所周知,比特币挖矿主要是由是由ASIC矿机来完成的。这是因为ASIC设备的效率比普通CPU高1000多倍。由于高性能ASIC的制造被掌控在少数几个厂商手中,这引起了人们对于挖矿中心化的担忧。因此,开发者们提出了几种抵抗ASIC优化的算法,其中包括:Ethhash、CyptoNight和Equihash。但不幸的是,市场上还是出现了一些针对以上算法进行ASIC优化的矿机,它们声称比CPU或者显卡挖矿显著的提高了效率。在这些算法中,Ethash可能是被ASIC优化后效率增益最小的一种。Ethash算法的核心思想是通过执行内存密集型操作而取代计算密集型操作。这样内存的读取性能成为哈希算法的瓶颈,从而限制ASIC的优化效果。如果假设定制开发的硬件很难提高内存的读取速度,则通过ASIC对Ethash算法进行优化获得的性能增益应该非常有限。基于顺序统计的哈希算法的想法

Gitcoin Passport推出Onchain Stamps,旨在帮助项目方对抗女巫攻击:9月1日消息,据官方消息,Gitcoin Passport 宣布推出 Onchain Stamps,旨在与以太坊生态系统无缝集成。Onchain Stamps 基于以太坊证明服务 (EAS) 构建。

Onchain Stamps 将在 OP 主网上提供,并计划将 Gitcoin Passport 扩展到其他与 EVM 兼容的链。通过可互操作的证明,项目可以选择相关的证明来抵抗女巫攻击和授权,从而推进更加互联和安全的数字身份景观的愿景。[2023/9/1 13:11:02]

在Ethash算法的启发下,我们提出一种新的算法,旨在通过限制ASIC的并行计算能力,从另一个方面来抵抗ASIC对挖矿效率的提升。先让我们看看ASIC的优化是如何工作的。一组固定指令实际上可以被分解成一个电路流水线,因此每个时钟周期,ASIC可以同时求解多个输入值的哈希值。例如,a+b+c+d的指令可以被流水线化,使得每个运算周期可以同时计算3个不同的输入:1,a0+b0;2,b1+c1;3,c2+d2可以在ASIC中建立多个电路逻辑,同时并发的计算多个指令。例如,上文的a+b+c+d指令可以被设计为(a+b)+(c+d),将在2个周期中完成计算。目前,这种流水线化的思想还被广泛地应用于诸如x86之类的现代处理器中,这些x86中具有分支预测器和流水线微处理器。一种避免处理器计算流水线的方法是执行多个if-then-else命令,然后在不同的分支上执行不同的代码路径,这使得流水线和分支预测变得很难。为了打破执行过程的并发性,我们可以考虑采用于状态依赖的思路——任何未来的指令都依赖于当前状态,而这种状态可以频繁地被改变,这意味着我们不能预先执行未来的指令。基于顺序统计的哈希算法

在本节中,我们将介绍我们提出的顺序统计哈希算法。该算法试图打破流水线,使代码的执行路径变得更加随机。在介绍这种新算法之前,让我们重新回顾一下Ethash算法的核心内容,看看Ethash是如何生成一个哈希值的:Input:-state:128-bytestate-datablock:anarrayoflargeamountofdata,eachdatais64bytes-H(x,y):afasthashalgorithm,xandyhasthesamesize,returnthehashvaluewiththesamesizeasx-R(x):returnan32-bitrandomintegerderivedfromxAlgorithm:foriinrange(64):p=R(state)%(len(datablock)-1)newdata=,datablock]state=H(state,newdata)returnstateOshash算法的初步方案如下:Input:-state:128-bytestate-datablock:anlongarraywitheachentrybeing8bytes-H(x,y):afasthashalgorithm,xandyhasthesamesize,returnthehashvaluewiththesamesizeasx-R(x):returnan64-bitrandomintegerderivedfromxAlgorithm:foriinrange(64):p=R(state)%len(datablock)newdata=forjinrange(128/8):newdata=newdata.add(datablock.find_by_order(p))#Removethepthsmallestelementfromdatablockdatablock.remove_by_order(p)#Addarandomdatatothedatablock,e.g.,#datablock.insert(R(]))#Findthenextindex,e.g.,#p=R()%len(datablock)state=H(state,newdata)returnstateOshash算法与Ethash的关键差异如下:原算法是根据随机索引数p去寻值,而新算法根据第p位的最小值去寻值。在读取了datablock变量中的一个数据后,该数值将被删除,新的随机数值值将被插入到datablock中。由于datablock是一个支持有序数据查找的动态列表,因此datablock的有效实现方式可以是一棵具有顺序统计的动态搜索树。想要使用流水线来加速树的删除/插入操作是困难的,因为树的执行路径是随机的,并且高度依赖于随机输入量。CPU和FPGA实现的性能比较

我们将对比CPU和FPGA的实现对动态搜索树进行插入/删除操作性能,来初步验证以上思路是否成立。实验中,我们使用具有以下配置的CPU,CPU的代码可以在这里找到:CPU型号:Inteli7-7700KOS操作系统:Ubuntu16.04LTS编译器:g++5.4.0编译命令:g++-O3-std=gnu++17线程数:1键值数:64K键值类型:unsigned64-bitrandomintegers性能结果:FPGA:每秒执行397万个插入/删除操作CPU:每秒执行446万个插入/删除操作几点补充说明跟FPGA实现的搜索性能比较,FPGA实现的插入/删除操作的性能要低得多,这是因为每个插入/删除操作需要更多的执行周期,而每个搜索任务可以在一个周期中完成。实验中,FPGA的性能是根据Virtex5LX330FPGA测算的,该FPGA可能已经过时了。如果采用最新的FPGA,性能可能会提升一些。CPU的性能是根据单线程/单核测算的,如果使用多线程/多核,性能可能会更高。本测算中CPU中的键值大小是64位,FPGA中的是32位。参考文献https://github.com/ifdefelse/ProgPOWBranchpreditor,Wikipedia,https://en.wikipedia.org/wiki/Branch_predictorYang,Y-H.E.andPrasanna,V.K.,HighThroughputandLargeCapacityPipelinedDynamicSearchTreeonFPGA,18thAnnualACM/SIGDAInt.Symp.onFieldProgrammableGateArrays,2010

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

金智博客

[0:15ms0-4:647ms