以太坊中的挖矿算法
对于基于区块链证明的区块链系统来说,挖矿是保障区块链安全的重要手段,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 header
和nonce
来算出一个哈希,根据这个哈希来映射dataset
中的某个位置,然后进行一些运算,算出下一个要读取的位置(每次读取的时候还要把相邻节点也读取出来,这样循环64次,每次读取两个数,最终会获得128个数 ),最后算出一个哈希值来,与目标域的值比较一下,看看是不是合适的值,否则就再换另一个nonce值。
老师准备了一个PPT,写了一个伪代码
这里的思考题是不相关,每一个dataset中的数都是利用cache
生成的,在dataset
中两个相邻节点是没有关系的。
以太坊的挖矿算法
ethash
以太坊的另一个目标就是将工作量证明转向权益证明,就是不挖矿了。这个对于ASIC厂商来说是很不友好的,
这个图的目的是好看,所以放在这里。