主页 > imtoken dapp > ETH-以太坊挖矿算法(区块链技术与应用)

ETH-以太坊挖矿算法(区块链技术与应用)

imtoken dapp 2023-12-04 05:07:14

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

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

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

莱特币(莱特币)

一度,莱特币是市值仅次于比特币的第二大货币。 它的基本设计与比特币基本相同,但针对赛诺菲的挖矿进行了修改。

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

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

设置一个按顺序填充伪随机数的大数组。

因为我们无法提前预测哈希函数的输出,看起来像是很多随机数据,所以被称为“伪随机数”。

比如有一个Seed作为种子节点,通过对Seed进行一些操作得到第一个数,然后每个数通过前一个位置的值哈希得到。 这种填充的特点是:这样一个数组中的值之间存在前后依赖关系。

在这里插入图片描述

当需要解Puzzle时,以伪随机顺序从数组中读取一些数字,每个读取的位置都与前一个数字相关。

例如:第一次从A位置读取数据,根据A中的数据计算下一次读取位置B; 第二次从B位置读取数据,根据BC中的数据计算下一个读取位置;

在这里插入图片描述

如果数组足够大,对于矿工来说是内存不足的,必须保存数组以供查询。 否则每次不仅要计算位置,还要根据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数据生成方式与莱特币类似

第一个数字是对Seed进行一些操作得到的,每个数字都是通过对前一个位置的值进行哈希处理得到的。 与莱特币的区别:

在这里插入图片描述

大DAG生成方法:大数组中的每个元素从小数组中以伪随机顺序读取一些元素,来回迭代读取256次算出一个数,放入大数组中。

例如第一次读取位置A的数据,则计算当前哈希值更新迭代计算下一次读取位置B,然后进行哈希值更新迭代计算C位置元素。 如此反复读取256次,最后计算出一个数作为DAG中的第一个元素,以此类推,依次类推DAG中各个元素的生成方式。

在这里插入图片描述

核实

轻节点只保存一小块缓存,只需要在验证时进行计算。

但是对于挖矿来说,如果只保存很小的缓存,那么大部分的算力都花在了通过Cache计算DAG上。 因此,为了更快地挖矿,它必须保存大量的 DAG。

解决难题

解谜的时候用到了DAG,没有用到缓存。

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

在这里插入图片描述

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

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

概括:

在这里插入图片描述

目前以太坊的挖矿主要是基于GPU。 可以看出它的设计是比较成功的,这与以太坊设计的挖矿算法(Ethash)需要的大内存有很大关系。

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

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

股权证明(POS:状态证明)

股权证明:投票以根据股权达成共识。 与股份制有限共识类似,投票是基于股份数量。 权益证明不需要挖矿。

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

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

预挖

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

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

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

以太坊统计

以太坊中的 ETH 供应(2018 年)

以太币大约有1亿个,每个以太币的市值超过500亿美元

饼图中,蓝色部分全部由Pre-Minin***产生(接近3/4),可见掌握该技术的重要性。黑色部分为区块奖励产生的以太坊,而绿色部分是叔块产生的奖励以太坊

在这里插入图片描述

最大25家矿池挖矿算力占比(2018年)

在这里插入图片描述

以太币价格变化(至 2018 年)

可以看出以太坊在2017年才开始暴涨

在这里插入图片描述

以太坊市值变化(至2018年)

在这里插入图片描述

以太坊哈希率的变化(直到 2018 年)

在这里插入图片描述

是指所有矿工加起来每秒计算的哈希数。 如果不同的加密货币使用不同的挖矿难题,它们的哈希率无法比较,以太坊和比特币也无法比较。

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

但也有人认为让普通电脑参与挖矿并不安全。 和比特币一样,让中心化矿池参与挖矿是安全的。 为什么?

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