主页 > imtoken安卓ico > 18-ETH-挖矿算法

18-ETH-挖矿算法

imtoken安卓ico 2023-01-17 10:45:00

免责声明:本文为重点笔记,简介及系列笔记收录在专题:区块链技术与应用

在之前的BTC章节中,介绍了比特币系统中使用的挖矿算法。 虽然挖矿的过程并没有创造任何实际价值,但挖矿本身维护了比特币系统的稳定性。 总的来说,比特币系统中的挖矿算法还是比较成功的,没有发现大的漏洞。

当然,比特币系统的挖矿算法也存在一定的问题,其中最突出的是导致挖矿设备专业化,普通电脑用户难以参与,从而导致挖矿中心化的局面. 中心化”与这一思想相悖。

因此,在比特币之后,包括以太坊在内的众多加密货币都针对这一缺陷进行了改进,试图实现ASIC Resistance(对ASIC专用矿机的抵抗)。 与普通计算机相比,ASIC芯片的计算能力更强,但内存访问性能差异不大。 因此,常用的方法是Memory Hard Mining Puzzle,增加了对内存访问的需求。

莱特币(莱特币)

一度以太坊怎么计算算计,莱特币是市值仅次于比特币的第二大货币。 它的基本设计与比特币大体相同,但针对挖矿算法进行了修改。

Litecoin 的拼图基于 Scrypt。 Scrypt 是一种对内存性能要求很高的哈希函数。 以前多用于计算机安全密码学领域。

莱特币挖矿算法的基本思想

1. 建立一个大数组,按顺序填入伪随机数(因为我们无法提前预测hash函数的输出,看起来像是很多随机数据,所以称为“伪随机数” ).

Seed是种子节点,通过对Seed进行一些操作得到第一个数,然后每个数通过前一个位置的值哈希得到。 可以看出这样一个数组中的值之间存在着前后依赖关系,如下图所示。

sitehqz.com 以太坊和以太坊贸易的关系_以太坊为什么叫以太坊_以太坊怎么计算算计

莱特币加密

2.解Puzzle时,按照伪随机顺序从数组中读取一些数字,如下图所示,每个读取的位置都与前一个数字相关。 例如:第一次从A位置读取数据,根据A中的数据计算下一次读取位置B; 第二次从B位置读取数据,根据BC中的数据计算下一个读取位置;

sitehqz.com 以太坊和以太坊贸易的关系_以太坊为什么叫以太坊_以太坊怎么计算算计

莱特币加密

分析

如果数组足够大,对于矿工来说,必须保存数组以便查询,否则每次不仅要计算位置,还要根据Seed计算整个数组数据,才能查询到该数组的数据相应的位置。 对于矿工来说,计算复杂度显着增加。

当然,矿工可以选择只保存一部分数据,例如:只保存奇数位数据,需要偶数位时再根据之前的奇数位数据进行计算,从而减少内存空间的大小减半(计算复杂度增加了一点,但内存减半)。

核心思想:不能只进行计算,增加对内存的访问,从而对ASIC芯片不友好。

这个idea有问题吗? 貌似挺好的,让ASIC矿机挖矿不友好,但是这种方式对Puzzle验证不太友好。 如果要验证Puzzle,还需要存储数组,所以对轻节点不友好(系统中大部分节点都是轻节点)。

因此,对于莱特币的实际应用,数组大小不宜设置过大。 比如:对于电脑来说,1G没有压力,但是对于手机APP来说,1G太占空间了。 因此,在实践中,莱特币系统设计的数组大小仅为128K。 莱特币刚发行时,希望不仅能抗ASIC,还能抗GPU。 但现实中后来逐渐出现了GPU挖矿,后来也出现了ASIC芯片挖矿。 在实际应用中,莱特币的设计并没有达到预期的效果,也就是说128k对于ASIC Resistance来说太小了。

莱特币的这种设计是好事还是坏事?

从没有起到预期的作用来看,当然是坏事,但换个角度想,这个设计目标的早期公示以太坊怎么计算算计,有效吸引了大量矿工参与,解决了“冷门”问题。开始”的莱特币问题。 莱特币仍然是一种更主流的加密货币。

此外,莱特币与比特币的另一个区别是区块生成时间。 莱特币是2.5分钟,是比特币的1/4。 除了这些差异之外,这两种货币基本相同。

以太坊

以太坊的概念与莱特币相同,都是Memory Hard Mining Puzzle,但具体设计与莱特币不同。

以太坊挖矿算法基本思想

在以太坊中,设计了一大一小两套数据集。 小的是16MB缓存,大数据集是1G数据集(DAG)。 关系是1G的数据集是由16MB的数据集生成的。

想想为什么要设计一大一小两个数据集?

为了便于验证,轻节点可以存储16MB的Cache用于验证,而矿工需要存储1GB的大数据集,以便更快地挖矿,减少重复计算。

16MB小Cache数据生成方式与莱特币类似:

1、对Seed进行一些操作得到第一个数,然后每个数都是通过对前一个位置的值进行哈希运算得到的。

2、区别:

sitehqz.com 以太坊和以太坊贸易的关系_以太坊为什么叫以太坊_以太坊怎么计算算计

缓存和数据集

3.大DAG生成方法:大数组中的每个元素从小数组中以伪随机顺序读取一些元素,方法与莱特币相同。 比如第一次读取A位置数据,更新迭代当前hash值计算下一次读取B位置,然后进行hash值更新并迭代计算C位置的元素,来回迭代读取256次这样,最后计算出一个数作为DAG中的第一个元素,以此类推,依次类推DAG中各个元素的生成方式,如下图所示。

sitehqz.com 以太坊和以太坊贸易的关系_以太坊为什么叫以太坊_以太坊怎么计算算计

缓存和数据集

分析

轻节点只保存一小块缓存,只需要在验证时进行计算。 但是对于挖矿来说,如果是这样的话,大部分的算力都花在了通过Cache计算DAG上,所以必须保存大量的DAG数组才能更快的挖矿。

以太坊挖矿流程:

根据区块头和其中的Nonce值计算一个初始hash,映射到一个初始位置A,读取位置A的数和下一个相邻位置A'的数,根据两者计算下一个位置B 、读B、B'位置的数字,以此类推,反复读64次,共读128个数字,如下图所示。

sitehqz.com 以太坊和以太坊贸易的关系_以太坊为什么叫以太坊_以太坊怎么计算算计

以太坊挖矿流程

最后,计算一个哈希值,并与挖矿难度目标阈值进行比较。 如果不匹配,则再次替换 Nonce。 重复上述操作,直到最终计算出的哈希值满足难度要求或当前区块被挖出。

理解以太坊挖矿算法的伪代码

通过种子计算缓存的伪代码:

sitehqz.com 以太坊和以太坊贸易的关系_以太坊为什么叫以太坊_以太坊怎么计算算计

按种子计算缓存

通过缓存生成数据集中第i个元素的伪代码:

sitehqz.com 以太坊和以太坊贸易的关系_以太坊为什么叫以太坊_以太坊怎么计算算计

通过缓存生成dataset中的第i个元素

通过不断调用上图中的函数calc_dataset_item,依次生成dataset中的所有full_size元素:

sitehqz.com 以太坊和以太坊贸易的关系_以太坊为什么叫以太坊_以太坊怎么计算算计

生成数据集中的所有 full_size 元素

以下是矿工挖矿函数和轻节点用于验证的函数:

sitehqz.com 以太坊和以太坊贸易的关系_以太坊为什么叫以太坊_以太坊怎么计算算计

矿工挖矿功能和轻节点验证功能

以下是矿工挖矿主循环函数:

sitehqz.com 以太坊和以太坊贸易的关系_以太坊为什么叫以太坊_以太坊怎么计算算计

矿工挖矿主循环函数

以下是整体挖矿算法的总结:

sitehqz.com 以太坊和以太坊贸易的关系_以太坊为什么叫以太坊_以太坊怎么计算算计

挖矿算法总结

目前以太坊挖矿以GPU为主,可见其设计比较成功,这与以太坊设计的挖矿算法(Ethash)需要的大内存有很大关系。

与128K相比,1G大阵与128K的差距超过8000倍。 即使16MB与128K相比,也大了100多倍。 可以看出内存需求差距很大(而且两个数组的大小会不断增长)。

当然,除了挖矿算法设计之外,以太坊实现ASIC Resistance还有一个原因,那就是有望从工作量证明(POW)转向权益证明(POS)

权益证明(POS:Proof of State)(以太坊现已转为POS)

股权证明:根据持股量通过投票达成共识,类似于股权制的有限共识,根据股份数量进行投票,股权证明不需要挖矿。

对于ASIC矿机厂商来说,这就像悬在他们头上的达摩克利斯之剑。 因为ASIC芯片研发周期很长,成本高,如果以太坊转为权益证明,这些研发成本都白费了(ASIC矿机只能挖特定的加密货币) .

但实际上,以太坊仍然是一种 POW 挖矿共识机制。 在设计之初,以太坊的开发者就设想从 POW 切换到 POS,并埋下了“难度炸弹”,以防止部分矿工不愿意切换。 但截至目前,以太坊仍然基于 POW 共识机制。

其实很多时候,在面对一些问题的时候,我们只要换个思路,就能得到很好的解决办法。 在这里,如果按照最初的思路,通过挖矿算法的不断改进,无疑很难做到ASIC Resistance。 而这里通过不断推动转POS来不断威慑矿工,让矿工不敢擅自转ASIC挖矿,从而实现ASIC Resistance。

预挖(Pre-Mining)

以太坊使用的预挖机制。 这里的“预挖”不是挖矿,而是在开发以太坊时为开发者预留一部分币种。 以太坊的早期开发者现在非常富有。

比特币不采用这种模式,所有的比特币都是通过挖矿产生的。 但是早期的挖矿难度是easy,中本聪自己也有很多币(但是没花掉。。。)。

与Pre-Mining相对应的还有Pre-Sale。 Pre-Sale 是指将预留的货币出售,用于后续开发,类似于拉动风投或众筹。 目前,加密货币的种类很多,其中一些是通过Pre-Sale来获取资金的。 如果这时候买入,如果后面币种成功了,也能得到不少好处,但真正成功的币种只是少数。 这就是它的风险。

其他观点

本文的挖矿算法设计一直倾向于让大众参与,这才公平。 并且由于参与者的分散和算力的分散,进一步使得系统更加安全。

但是同样的事情,不同的观点会有不同的看法。 有人认为让普通电脑参与挖矿是不安全的。 和比特币一样,让中心化矿池参与挖矿是安全的。 为什么?

因为为了攻击系统,需要购买大量只能挖特定币种的矿机,通过算力进行强制51%攻击。 攻击成功后,币值必然暴跌,攻击者投入的硬件成本将全部付诸东流。 而如果允许通用计算机参与挖矿,发起攻击的成本将大大降低。 目前,大型互联网公司可以聚集他们的服务器进行攻击,攻击完成后,这些服务器仍然可以运行日常业务。 因此,有人认为,就挖矿而言,ASIC矿机“一统天下”是最稳妥的方式。