主页 > imtoken海外版 > ETH-19 挖矿算法

ETH-19 挖矿算法

imtoken海外版 2023-04-19 05:17:31

内容编译自北京大学19-ETH-挖矿算法肖真教授《区块链技术与应用》公开课

对于基于工作量证明的区块链系统,挖矿是保证区块链安全的重要手段。比特币挖矿算法比较成功,目前没有发现重大漏洞。

漏洞赏金:为软件中的漏洞提供赏金。比特币的挖矿算法是天然的漏洞赏金。如果你能找到漏洞或者找到捷径来挖掘,你可以获得很多好处。

但比特币挖矿算法也有一些需要改进的地方,其中之一就是挖矿设备的专业化。普通电脑无法挖矿,只能用专业的asic芯片挖矿。有人认为这种做法不符合去中心化的理念,也有悖于比特币的初衷。中本聪最早的比特币论文提出了一个声明,叫做一个 CPU,一票。理想情况下,普通人应该可以参与到挖矿过程中,使用自己的电脑和手机进行挖矿,这样也比较安全,因为算力分散后,恶意节点很难收集到 51%计算能力发动攻击。因此,比特币之后出现的包括以太坊在内的加密货币在设计挖矿难题时,一个目标就是实现asic抵抗。

要实现asic抗性挖矿难题,通常的做法是增加挖矿难题对内存访问的需求,也就是所谓的内存硬挖矿难题。与普通电脑相比,asic芯片的主要优势在于计算能力强eth算法,但在内存访问的性能上并没有太大的优势。所以如果能设计出对内存要求高的拼图,就能起到遏制asic芯片的作用。一个早期的例子是莱特币。它的拼图基于 scrypt,这是一个对内存要求很高的哈希函数。它的设计思路是打开一个大数组,然后依次填充一些伪随机数(如图)。有一个种子节点seed,通过运算将种子的值计算成一个值,并填充到第一个位置,然后通过对前一个位置的值进行散列得到后续的每个位置。之所以称为伪随机数,是因为经过哈希计算得到的值看起来像随机数,但实际上不可能使用随机数,否则无法验证。数组填充的一个特点是其中的值是有上下文的,从第一个数开始依次计算。然后当需要解谜题时,会以伪随机顺序从数组中读取一些数字,并且每次读取的位置也与前一个数字相关。例如,要解决一个难题,请阅读开头位置 A 处的数字。读取位置 A 的数字后,根据其值进行一些操作eth算法,计算下一次读取。位置,比如B的位置,然后读取位置B的个数,然后经过一些运算,比如C,计算下一个要读取的位置。这也是伪随机顺序,因为经过哈希运算,获得下一个读取位置。这样做的好处是,如果数组足够大,对挖矿矿工来说是内存困难的,因为如果不保存数组,挖矿的计算复杂度会显着增加。因此,为了高效地挖掘这块内存区域,需要对其进行保存。

这种设计的优点是矿工在挖矿时内存难,缺点是轻节点也难内存。设计谜题的原理很难解决,但很容易验证。这种设计的问题在于,验证谜题所需的内存区域几乎与解决谜题所需的内存区域一样大。轻节点也需要保存数组来验证,否则计算复杂度会大大增加。这样做的结果是,莱特币在设计的时候,数组也不敢太大。事实上,在使用莱特币的时候,数组只有 128kb,非常小,只是为了照顾轻节点。实验证明,莱特币所需的128K内存不足以对ASIC芯片的生产造成障碍。从这个角度来看,莱特币的目标还没有达到。

以太坊也是一个具有硬记忆的挖矿难题,但在设计上与莱特币有很大不同。以太坊使用两个数据集,一大一小。小的是16M的缓存,大的数据集是1G的数据集(DAG),1G的数据集是从16M的缓存生成的。之所以设计成一大一小两个数据集,是为了方便验证。轻节点只需要保存16M的缓存,只有需要挖矿的矿工需要保存1G的大数据集。基本思想是小数据集缓存的生成方式和前面数组的生成方式类似。首先从种子节点通过一些运算计算出数组的第一个元素,然后依次取哈希,整个数组填充伪随机数。获取缓存。以太坊生成一个更大的数组,比较小的数组大得多。而且,小缓存和大数据集是有规律的增长的,它们也会有规律的增长,因为计算机的内存容量也是有规律的增长的。大数据集的每个元素都以伪随机顺序从小缓存中读取。该方法类似于莱特币中解谜的过程。比如第一次实际上是读取位置A的元素,当前hash值是执行更新迭代,计算下一个要读取的位置,B,然后C……从缓存中来回读取256次,读取 256 个数字,最后计算一个数字并放入第一个大数据集中。 1个元素,和第二个元素一样……然后解谜时,使用大数据集中的数字,不使用缓存,从数据集中按伪随机顺序读取128个数字。

到目前为止,以太坊的挖矿主要基于GPU,很少使用asic矿机。从这个角度来看,它比莱特币更成功,并且起到了asic抵抗的作用。这类似于以太坊的挖矿算法。所需的大内存非常相关,该算法称为 ethash。以太坊中没有 asic 矿工的另一个原因是,以太坊长期以来一直计划从工作证明转向股权证明。这对asic芯片厂商来说是一个很大的威胁,因为asic芯片的研发周期很长,即使一年的周期很快,研发成本也很高,等到以太坊才挖出来转向权益证明。如果是这样,所有投入其中的研发费用都将付诸东流。但到目前为止,以太坊仍然是工作量证明。说要改用 PoS 还为时过早,但转移的时间一再推迟,同时它还不断声称要改用 PoS。通过吓唬来充当asic抵抗。

以太坊采用预挖的过程。所谓预挖,并不是说真的去挖,而是在发币的时候预留一部分给开发者。与预挖相关的概念是预售。预售就是将预挖预留的币卖掉,换取一些资产用于加密货币的发展。

上述挖矿的算法设计应尽可能让通用计算设备参与。参与的人越多,挖矿过程就越民主,区块链就越安全。这就是为什么莱特币、以太坊要设计内存硬挖掘难题。但也有不同观点认为,让通用计算设备参与挖矿并不安全。用比特币这种特殊的asic芯片挖矿比较安全,因为要攻击比特币系统,需要投入大量资金购买asic矿机,才能拥有攻击所需的算力,并且这些矿机除了挖矿什么都做不了,而为某种加密货币设计的挖矿芯片只能挖一种加密货币,所以发动攻击的成本非常高,而且一旦攻击成功,比特币系统的安全性被证明是存在的。问题是比特币价格已经下跌,所以前期投入的硬件成本无法收回。反之,如果涉及通用计算设备进行挖矿,则发起攻击的成本会大大降低,因为发起攻击不需要购买特殊的硬件设备。比如很多大的互联网公司有很多服务器,所以当你需要发动攻击的时候,你需要在服务器调动起来的时候,才能用来挖矿。通常,服务器可以满足公司的日常业务和服务。在攻击期间,它被临时征用用于采矿。攻击结束后,可以恢复原来的任务。即使大型互联网公司不这样做,恶意攻击者也有可能通过云服务租用服务器集群来达到同样的目的。