我们知道比特币需要挖矿,挖矿才能获得新的比特币。可是,不是说比特币网络是分布式账本吗?是拿来记账的,记账跟获得新比特币有什么关系?记账记的是什么账?
现在有人在搞矿池进行挖矿,矿池是什么?好像是很多计算机放在一起。那这些计算机到底在干嘛?据说挖矿很耗费电力,现在比特币整个网络每天所耗的电力比荷兰一个国家还多,为什么?既然出块的时间是固定的,那增加算力有什么用呢? 今天我们就把上面的问题为大家一一解答。
1
挖矿挖的是什么?
当然挖的是比特币!
挖矿的本质是通过计算哈希函数,对前面的交易进行确认,确认之后,系统自动生成一个新的区块,这个区块得到其他节点的确认(抢到了记账权)后,就链接到前面的区块链之上。比特币是对这个确认行为所进行的奖励。
按比特币网络的设计,在最初,每确认一笔交易(即每完成一次挖矿),矿工(记账的电脑)就会得到50个比特币作为奖励。这个奖励数目,大约每隔四年就会减半。因为第一笔比特币交易发生在2009年,现在两个多4年过去了,每次成功挖到矿得到的比特币是12.5个。
为什么是每四年就减半呢?
这是系统的硬性设定。中本聪在最初就将系统设定为:每产生210,000个区块之后,就将比特币奖励数量减半。因为比特币网络每出一个区块的时间约为10分钟,出完210,000个区块的时间大约是四年。
这就会帮助我们理解,为什么比特币的总量是趋于恒定的。其实中本聪在设计比特币的时候,并没有规定比特币总量是多少,而只是做了上面的设定。根据上面的设定,即每隔四年比特币奖励数量减半,到2140年,就基本不会再有新的比特币产生了(其实是,到那时新产生的比特币数量实在是太少了,可以让我们忽略不计)。到那时,比特币总数会在2100万个。
2
怎么挖矿?
我们说过,挖矿的本质是争夺记账权利,谁先抢到记账权,谁就得到比特币奖励。那么,怎样抢到记账权呢?
先让大家记住一个条件:谁先算出那个小于给定哈希值H0的哈希值H(x),谁就挖矿成功了。即,挖矿要求解决这样一个数学题:给定H0,要求算出x,使得H(x)<H0。有人可能会说,那我随便找一个小于H0的H(i),算出与之对应的x不就行了吗?
注意了,这就是哈希函数(数学上的一种函数,又称散列函数)不同于一般函数的地方。
对于一般的函数f(x)=y,给定y值,可以算出x。但是对于哈希函数H(x)=Y,给定Y值,不能倒推出x是多少。它是一个单向计算函数,只能由x算出H(x)。
那么计算H(x)时,输入值x是什么呢?这就是挖矿问题的关键。
我们先看下面的这张图,它是一个区块的结构图。上面灰色的部分是区块头(Header),下面蓝色的部分是区块体(Body)。区块头里包含4字节的版本号、32字节的上一个区块的哈希值、32字节的Merkle Root Hash(根哈希)、4字节的时间戳(当前时间)、4字节的当前难度值、4字节的随机数组成,加起来一共是80个字节。区块体则包含了一些交易信息形成的交易列表。
上面所说的需要输入的x值,就是区块头里面的这些字符串。这些字符串的特殊之处有两个:1)Merkle Root Hash是区块体里面的交易列表经过Merkle算法(Merkle算法是什么,我们留待以后再展开)得出的哈希值;2)除了随机数(nonce),其他字符都是知道的。因此,计算H(x)<H0,其实是找一个随机数(nonce)。如上面所述,因为哈希函数无法倒推,因此,只能通过不断尝试的办法,去找这个4字节的随机数。说白了,就是猜。
谁先猜到这个随机数(nonce),谁就挖矿成功了。
这样,我们就能回答文章开头的问题了:
矿机在干什么?在不断尝试随机数(nonce),以便把它和区块头里其他的字符串一起输入哈希函数H(x)之后,使得H(x)小于系统给定的值H0。
增加算力有什么用?以前用CPU就能挖到矿,但随着矿机越来越多,竞争越来越激烈,后来有人开始有人用GPU,就是我们电脑显卡用到的处理器;再后来,专门的挖矿芯片(ASIC)出来了,算力进一步提高。增加算力就相当于一次次让数学更好的人来参与这个解题过程。
为什么建矿池?矿池就是我邀请人组成一队,越多越好。这样一来,我人数多,每一次都可同时列举多个nonce值来试,因此,我方的赢面会大一些。
接着说计算哈希函数的挖矿过程。如果某个节点发现自己找出了符合条件的随机数(nonce),就把它广播给区块链网络上的其他节点,其他节点代入这个随机数(nonce)进行验证,发现确实满足H(x)<H0这个条件,那么就投票表示认可他计算的结果。于是,这个人获得了这一轮的记账权。
他就把新生成的区块(新的区块头生成了:有新的时间戳、随机数、前一区块哈希值、Merkle Root等)放到已有的区块链上,其他节点紧接着拷贝过来。然后,下一轮的挖矿开始,即,因为要输入进H(x)的x里,其他字符都更新了,需要猜新的随机数(nonce),使得这一回合的H(x)<H0。
比特币发放
伴随挖矿成功,系统就会奖励给这个节点一些比特币(今年是12.5个)。这个记录(即,谁在什么时候得到了多少的比特币)也会被写在这个区块里。由此可知,比特币其实只是一条记录,一个权益证明。这个记录显示是谁拥有这些比特币,那么他就拥有这么多的比特币,不必给某人一张纸或者其他东西来证明。这也是称它为虚拟货币的原因所在。
3
比特币挖矿的优缺点
比特币挖矿的优缺点与它的POW共识机制息息相关。
优点
1)去中心化
PoW理论上是将记账权利平均分配给网络上的各个节点。但随着矿池越来越多,越来越大,这一优点正在被削弱。
2)安全性高
要控制这个网络,必须拥有全网50%以上的算力,要达到这样的程度,成本要求是非常高的,因此,安全性很高。
缺点
1)能源浪费
从前面可以看出,猜nonce值的过程,从某种程度上说没有任何意义。而因为需要猜的次数特别多,这就会让计算机耗费大量电力。据说,现在全球比特币网络挖矿每天的能量损耗相当于荷兰整个国家的电力损耗。因此被很多人诟病为造成巨大的能源浪费。
2)效率低下
对于比特币网络,每10分钟才出一个区块这样的硬性设定,让记账的速度非常缓慢。现在每秒交易量上限是7笔(visa的平均每秒交易量上万,支付宝峰值接近9万),不适合商业应用。
4
其他挖矿方式
严格意义上,只有采用POW共识机制的区块链需要挖矿,比如上面所说的比特币。对于其他同样以POW为共识机制的山寨币,比如比特莱特币(LiteCoin),比特现金(BitCash),他们的挖矿过程和比特币几乎是一样的。
广义的挖矿还有其他方式。比如POS,它的挖矿其实是一个利息分配的问题。PoS根据币龄和来分配收益。币龄=持币量X持币天数。假设某个采用PoS共识机制的区块链规定的币息是2%,某个人拥有1000个该Token,而这1000个Token他有90天没动过了。在第91天,他决定转出几个Token。那么,他在这前90天就相当于在挖矿,挖到矿的数量是:
POS在开启下一轮挖矿的时候,之前的币龄会被清空。