1703867880
因此,对内存要求量的减半只会增加1/4的SHA-256计算量(从2N到5N/2)。总体来说,我们可以储存缓存区域V里的每个k排数据,即使用N/k的内存和计算(k+3)N/2次的SHA-256迭代计算。在这个限制下,如果我们设定k=N,我们就回到先前运算时间为O(N2)的计算。这些数字不一定非常精确地适用于Scrypt算法本身,但是渐近预测的方式确实是适用的。
1703867881
1703867882
除此之外,还有其他的设计可以弱化用时间来换取内存的能力。举例来说,如果一个缓存持续地在第二次循环中被更新,它可以让时间与内存之间的互换不是那么有效,因为这些更新必须被储存在内存中。
1703867883
1703867884
校验成本
1703867885
1703867886
Scrypt的另一个局限性是,它需要用与计算所用的同样大小的内存来做校验。为了让内存刚性有意义,N需要变得比较大。这意味着一个Scrypt的计算要比一个SHA-256的迭代计算(在比特币里只需要一个SHA-256计算就可以校验)昂贵许多倍。
1703867887
1703867888
这会产生负面的结果,因为在网络里的每个用户必须重复这个计算来检查每一个新发现的区块是否有效。这会减缓新区块传播和被认可的速度,从而增加了分叉攻击[4]的风险。它还要求每个客户端(即使是轻量级的SPV客户端)拥有足够的内存来有效地进行函数计算。这样一来,实际上在加密数字货币中能够被Scrypt用到的内存N是有限的。
1703867889
1703867890
一直到最近我们都不明确,是否有可能设计一个挖矿解谜程序在计算上是刚性内存类的,又可以很快地(不需要大量内存)进行校验。这个特性对密码进行哈希运算没有多大作用,在用于加密数字货币之前,这是Scrypt算法的主要用途。
1703867891
1703867892
在2014年,一个叫作杜鹃鸟周期的新解谜算法被约翰·特龙普(John Tromp)所提出(起这个名字是因为这个算法的特性与杜鹃鸟的特性类似,杜占雀巢)。杜鹃鸟周期算法,是从杜鹃鸟哈希表所衍生的一张图中寻找周期的难度而设定的,杜鹃鸟哈希表这种数据结构在2001年才被首次提出。除了建立起一个很大的哈希表之外,没有其他已知的方法来计算这个周期,结果却可以通过发现一个周期(相对小的)来简单地验证。
1703867893
1703867894
这个算法可能会让刚性内存或是内存限制类的证明工作在比特币共识里变得更加实用。可惜的是,这个函数无法在数学上证明,如果它不用内存的话就不能被有效地计算。通常,一个新的密码学算法看起来都是安全的,但是社区会对它持有保留意见,直到它存在了多年而没有被破解过。因为这个缘故,并且因为它也是最近才被发明的,当前杜鹃鸟周期算法还没有被任何加密数字货币所采用。
1703867895
1703867896
实际应用中的Scrypt
1703867897
1703867898
Scrypt被许多种加密数字货币所使用,包括莱特币在内的几种热门币,结果好坏参半。针对莱特币Scrypt算法参数的ASIC已经存在(然后被其他几种另类币所复制)。令人惊讶的是,相较于大众电脑,这些ASIC在算力上的提高比起SHA-256相对普通电脑的提高,至少旗鼓相当甚至要更大!所以,Scrypt最终还是无法反ASIC,至少在莱特币上是如此。莱特币的设计者起初宣称反ASIC是莱特币的一大优势。但现在他们已经收回了这个说法。
1703867899
1703867900
这可能是莱特币所用的数值N(内存使用参数)比较低所造成的,它只要求128KB就可以进行计算(如果使用时间内存互换的模式,可能所需要的内存更低,这也被普遍用于GPU以获得更快的缓存)。低数值N使设计一个不需要复杂的内存存储总线的轻量级挖矿ASIC变得很容易,通常这种复杂的总线是读取十亿字节(Gigabytes)级别的随机存取存储器所需要的,而这些通用电脑都具备。莱特币的开发者没有选择一个比较高的内存参数(这会使ASIC更加难以设计),因为他们认为高内存参数所导致的高成本的校验过程是不太现实的。
1703867901
1703867902
其他抵抗ASIC的方法
1703867903
1703867904
请回忆一下,我们的初衷是想让可以大幅度提升计算性能的ASIC的开发变得困难。刚性内存解谜只是其中一个方法,还有其他方法。
1703867905
1703867906
遗憾的是,其他的方法都不是很科学,并且没有作为刚性内存函数而被设计过或者攻击过。最有名的一个叫作X11,其实就是把11个不同的哈希函数结合在一起,被一个叫作“黑暗币”(Dark Coin)的另类币所用(后面这个另类币改名叫DASH),在DASH之后也被其他一些另类币所使用。X11的目的是使设计一个有效的ASIC变得十分复杂,因为所有的11个函数的计算模块都要在芯片上被实施。但这其实对硬件设计者来说,也不过是一个小小的不方便而已。如果有一个针对X11的ASIC诞生,那么马上会废弃掉X11的CPU和GPU挖矿。
1703867907
1703867908
1703867909
X11的哈希函数出自何处?
1703867910
1703867911
从2007年至2012年,美国国家标准委员会组织了一个竞赛,这个竞赛选取新的哈希函数家族来作为SHA-3的标准,大量包含了设计文档和源代码的哈希函数作为候选方案被提交。虽然有很多候选方案在竞赛中被证实并不符合密码学安全规范,但其中有24个哈希函数经受住了所有已知的密码学攻击,X11选择了其中的11种,包括获得最终胜利的Keccak[5]
1703867912
1703867913
另外被提出但还没有被实施的一个方法是使用一个移动的目标值来作为挖矿解谜。也就是说,解谜算法本身就会变化,就像比特币里的难度会周期性地改变一样。在理想的状态下,为上一个解谜算法而被优化过的挖矿硬件,对下一个解谜算法不再适用。我们不是很清楚要多久改变一次解谜算法,才能达到我们需要的安全要求。如果这是由另类币的开发者所决定的,这可能就变成了一种不可接受的中心化来源。比如,开发者可以根据他们已经开发出来的一种硬件(或者只是优化过的FPGA),去设计一个相对应新的解谜算法,他们自然就有了针对这个新算法的早期优势。
1703867914
1703867915
或许这些解密算法的顺序能够被自动生成,但这看上去也很难。一个想法是选择一大堆哈希函数(比如24个没有被攻破的基于SHA-3的算法),然后每个用上6个月到一年,在这么短的周期里很难开发新的硬件。当然如果这个顺序安排被事先知道,相应的硬件设计就可以按照函数使用的时间表来进行。
1703867916
1703867917
ASIC的蜜月
1703867918
1703867919
目前市面上还没有针对X11的ASIC面世,即便都清楚这种芯片的生产是可能的,这种现象显示了可能很有用的规律。因为适用X11算法的另类币的市值都不高,简单来说,还没有足够的市场价值吸引人去设计和生产针对X11的ASIC。一般来说,设计ASIC的前期投入都很高(不管是时间还是资金),同时生产单个硬件的利润相对来说比较低。因此,对于新的还没有被证实的加密数字货币,是不值得去投资研发针对性的ASIC,因为在新的硬件设备可用之前这个货币就可能失败了。即使有一个明显的市场需求,也会有硬件研发生产到出货的延迟。第一批比特币的ASIC从最初设计到最终出货花了近一年时间,这在硬件行业里已经算是很快了。
1703867920
1703867921
正因为如此,任何使用新的挖矿解谜算法的另类币都会经历一个ASIC蜜月期,在这段时间内,用GPU和FGPA挖矿(或许CPU挖掘)的利润会比较高。对于永久阻止ASIC的浪潮不太可能,但是吸引个人参与挖矿(并且因此而获得新币)的做法,在新币还处于步步为营的阶段,还是有价值的。
1703867922
1703867923
对于抵抗ASIC的争论
1703867924
1703867925
我们已经可以看到,从长远来讲做到反ASIC是不太可能的。但是也有一些其他意见,觉得从已经被证明的SHA-256解谜算法转变为一个密码学角度偏弱的新解谜算法,会存在一定的风险。甚者,SHA-256的挖矿ASIC已经接近当今硬件效能的极限了。这意味着,ASIC所带来的指数型增长可能结束了,之后SHA-256挖矿也会因此给网络带来最大的稳定性。
1703867926
1703867927
最后,还有一种意见认为,在短期内反ASIC也不好。在第3章中,我们曾探讨过即使一个拥有全网51%算力的矿工,他如若尝试做出很多类型的攻击,也并不理性。因为这样一来会使币值汇率崩溃,使得矿工在挖矿设备上的巨额投资大幅减值,他通过挖掘赚来的比特币的价值也会大幅下降。
1703867928
1703867929
对于一个高度反ASIC的解谜算法,这个安全性的说辞可能会站不住脚。举例来说,一个攻击者可能会暂时租用巨大算力[比如像亚马逊(Amazon)的EC2服务],用它来攻击,然后不会承受任何财务上的损失,因为他们不需要在攻击后继续租用这个服务。相比较而言,对于一个“对ASIC友好”的解谜算法,攻击者就不得不控制一大堆只可以用作加密货币挖矿的ASIC。这样的一个攻击者其实应该是看好比特币未来的发展,做了一个最大限度的投资。按照这个逻辑进行推理的话,为了最大限度地保护安全,或许挖矿解谜算法应该被设计成不仅仅要让有效的挖矿ASIC被设计生产出来,更应该让那些ASIC除了用于加密货币的解谜运算之外,没有任何其他用途!
[
上一页 ]
[ :1.70386788e+09 ]
[
下一页 ]