挖矿和矿工
区块链是由很多个节点组成的,为了保证节点之间的同步,所以每一个新区块的添加速度不能太快。试想一下,你刚刚同步了一个区块,准备基于它生成下一个区块,但这时别的节点又有新区块生成,你不得不放弃做了一半的计算,再次去同步。因为每个区块的后面,只能跟着一个区块,你永远只能在最新区块的后面,生成下一个区块。所以,你别无选择,一听到信号,就必须立刻同步。
所以,区块链的发明者中本聪(这是假名,真实身份至今未知)故意让添加新区块,变得很困难。他的设计是,平均每10分钟,全网才能生成一个新区块,一小时也就六个。
这种产出速度不是通过命令达成的,而是故意设置了海量的计算。也就是说,只有通过极其大量的计算,才能得到当前区块的有效哈希,从而把新区块添加到区块链。由于计算量太大,所以快不起来。
这个过程就叫做采矿(mining),因为计算有效哈希的难度,好比在全世界的沙子里面,找到一粒符合条件的沙子。计算哈希的机器就叫做矿机,操作矿机的人就叫做矿工。
难度系数
读到这里,你可能会有一个疑问,人们都说采矿很难,可是采矿不就是用计算机算出一个哈希吗,而计算也正是计算机的强项啊,怎么会变得很难,迟迟算不出来呢?
原因为不是任意一个哈希都可以,只有满足条件的哈希才会被区块链接受。这个条件特别苛刻,使得绝大部分哈希都不满足要求,必须重算。
因为每一个区块都包含了一个难度系数(difficulty),这个值决定了计算哈希的难度。举例来说,第100000个区块的难度系数是14484.16236122。我们也可以将difficulty简单的可以理解为:挖到数据区块的所用时间多少。
同时难度值difficulty的计算公式为:难度值=最大目标值/当前目标值
那什么是目标值:目标值是当前区块生成所达成目标值的hash值,用于矿工的工作量证明。矿工挖掘的区块的头部hash值必须小于目标值,数据区块才能被挖掘成功。
当前目标值是指现在产生数据区块的头部信息hash值参考指标。最大目标值是一个定值:0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF。
由于只有小于目标值的哈希才是有效的,否则哈希无效,必须重算。由于目标值非常小,哈希小于该值的机会极其渺茫,可能计算10亿次,才算中一次。这就是采矿如此之慢的根本原因。
上一篇文章也说过,当前区块的哈希由区块头唯一决定。如果要对同一个区块反复计算哈希,就意味着,区块头必须不停地变化,否则不可能算出不一样的哈希。区块头里面所有的特征值都是固定的,为了让区块头产生变化,中本聪故意增加了一个随机项,叫做Nonce。
Nonce是一个随机值,矿工的作用其实就是猜出Nonce的值,使得区块头的哈希可以小于目标值,从而能够写入区块链。Nonce是非常难猜的,目前只能通过穷举法一个个试错。根据协议,Nonce是一个32位的二进制值,即最大可以到21.47亿。第100000个区块的Nonce值是274148111,可以理解成,矿工从0开始,一直计算了2.74亿次,才得到了一个有效的Nonce值,使得算出的哈希能够满足条件。
运气好的话,也许一会就找到了Nonce。运气不好的话,可能算完了21.47亿次,都没有发现Nonce,即当前区块体不可能算