19 以太坊中的挖矿算法

时间:2024-04-13 19:31:49

以太坊中的挖矿算法

对于基于区块链证明的区块链系统来说,挖矿是保障区块链安全的重要手段,Block chain is secured by mining。

bug bounty:在美国电影里面有赏金猎人(bounty hunter),这个是说悬赏去找挖矿bug。

在比特币的挖矿算法是是安全的,但是在比特币系统中存在必须使用ASIC芯片来挖矿的与去中心化相悖的问题。one cpu,one vote:这才是中本聪的初衷。

所以在后来的区块链系统上,一个目标就是做到ASIC resistance, 一个常用的做法就是增加puzzle对于内存访问的需求,即memory hard mining puzzle,就可以扼制对内存要求不高的ASIC芯片的作用。一个早期的例子就是莱特币莱特币曾经是市值仅次于比特币的加密货币。Lite Coin使用的哈希函数是Scrypt这是一个对内存要求很高的哈希函数,但是莱特币虽然对于挖矿机是memory hard,但是对于轻节点来说也是memory hard,因此实际莱特币在使用的时候内存要求为128k,对轻节点进行了一个妥协,也最终没有达到设计目标。

冷启动问题:是加密货币一个很严重的问题,莱特币虽然没有达到开始的设计目标,但是解决了一开始的冷启动问题。

以太坊中用的是两个数据集,一大一小:16m和1G,这样就解决了轻节点方便验证和重节点memory hard的问题。并且为了适应计算机的容量的增长,这两个数据集的大小也是定期增长的。

  • cache:16M 生成方式与莱特币数组的生成方式是一样的(使用一个伪随机数依次取哈希得到一个数组)

  • dataset:1G 生成方式是在cache中使用哈希来回运算256次之后并放在dataset中,因此dataset中每个数都是利用cache来生成中

而puzzle的验证和生成是根据dataset来生成的,一开始的时候根据区块的块头block headernonce来算出一个哈希,根据这个哈希来映射dataset中的某个位置,然后进行一些运算,算出下一个要读取的位置(每次读取的时候还要把相邻节点也读取出来,这样循环64次,每次读取两个数,最终会获得128个数 ),最后算出一个哈希值来,与目标域的值比较一下,看看是不是合适的值,否则就再换另一个nonce值。

老师准备了一个PPT,写了一个伪代码

 

19 以太坊中的挖矿算法19 以太坊中的挖矿算法19 以太坊中的挖矿算法19 以太坊中的挖矿算法19 以太坊中的挖矿算法

 

这里的思考题是不相关,每一个dataset中的数都是利用cache生成的,在dataset中两个相邻节点是没有关系的。

 

19 以太坊中的挖矿算法19 以太坊中的挖矿算法

以太坊的挖矿算法ethash

以太坊的另一个目标就是将工作量证明转向权益证明,就是不挖矿了。这个对于ASIC厂商来说是很不友好的,

这个图的目的是好看,所以放在这里。

19 以太坊中的挖矿算法