你好,欢迎收听众享区块链大讲堂,今天我们要讲的是共识机制。
前两节我们介绍了比特币的基础知识:交易与区块。本质上来讲,区块是构成区块链的单元,它记录着比特币网络上各个元素的状态,而交易就是改变这些状态的方法。不仅比特币,其它区块链系统也都沿用了状态+方法这一思想。
在本节课中呢,我会向大家介绍一下比特币网络的共识机制。因为共识非常重要,它是所有区块链系统的生存基础。脱离了共识的区块链系统就只能是一个单机程序,对整个网络生态来说毫无意义。
共识的基本概念
社会上只要有两个及以上的主体参与的事件都必须有一个共识,只有达成了共识,事件才能合理通畅地进行下去。
共识在现实生活中非常重要,比如银行的清算系统,就是共识的一个真实写照。我们举个简单的例子,假如Alice要给Bob转帐100元人民币,Alice的钱存在中国银行,而Bob只有建行的帐户。大家都知道,银行间转帐其实并不是什么难事,各个银行可以通过跨行转帐的接口来实现。但是不知道大家有没有想过,这跨行转账背后发生了什么事。
其实跨行转帐的背后都有一个中心系统,在中间协调两个银行之间的帐务,当你进行转帐的时候,资金其实并没有进入接收行,只是在帐面上显示一个数字而已。事实上资金从中国银行到建行是在清算环节做的,是工作时间结束后银行进行对帐时,一次性在各银行间转帐实现的。在这里,清算就是我们提到的共识,但这个共识呢,是由清算中心来决定的。
对比特币来讲,每个矿工都有权利生成新区块,那么生成区块应该制定什么样的标准呢?应该选用谁的区块作为整个链的新区块呢?这就是比特币网络共识机制要解决的两个问题。
如何达到难度目标
说白了,一个合法的区块,就是这个区块的区块头的哈希值小于某一个阈值,或者说哈希值必须是以连续几个0开始。
那矿工是如何操作才使得区块头的哈希值达到目标呢?
回想我们以前讲过的区块头的组成,是由版本号、父区块哈希值、交易的Merkel树根、时间戳、难度目标以及一个随机数,这六部分组成。要想得到不同的区块头哈希,我就得不断改变这六个部分中的一个或者几个。在这六部分里,版本号、父区块哈希值和难度目标在产生这一个区块的时候,都是不能由矿工随便更改的,那就只剩下Merkel树根、时间戳和随机数了。矿工就是通过改变这三个字段来使区块头发生变化,从而获得一个满足难度目标的哈希值,那应该如何改变这些值呢?是否有一定的规则呢?
首先可以改变的是随机数nonce(nonce是Number once的缩写,在密码学中nonce是一个只被使用一次的任意或非重复的随机数值)。这个随机数字段的设计,就是为了在不改变交易的前提下,简单进行一个整数的递加操作,来影响整个区块头内容的一种方式。在区块生成过程中,我们通常的做法是把nonce的值从0到2的32次方这些数值挨个减1遍历一遍,直到找到一个合适的nonce值,使得区块头哈希满足难度目标的要求。
这时有人会问如果nonce遍历一遍以后,还是找不到一个合适的值满足难度目标,要怎么办呢?其实在比特币网络的算力还不像今天这么大的时候,矿工们是可以通过修改时间戳,然后再重新遍历nonce的。有的人就要问了,为什么可以更改时间戳呢,时间戳不是代表这个区块的创建时间吗?其实这很好理解,因为你在遍历nonce并重新计算哈希值的过程也在消耗时间,一轮nonce的遍历过后,时间也会在秒级上流逝。所以一轮nonce遍历过后,可以通过再次获取最新时间的方法来进行。
领取专属 10元无门槛券
私享最新 技术干货