像比特币、以太坊、NXT、Bitshares等这些区块链系统,其本质上是一种加密经济组织,它建立在点对点网络上,是去中心化、无管辖的,由密码学、经济学和社会共识来共同维护。这些加密网络因各种原因有着多种不同的风格——有些基于ASIC的工作量证明(PoW)、有些基于GPU的工作量证明、有些原生权益证明(PoS)、有些授权股权证明(DPOS)、还有我们即将见到的Casper权益证明——这些不同的风格都有着他们的哲学,在学习共识机制的时候,更重要的是理解其中的思想。
“共识”,其汉语解释为共同的认识。相互没有联系的彼此,对一个特定问题持有共同的看法,除了因为一些不可控的道德、价值等方面的共识,规则的作用是非常重要的。
共识机制,就是游戏的规则,社会的法律,是人们共同采用的达成和维护共识的方式,也就是所有人都认可并遵守的规则,这也是区块链的灵魂所在。
区块链是去中心化的,没有一个指挥中心来告诉每个节点什么时候该做什么。所有网络上的参与者(节点)在共识机制下工作,他们一起协作完成一个按时间顺序的可信的公共账本(公开的数据库),并且每个节点都保存一份完整的数据备份,每个节点的数据内容必须完全一致。
区块链上,每个矿工都在努力打包交易数据,某矿工a打包了一个数据块,他把这个数据块向全网广播,其他矿工收到这个块后对数据进行验证,确认无误就把这个块存起来,停止当前的打包工作,继续下一次打包,以此延长区块链。
根据FLP原理。Impossibility of Distributed Consensus with One Faulty Process一文提出:在一个异步系统中我们不可能确切知道任何一台主机是否死机了,因为我们无法分清楚主机或网络的性能减慢与主机死机的区别,也就是说我们无法可靠地侦测到失败错误。当多个主机通过异步通讯方式组成网络集群时,这种异步网络默认是不可靠的。
在这个不可靠的网络上,数据会有延迟,也可能丢失,然而每个矿工都在都默默的做着自己的工作,努力的打包、存储数据块,不会问别人打包的情况,那么:
另外,所有在这个网络上工作的矿工们,他们会思考:
在网络上一定会存在一些恶意的矿工,比如:矿工a不广播他的数据块,而是直接在后面默默的继续打包
区块链的共识机制,主要就是为了解决这些问题,目前,已经发展出了多种机制,每种机制都有利有弊,本文主要简单介绍工POW (Proof of Work) 工作量证明,之后会继续专门介绍其他共识机制。
最早的比特币区块链所使用的共识机制,以消耗掉大量算力竞争出块。
比特币区块链上有一个共识——始终以最长连为主链(有效链),也即 “最长链规则”。各节点都以数据块最多的一条链作为自己添加、更新区块的选择。这个规则对于工作量证明来说,无疑是一个神教,主链必然是广大矿工消耗最多经济资本创造出来的链。所有不合法、不在主链上的区块,最终都会被丢弃,以此维护一个权威的公共账本。
矿工挖矿的过程就是找到nonce的值,使得下面的公式成立:
SHA256(SHA256(version + prev_hash + merkle_root + ntime + nbits + nonce )) < TARGET
version: block的版本
prev_hash:上一个block的hash值
merkle_root:需要写入的交易记录的hash树的值
ntime:更新时间
nbits:当前难度
其中TARGET不是恒定不变的,在比特币区块链中,每2016个块(约14天)会根据这段时间出块的速度做调整,使出块速度保持在约10分钟,也就是难度控制。
在这2016个块的时间段内,哈希运算的难度是一定的,对每个矿工来说都是公平的,需要竞争的就是速度和运气了,谁拥有更多的算力,谁就有更高的概率在竞争中胜出,更快打包出块。
所以比特币区块链的工作量证明真的是一个非常纯粹的力气活,有时也会把它叫经典POW。
为什么需要等这么长时间,在这10分钟里,比特币系统在干什么?
这么长的时间,因为网络传输导致的数据问题概率大大减小,尽可能大的保证了所有矿工都收到广播并验证数据,但其实,传输和验证也并不需要10分钟那么长,其中90%的时间都用来进行哈希运算,因为这个运算的难度真的很大。也正是这样足够大的难度,才尽可能保证不同矿工同时出块的概率比较小,从而控制区块链少出现分叉。
在最长链规则下,即使区块链出现了分叉,随着时间的推移,两个链会变得不一样长,那么相对较短的一条链就会被丢掉,从而保持只有一条主链。
所以,比特币区块链的数据一致性,是建立在放弃交易处理效率的基础上的。
在POW共识机制下,如果某个节点拥有全网51%以上的算力,那么他就可以实现51%攻击(双花攻击)。所以区块链上,算力越多越分散,越安全。那么就需要保持矿工的活力,要有足够的激励让矿工努力挖矿,并且不断有新的矿工加入,这个激励就是丰厚的区块奖励和交易费用。
在比特币区块链上,区块奖励从最初的50个比特币,每四年衰减一半,现在只有12.5个了。但在区块奖励减少的同时,流通的比特币变多了,交易费也变多了,交易费的竞争更加促进了矿工的积极性,以此保障了比特币区块链的健壮性。
POW区块链的安全是建立在巨大的电力消耗上的,有新闻指出,2019年用于比特币挖矿的耗电量超过了瑞士全国用电量。
到这里,相信已经对共识机制以及POW有了初步的认识,下面再看看以太坊的POW共识机制。
阅读以太坊发展简史,我们知道目前以太坊依然是POW共识机制。据最新消息,2019年12月将发布伊斯坦布尔(Istanbul)升级,此时以太坊将从POW过渡到POS。有兴趣的小伙伴可以了解一下以太坊2.0的美好图景。
与比特币的最长链规则相比,以太坊的GHOST协议,唯一的也是最重要的不同就在于它选择主链的方式。
以太坊的出块时间只有十多秒,缩短出块时间就意味着难度降低,同一时间能出块的矿工就会变多,分叉概率就会大大升高,如上图,这种情况下如何维护一条主链。这就是GHOST的精妙之处,在比特币的最长链规则下,要避免出现分叉,而在GHOST协议下,却是利用分叉来保护区块链的安全性,如下图:
在以太坊的GHOST协议中,引入了叔块,如上图。当分叉出现时,矿工m0可以在挖区块2时引用1a、1b作为叔块,当m0挖出区块2时,矿工m1、m2就可以得到区块奖励的7/8,同时m0可以额外得到区块奖励的1/32×2。而矿工m1、m2在收到区块2的广播时会验证并发现m0挖矿的链更长,于是放弃手里的工作,转而在区块2后面继续挖矿。
在引用叔块时,最多同时引用2个,即m0一次引用叔块最多得到1/32×2的奖励
给叔块的奖励会随着离叔块的距离每增加1而减少1/8,直到距离到第8个块时不再有叔块奖励,如上图中区块1引用两个叔块1c、1d,矿工m3、m4分别得到7/8的区块奖励
通过这种方式,可以在网络中产生很多分叉,并且激励矿工在发现最长链时尽快合并,让更多的矿工在主链上挖矿。只要通过难度控制,保持主链和全网出块率不超过一个安全阀值,就可以有效抵御双花攻击。
在工作量证明的逻辑下,区块链会消耗大量能量,并且它的攻击和防守成本是1:1,并没有防守优势。但是我们依然不可否认其在区块链中的价值,它在自由市场和博弈论的基础上建立起来,为之后的其他共识机制奠定了基础。
本文首发于系统学习区块链技术博客——深入浅出区块链