区块链知识总结——以太坊的挖矿算法

时间:2024-04-16 22:27:27

BTC mining:

BTC chain  is scured by mining.

BTC mining 饱受争议的是:需要用到专业的ASIC芯片,这与去中心化的理念背道而驰。

因此,包括以太坊在内的许多加密货币进行ASIC Resistance(抗拒专用矿机)。由于ASIC芯片相对普通计算机来说,算力强但访问内存性能差距不大,因此常用的方法为Memory Hard Mining Puzzle,即增加对内存访问的需求

莱特币:

  • 设置一个很大的数组,按照顺序填充伪随机数。
  • Seed为种子节点,通过Seed进行一些运算获得第一个数,之后每个数字都是通过前一个位置的值取哈希得到的,这样的数组中取值存在前后依赖关系。
  • 在需要求解Puzzle的时候,按照伪随机顺序,从数组中读取一些数,每次读取位置与前一个数相关。例如:第一次,从A位置读取其中数据,根据A中数据计算获得下一次读取位置B;第二次,从B位置读取其中数据,根据B中数据计算获得下一次读取位置C;如果数组足够大,对于挖矿矿工来说,必须保存该数组以便查询,否则每次不仅计算位置,还要根据Seed计算整个数组数据,才能查询到对应位置的数据。这对于矿工来说,计算复杂度大幅度上升。当然,矿工可以选择只保存一部分数据,例如:只保存奇数位置数据,偶数位置需要时再根据前一个奇数位置数据计算即可,从而对内存空间大小减少了一半(计算复杂度提高一点,但内存减少一半)。

以太坊算法:

核心思路:除了进行运算,还要增加其对内存的访问,从而实现对ASIC芯片不友好。

以太坊的puzzle基于Scrypt。Scrypt为一个对内存性能要求较高的哈希函数,之前多用于计算机安全密码学领域。
因为哈希函数的输出并不能提前预料,所以看上去就像是一大堆随机的数据,因此称其为“伪随机数”。

以太坊中,设计了两个数据集,一大一小。小的为16MB的cache(轻节点保存用于验证),大的数据集为1G的dataset(DAG)(矿工为了挖矿更快,减少重复计算则需要存储1GB的大数据集。),1G的数据集是通过16MB数据集生成而来的。(注:以太坊中这两个数组大小并不固定,因为考虑到计算机内存不断增大,因此该两个数组需要定期增大)

  • 16MB的Cache数据生成方式与莱特币中生成方式较为类似:通过Seed进行一些运算获得第一个数,之后每个数字都是通过前一个位置的值取哈希获得的
  • 大的DAG生成方式:大的数组中每个元素都是从小数组中按照伪随机顺序读取一些元素,方法同莱特币中相同。如第一次读取A位置数据,对当前哈希值更新迭代算出下一次读取位置B,再进行哈希值更新迭代计算出C位置元素。如此来回迭代读取256次,最终算出一个哈希值作为DAG中第一个元素,如此类推,DAG中每个元素生成方式都依次类推。

求解puzzle,即以太坊挖矿过程:

根据区块block header和其中的Nonce值计算一个初始哈希,根据其映射到某个初始位置A1,读取A1位置的数及其相邻的后一个位置A2上的数,根据该两个数进行运算,算得下一个位置B1,读取B1和B2位置上的数,依次类推,迭代读取64次,共读取128个数。最后,计算出一个哈希值与挖矿难度目标阈值比较,若不符合就更换Nonce,重复以上操作直到最终计算哈希值符合难度要求(注意有可能当前区块已经被挖出)。

python伪代码实现: