以太坊挖矿机制

挖矿算法

背景

  • 对于基于工作量证明的区块链系统来说,挖矿是保障区块链安全的重要手段。Block chain is secured by mining.
    比特币的挖矿算法,是天然的bug bounty。如果能够找到漏洞或捷径,就能取得很大的利益。
  • 比特币的挖矿算法比较成功,经受住了时间的检验。但是仍然有一些值得改进的地方。

改进点

背景

有一个饱受争议的问题,挖矿设备的专业化。只能用专业的设备,专业的asic芯片来挖矿。这种做法与去中心化的理念是背道而驰的,也和比特币的设计初衷是相违背的。中本聪最早的比特币论文中,提出了一个说法是:one cpu,one vote。在理想的状况下,应该让普通的老百姓,也能够参与挖矿的过程当中。就用自己家里的桌面机、笔记本电脑、甚至手机来挖矿,这样也更加安全。

如何设计出对asic芯片不友好的mining puzzle呢?

一个常用的做法是,增加这个puzzle对内存访问的需求,即memory hard mining puzzle。asic芯片相对于主流的计算机而言,主要优势是算力强,计算能力很强,但是在内存访问的性能上,没有那么大的优势。

实际例子 莱特币

如何设计呢?

早期的例子,就是莱特币。莱特币曾经是市值仅次于比特币的第二大货币。使用的Puzzle是基于Script
,这是一个对内存要求很高的哈希函数。以前用于计算机安全领域,和密码相关。

具体设计思想是?

我开设一个很大的数组。按照顺序填写伪随机数。我有一个种子节点,有个seed值,通过运算算出数填在第一个位置,后面每个位置都是前一个位置的值取哈希得到。

为什么叫为随机数?

哈希得到的值,看上去像随机数。实际上不可能真的用随机数,没法验证。

数组填充的特点是?

[ , , , , , , , , , ]
数组里面的取值有前后依赖关系。从第一个数依次算出。求解puzzle的时候,按照伪随机顺序,从数组当中读取一些数。每次读取位置,和前一个数相关。比如,解puzzle,读取A位置的数,把A的值读出来后,根据取值进行运算,算出下次读取到位置,比如B。读取B的数,在经过运算,得到位置C。这也是一种伪随机的顺序,是根据哈希运算,得到下一个位置。

这样的好处是?

1 如果数组足够大,对于挖矿的矿工,就是memory hard。如果不保存数组,挖矿计算复杂度大幅度上升。读取数的时候,没保存数组,怎么办呢?求解puzzle,比如第一个要读取A位置的数,若没有数组,则要从第一个数开始,依次去计算每个位置的值,得到A的值。读取第二个B位置的值,要重新从头开始计算B的值,因为没有将数组存起来。C也一样。这个计算的复杂度会大幅度上升。
2 所以,要高效挖矿,内存区域要进行保存。
3 有的矿工可能保存一部分内存区域的内容。比如,数组当中只保留奇数位置的元素,偶数位置的元素就不存了,这样数组会减少一半。用到偶数位置就用另一半去计算。计算复杂度提高一些,但内存减少了一半,这种又称为time-memory trade off。

核心思想

不能像比特币一样,主要进行哈希运算。比特币也不是取了一次哈希,是取了两次。但是不够,要增强对内存访问的需求。要设计一个对asic芯片不友好的,让普通计算机能够参与的算法。要设计的任务更像是普通计算机做的,而不像挖矿专用的asic芯片做的。普通计算机内存很大,还有其他的特性,很大的硬盘之类。就要利用这个特性,设计这个puzzle对这个需求特别像是普通计算机对资源的配对比例。

这个puzzle好的地方

对矿工来说挖矿是memory hard。

坏的地方

对轻节点也是memory hard。设计puzzle的原则是:difficult to solve, but easy to verify。求解puzzle很难,验证puzzle很容易。这种算法的问题在于验证和求解puzzle的区域几乎一样大。验证也要保存数组,否则计算复杂度也会很高。Script 早期安全领域密码方面,这个不是问题,它没有轻节点验证的问题。但对这个场景而言,是不行的。这样造成的结果是,litecoin真正使用的时候,内存区域不敢设置太大。比如1G的内存,对于计算机1G不大,如果手机的app,1G的内存就太大了。最终实际使用的时候,数组只有128K,非常小。连1M都不到,就是为了照顾轻节点。

效果如何?

  • litecoin发行的时候,目标不仅是asic resistance 还是 gpu resistance,挖矿连gpu都不用,只用cpu。结果呢,后来就出现了gpu 挖矿,后面asic 芯片挖矿。实践证明,litecoin要求的128k,不足以对asic芯片的生产和设计带来实质性的障碍,最初的设计目标是没有达到的。
  • 早期宣传的设计目标,对于解决莱特币的冷启动的问题很有帮助。
  • 比特币是如何冷启动呢?总的来说是循环迭代的过程。中本聪宣传多了,感兴趣的多,挖矿的多,比特币就更安全了,价值就高了,良性循环。
  • 莱特币虽然没达到设计目标,但是早期的宣传,更民主,让更多人参与的理念,对于聚集人气来说,是很重要的。莱特币到现在仍然是比较主流的加密货币。

和比特币的区别?

  • mining puzzle
  • 莱特币的出块速度是比特币的4倍,2分半,而非10分钟,除此之外,这两种加密货币基本一样的。

以太坊设计理念

也是用一种memory hard mining puzzle。但是设计上,和莱特币有很大不同。以太坊用的是两个数据集,一大一小,小的是16M的cache,大的数据集是1G的dataset,称为DAG。这1G数据集是从16M的cache生成出来的。

为什么要设计一大一小?

便于验证,轻节点只用保存16M的cache,只有矿工需要保存1G的大数据集。

基本思想

  • cache生成方式,和之前莱特币数组生成方式比较类似。从种子节点,
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值