挖矿难度
我在《如何设计一个加密货币?》这篇文章中提到过:
比特币网络中的投票权就是拥有在比特币这个分布式账本中记账的权利。
而记账权实际上是需要比特币网络中的节点通过不断耗费算力去计算出满足条件的目标阈值之后才获得的,因为只有计算出了目标阈值,才能够成功发布区块。相应地,成功发布区块之后才能够获得区块奖励(现在的产能是6.25个比特币),也就是我们说的挖到矿了。
那么,挖矿要满足的条件是什么呢?
公式是这样的:H(block header) <= target
现行的比特币协议中使用的加密算法是SHA-256,这个使得block header中的输入高达2^256个,这也就保证了挖矿的工作量。同时,这也意味着挖矿是具有一定难度的。并且随着比特币系统中算力地不断提升,挖矿难度也会越来越大。
挖矿难度是可以通过公式计算的。
挖矿难度公式:Difficulty = difficulty_1_target / target
difficulty_1_target:target = 1 时的挖矿难度,difficulty_1_target最小就是1,此时的target是一个非常大的值,可以理解成最大挖矿难度
target:当前的挖矿的难度
从公式上可以看出来,当前的挖矿难度difficulty是最大挖矿难度与当前的目标阈值的比值,换句话说:挖矿难度和当前目标阈值是成反比的。
调整难度
给大家看一下比特币系统算力的走势图。
显而易见地是,比特币系统的算力是越来越强的,而且呈现指数级增长的趋势。大家设想一下,按照算力继续这样发展,如果挖矿难度恒定,势必会导致出块时间越来越短,后面可能1秒就出块。这对于比特币来说,不是什么好事儿。因为出块时间越来越短,会出现诸多问题。
比如:
1、确认区块合法性被迫要求极大提高效率,这是违背比特币设计原则(简单、强壮,但不要求高效)的;
2、分叉攻击变得更加容易了;
3、算力越强,获得区块的概率并不是等比增加了,而是比等比增加地多得多。
关于分叉攻击,请看下图。
假设现在的出块时间就是1秒,那么就很可能出现9号区块后面同时出现6个甚至更多的区块。因为出块时间为1秒就意味着挖矿难度很小,这时候大家都很容易挖到矿,同时出块的概率就大大增加了。
此时,如果有些有恶意的算力又比较强的节点(比如4号)想干点坏事儿,它不从最长合法链继续出块,而是直接从1号区块后面直接出块,并且由于算力比较强,它甚至可以做到提前把4、5、6、7、8号区块一起出,那么1-4-5-6-7-8这条链就会成为最长合法连,从而成功造成分叉攻击,这样的后果是难以想象的。顺便提下,这样的分叉攻击也称为“硬分叉”。
因此,中本聪在设计比特币之初就在代码中通过算法设计了每隔10分钟左右出块的机制。
具体如何做到呢?
现行的比特币协议规定:每2016个区块调整一下出块难度。
我们可以计算一下出2016个区块所需要的时间,2016 * 10 min / 60 min * 24 = 14 days.也就是大约每隔两个星期,比特币网络就会调整一次出块难度。出块难度同样也是可以通过公式计算得出的:
next_target = previous_target * (actual_tiime / expected_timie)
next_target:下一个区块的目标阈值
previous_target:前一个区块的目标阈值
actual_time:出2016个区块所需要的实际时间,如果actual_time超过两个星期,这时候系统就需要降低出块难度,反之系统需要增加出块难度
expected_timie:出2016个区块所期望的时间,也就是 2016 * 10 。
至于规定10分钟出一个区块,每出2016个区块就要调整一次出块难度,这样的参数设置是否合理。学界也没有公认的说法,或许是中本聪经过了自己的研究得出的一个他认为比较合理的值。从目前实际运行来看,貌似还是挺合理的。
遗憾地是,这个参数在比特币系统中几乎是不可修改的了。因为去中心化的设置,早期的既得利益者是不可能会愿意作出任何修改的,这会造成他们的财富损失。以太坊就是看到了比特币的这一缺憾,所以它的出块时间是分钟级的,极大提高了挖矿的效率。但背后的实现机制是不尽相同的,后面我们有机会再聊聊以太坊。
总的来看,比特币挖矿越来越难是在设计之初就设定好的,否则比特币价格地持续上涨就没有了技术基础,因为长期的稀缺就不复存在了。也因为挖矿越来越难,目前单个矿工单打独斗的时代也已经一去不复返了,相对应的挖矿设备极速地更新换代、矿池机构大量地出现都是这一机制的产物。