比特币是一个价值传输网络,参与比特币系统运作的人(包括用户),就是网络中一个个节点,节点彼此等权,没有中心,相互之间连接完全自由,各自保存着完全一致的比特币账本,运行着遵循相同规则的比特币程序。任何人都可以加入比特币网络,新加入比特币网络的节点,都可以向原有节点要一份比特币账本。
用比特币付款,需要向比特币网络广播付款信息(这里的“广播”意思是向比特币网络中多个节点发送付款信息),收到信息的节点验证信息后会继续广播,一传十,十传百,转瞬间付款信息就会传遍全网,然后由某一记账者记入区块链账本中。
那么,为什么就有人来记比特币的账呢?既然谁都可以记账,那又以谁的账为准呢?怎么确保账本的真实性呢?比特币又是怎么发行出来的呢?
首先,按照比特币的规则,记账是有奖励的。一部分奖励是账单里用户出的手续费,手续费以比特币支付,这个手续费由用户自己定,可高可低,给得高,记账者就倾向于先记这笔手续费高的账。另一部分奖励则是区块奖励,打包一个区块,就获得一定的区块奖励。按照比特币的规则,区块奖励起初为50个比特币,每出210000个区块后,奖励减半,差不多每4年减半一次。区块奖励一方面调动了大家去记账,另一方面也完成了比特币的发行。按照上述规则,我们可以通过这个式子计算比特币的总量,就是210000×50×(1+1/2+1/4+……),总共2100万个。区块奖励和手续费是记账者按照比特币的规则自己记给自己的。
有了奖励,而且奖励颇丰,大家当然抢着去记账。为确定以谁的账本为准,比特币有个最长链原则,谁的区块链账本最长,就以谁的账本为准。制造区块需要进行大量计算,最长链实际就是凝聚着最大工作量的链。最长链也是最新的账本,记录着最多的账单。
记账者把账单收集起来(记账者会先验证账单真伪,还会验证付款者有无足够的币进行支付),打包成一个区块。区块由区块头和区块体组成,区块头里有个记账者自定的随机数,有个难度目标,还有些别的信息。记账者换上不同的随机数,对区块头进行哈希运算,得到区块头的哈希值,算出的一个个哈希值就像生成了一个个随机数一样,大小毫无规律,谁先试出小于难度目标的哈希值,他就将该哈希值对应的区块加在区块链上,广播给别人,这时候他的链就更长了,大家验证区块无误后,就都以他的区块账本为准,并继续广播该区块至全网。表明以该区块为准的方式,就是将该区块头哈希值纳入自己要计算的下一个区块头中。
这个区块头和区块体是什么关系呢?区块体里记录了具体的账单,包括记账者自己所得区块奖励和手续费的账单。区块头则相当于该区块的身份信息,里面有版本号、上一个区块头的哈希值、时间戳、难度目标、随机数,还有一个Merkle树根哈希值,Merkle树根哈希值由区块体里的账单经过一系列哈希运算得到,相当于区块体里那些账单的摘要信息,只要账单稍有变化,Merkle树根哈希值就会大不相同。同样,只要区块头稍有变化,区块头哈希值就会大不相同。通过Merkle树根哈希值,区块体和区块头紧密联系在了一起,账单无法篡改;区块头的哈希值前后衔接,又保证了区块链环环相扣,无法篡改。
这个哈希运算和哈希值是怎么回事呢?哈希算法又被称为摘要算法,输入任何数据,经过哈希运算后,都会得到一个固定长度的输出值,称为该输入数据的哈希值,一个输入数据的哈希值是唯一且确定的。哈希运算还有两大特点。第一,哈希运算的结果,就像生成了一个随机数一样,只要输入数据稍有变动,哈希值就会大不相同,比如输入一本书的内容,只要多加一个字,哈希值就会面目全非。第二,哈希运算不可逆,输入数据后可以很快算出哈希值,但给出哈希值,就没法反推它的输入数据。反推输入数据在逻辑上也是不可能的,因为输入数据无限,哈希值有限,一个哈希值对应着多个输入数据。
哈希运算和哈希值有各种类型,争夺比特币记账权时算的哈希值是个256位的二进制数。按照比特币的规则,区块头哈希值须小于难度目标,记账者换上不同随机数,对区块头进行哈希运算,算出哈希值就像生成随机数一样,每个数位都可能是0或1,总共有2^256种可能,要求算出的哈希值比难度目标小,就好比在这2^256个数中随机抽出一个数,要求其小于难度目标。算出的哈希值比难度目标小的概率是:难度目标/2^256。要试出比难度目标小的哈希值,平均试验次数为:2^256/难度目标。
算出的哈希值前面数位0越多,值就越小,所以也可以不太严谨地认为,算出的哈希值前面若干数位都是0,就可以满足小于难度目标的要求。例如,哈希值前面70位都为0就小于难度目标(此时难度目标的值是2^186)。算出哈希值就像生成随机数一样,每个数位上出现1和0的概率各是1/2,一次就试出前面70位都是0的哈希值,概率是1/2^70(也可以通过2^186/2^256算得),想增大试出的概率只能做更多哈希运算。全世界想获得比特币奖励的人都会加入比特币网络,收集账单,打包成区块,进行哈希运算,全世界总共要计算2^70次才有一次机会(不同的人打包的区块里账单不一样,Merkle树根哈希值不一样,即使不同的人输入的随机数一样,计算出的区块头哈希值还是不一样,这样就能避免大家出现重复计算的情况,保证全世界平均计算2^70次,算出一次前面70位都是0的哈希值)。谁先试出了前面70位都是0的哈希值,他就立马将该哈希值对应的区块广播出去。大家一接收到该区块,验证无误后,就继续广播该区块,并以此为准,在此基础上继续收集账单继续计算,争夺下一个区块的记账权。区块链就这样在大家的齐心协力下不断延长,全网的节点都有一份相同且实时更新的区块链账本。验证、广播、记账等过程,都是由各个节点的比特币程序根据比特币规则自动执行的。
这种试出符合要求的哈希值并获得记账权和比特币奖励的行为,被称为挖矿,专门进行这种计算的机器,就称为矿机,干挖矿这行的人,就叫矿工,记账的手续费,就叫矿工费。
至于难度目标到底是多少,则是由比特币的程序每隔2016个区块就自动调节一次的,根据之前出块速度和之前难度目标反推全网算力,再根据全网算力设置一个合适的难度目标,让全网平均10分钟能出一个块。这样一来,谁的计算能力强,谁在单位时间内计算次数多,谁就有更大的概率试出符合要求的哈希值,获得记账权和比特币奖励,这种共识机制也被称为工作量证明(PoW)。在工作量证明的机制下,挖矿需要耗费巨大电力。
世界各地的矿工竞相寻找便宜的电力,修建矿场,布置矿机,就形成了目前浩浩荡荡的挖矿局面。由于现在全网算力很高,挖矿难度很大,单枪匹马已经很难挖到矿了,于是大家把算力集中到一个个矿池,矿池更容易挖到矿,然后再按各自贡献的算力大小相应分配收益。
可以看出,比特币的区块链账本是传遍了全网的,保存在全网的,大家都验证过了的,区块链通过Merkle树根哈希值和区块头哈希值环环相扣,累积了巨大的工作量,账本真实可靠,无法篡改,无法销毁。比特币用于转账或支付只需发出一条信息就行了,不用经过任何中心机构,可以轻易地全世界流通。
我们也可以看出,想试出哈希值有多么困难,只要求哈希值前面70位是零,都要试上2^70≈1.18×10^21次才有一次机会,若想试出整个哈希值,全世界所有超级计算机计算能力翻一亿倍,一起算上几万亿年,也试不出来。这些算法,就是比特币安全性的保障。