比特币替代采矿谜题之ASIC性能谜题

被设计为ASIC性能应用最广泛的谜题被称为“内存谜题”——需要大量内存来计算,而不是,或者除了大量CPU时间之外的谜题。类似但具有不同概念的是内存限制谜题,其中访问存储器的时间主导总计算时间。一个谜题可以只是没有内存限制的内存困难(memory‐hard),或者没有内存困难(memory‐hard)的内存限制,或者两者兼而有之。这是一个微妙但重要的区别,因为即使CPU速度是计算时间的瓶颈,并行解决大量这种谜题的成本仍然可以由存储器的成本来支配,反之亦然。通常,对于一个计算谜题,我们需要一些内存困难(memory‐hard)和内存限制的东西,确保大量的内存的需要,且这是限制因素。

为什么内存困难(memory‐hard)和内存限制的谜题可以帮助ASIC性能?

计算现代哈希函数所需的逻辑运算只是CPU中的一小部分,这意味着对于Bitcoin的谜题,ASIC通过不实施任何不必要的功能而获得了很大的里程。一个相关的因素是内存性能的变化(以及每单位性能的成本)远远低于不同类型处理器的计算速度的变化。所以如果我们设计一个内存困难的谜题,需要相对简单的计算但需要大量的内存进行计算,这意味着解决谜题的代价会随着内存成本的升高而提高。

正如我们所看到的那样,SHA-256确实没有记忆困难,它只需要一个很小的256位状态,很容易适应CPU寄存器。 但是设计一个记忆困难的工作证明谜题并不难。

Scrpt

最流行的内存困难谜题被称为scrypt。这个难题已被广泛应用于莱特币,第二大流行的加密货币,以及各种其他Bitcoin替代品。

Scrypt是一个内存困难哈希函数,最初设计为以难以强制的方式哈希密码,所以挖掘难题与Bitcoin的部分哈希原像谜题相同,除了用scrypt替换SHA-256。

事实上,scrypt之前存在的比特币和已经使用的哈希密码给安全性带来了一些信心。密码哈希具有类似的ASIC性能目标,因为就安全性起见,我们希望具有自定义硬件的攻击者无法在计算密码的哈希值上比合法用户或服务器(可能只有通用计算机)的速度更快。

Scrpt基本上有两个步骤。第一步是用随机数据填充随机存取存储器(RAM)的大量缓冲区。第二步是以伪随机顺序读取(并更新)该存储器,要求整个缓冲区存储在RAM中。

Scrypt伪码

1 def scrpt(N,seed):

2v=[0]*N//initialize    memory buffer of length N

//Fill up    memory buffer with pseudorandom data

3v[0]=seed

4for i = 1    to N:

5v[i]    =SHA-256(v[i-1])

//Access memory buffer in a    pseudorandom order

6x=SHA-256(v[N-1])

7for i = 1    to N:

8j=x %    N//Choose a random index based on    X

9X=SHA-256(X^V[j])//Update    X based on this index

10 return X

Scrypt伪代码演示了核心原理,但我们省略了一些细节:实际上,scrypt在稍大的数据块上工作,填充缓冲区的算法稍微复杂一些。

为了看看为什么scrypt是内存困难的,我们设想试图在不使用缓冲区V的情况下计算相同的值。这肯定是可以的——然而,在第9行中,我们需要重新计算值V[j],这将需要计算SHA-256的迭代次数。因为在循环的每个迭代期间j的值将在0和N-1之间被伪随机选择,所以这将需要大约N / 2个SHA-256计算。这意味着计算整个函数现在将使用N*N/2=N的平方/2 SHA-256计算,而不是使用2N,如果使用缓冲区。因此,使用内存将scrypt从O(n)函数转换为O(N)。这应该很简单的选择n足够大,O(n)足够慢,使用内存更快。

时间记忆权衡

虽然在没有大型内存缓冲区的帮助下计算scrypt要慢得多,但仍然可以以较少的内存成本获得更多计算。假设我们使用大小为N /2(而不是大小N)的缓冲区。现在,如果j是偶数,我们只能存储值V [j],丢弃j是奇数的值。在第二个循环中,大约一半的时间将选择j的奇数值,但现在可以很容易地实时计算——我们只是计算SHA 256(v[j-1]),因为v[j-1]将在我们的缓冲区中。由于这是大约一半的时间,所以它增加了N / 2个额外的SHA-256计算。

因此,将我们的内存需求减半将SHA-256计算的数量增加了四分之一(从2N到5N / 2)。一般来说,我们可以使用SHA-256的N / k存储器和计算(k + 3)N/ 2次迭代来仅存储缓冲器V的第k行。

在极限中,如果我们设置k = N,我们将回到我们之前的计算,其中运行时间变为O(N)。 这些数字并不适用于scrypt本身,而是渐近的估算。

还有其他的设计可以减轻与时间交换内存的能力。例如,如果在第二个循环中不断更新缓冲区,那么由于需要存储更新,所以时间存储的折衷效果会降低。

验证费用

scrypt的另一个限制是,它需要尽可能多的内存来验证它的计算。

为了使存储硬度有意义,N将需要相当大。这意味着,单次计算的scrypt比SHA-256的单次迭代要贵一个数量级,这是检查Bitcoin更简单的挖掘谜题所需要的。

这有一些负面的后果,因为网络中的每个客户都必须重复这个计算,以便检查所声称的新区块是否有效。

这可能会减缓新区块的传播和接受程度,并增加分叉的风险。这也意味着每个客户端(即使轻量级的SPV客户端)都必须有足够的内存来有效地计算该功能。因此,可用于密码学中的scrypt的内存量N在一定程度上受到实际问题的限制。

直到最近,还不知道是否有可能设计一个难以计算内存困难但很快验证(易于记忆)的挖掘谜题。

这个属性对于密码哈希是没有用的,它们在使用加密存储器之前一直是内存苦难功能的主要用例。

在2014年,约翰·特罗姆普(JohnTromp)提出了一个叫做杜鹃循环的新谜题。杜鹃循环是基于从布鲁克哈希表生成的图形中找到周期的难度,该表是仅在2001年提出的数据结构。

如果不建立一个大的哈希表,没有任何已知的方法来计算它,但可以通过检查(相对较小)的循环来简单地进行验证。

这可能使内存困难或内存限制的工作证明更有用于比特币共识。不幸的是,没有数学证据表明这个函数不能有效地计算,而不使用内存。

通常,新的加密算法看起来是安全的,但是社区不会相信,直到他们已经存在多年,没有发现攻击。由于这个原因,最近发现的布谷鸟循环在2015年之前并没有被任何加密的使用。

猜你喜欢

转载自blog.csdn.net/weixin_42874184/article/details/83417298