区块链共识机制之工作量证明(POW) - 区块链技术学徒

时间:2024-01-25 22:31:50

像比特币、以太坊、NXT、Bitshares等这些区块链系统,其本质上是一种加密经济组织,它建立在点对点网络上,是去中心化、无管辖的,由密码学、经济学和社会共识来共同维护。这些加密网络因各种原因有着多种不同的风格——有些基于ASIC的工作量证明(PoW)、有些基于GPU的工作量证明、有些原生权益证明(PoS)、有些授权股权证明(DPOS)、还有我们即将见到的Casper权益证明——这些不同的风格都有着他们的哲学,在学习共识机制的时候,更重要的是理解其中的思想。

“共识”,其汉语解释为共同的认识。相互没有联系的彼此,对一个特定问题持有共同的看法,除了因为一些不可控的道德、价值等方面的共识,规则的作用是非常重要的。

共识机制,就是游戏的规则,社会的法律,是人们共同采用的达成和维护共识的方式,也就是所有人都认可并遵守的规则,这也是区块链的灵魂所在。

共识机制在区块链中

区块链是去中心化的,没有一个指挥中心来告诉每个节点什么时候该做什么。所有网络上的参与者(节点)在共识机制下工作,他们一起协作完成一个按时间顺序的可信的公共账本(公开的数据库),并且每个节点都保存一份完整的数据备份,每个节点的数据内容必须完全一致。

区块链上矿工的工作

区块链上,每个矿工都在努力打包交易数据,某矿工a打包了一个数据块,他把这个数据块向全网广播,其他矿工收到这个块后对数据进行验证,确认无误就把这个块存起来,停止当前的打包工作,继续下一次打包,以此延长区块链。

矿工

可能存在的问题

根据FLP原理。Impossibility of Distributed Consensus with One Faulty Process一文提出:在一个异步系统中我们不可能确切知道任何一台主机是否死机了,因为我们无法分清楚主机或网络的性能减慢与主机死机的区别,也就是说我们无法可靠地侦测到失败错误。当多个主机通过异步通讯方式组成网络集群时,这种异步网络默认是不可靠的。

在这个不可靠的网络上,数据会有延迟,也可能丢失,然而每个矿工都在都默默的做着自己的工作,努力的打包、存储数据块,不会问别人打包的情况,那么:

  • 有可能多个矿工打包了同一个交易
  • 可能矿工b和矿工c都打包并广播了数据块,矿工d和矿工e分别收到了来自b和c的块,都验证通过并存储了数据

另外,所有在这个网络上工作的矿工们,他们会思考:

  • 我为什么要那么努力,我能得到什么
  • 我需要具备什么条件才可以出块
  • 如果我打包的数据块没有通过验证,我的这次努力有回报吗

在网络上一定会存在一些恶意的矿工,比如:矿工a不广播他的数据块,而是直接在后面默默的继续打包

区块链的共识机制,主要就是为了解决这些问题,目前,已经发展出了多种机制,每种机制都有利有弊,本文主要简单介绍工POW (Proof of Work) 工作量证明,之后会继续专门介绍其他共识机制。

工作量证明(POW)

最早的比特币区块链所使用的共识机制,以消耗掉大量算力竞争出块。

比特币的最长链规则

比特币区块链上有一个共识——始终以最长连为主链(有效链),也即 “最长链规则”。各节点都以数据块最多的一条链作为自己添加、更新区块的选择。这个规则对于工作量证明来说,无疑是一个神教,主链必然是广大矿工消耗最多经济资本创造出来的链。所有不合法、不在主链上的区块,最终都会被丢弃,以此维护一个权威的公共账本。

矿工挖矿的过程就是找到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%的时间都用来进行哈希运算,因为这个运算的难度真的很大。也正是这样足够大的难度,才尽可能保证不同矿工同时出块的概率比较小,从而控制区块链少出现分叉。

在最长链规则下,即使区块链出现了分叉,随着时间的推移,两个链会变得不一样长,那么相对较短的一条链就会被丢掉,从而保持只有一条主链。

所以,比特币区块链的数据一致性,是建立在放弃交易处理效率的基础上的。

关于51%攻击

在POW共识机制下,如果某个节点拥有全网51%以上的算力,那么他就可以实现51%攻击(双花攻击)。所以区块链上,算力越多越分散,越安全。那么就需要保持矿工的活力,要有足够的激励让矿工努力挖矿,并且不断有新的矿工加入,这个激励就是丰厚的区块奖励和交易费用。

在比特币区块链上,区块奖励从最初的50个比特币,每四年衰减一半,现在只有12.5个了。但在区块奖励减少的同时,流通的比特币变多了,交易费也变多了,交易费的竞争更加促进了矿工的积极性,以此保障了比特币区块链的健壮性。

POW区块链的安全是建立在巨大的电力消耗上的,有新闻指出,2019年用于比特币挖矿的耗电量超过了瑞士全国用电量

到这里,相信已经对共识机制以及POW有了初步的认识,下面再看看以太坊的POW共识机制。

以太坊的POW共识机制

阅读以太坊发展简史,我们知道目前以太坊依然是POW共识机制。据最新消息,2019年12月将发布伊斯坦布尔(Istanbul)升级,此时以太坊将从POW过渡到POS。有兴趣的小伙伴可以了解一下以太坊2.0的美好图景

以太坊的GHost协议

与比特币的最长链规则相比,以太坊的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,并没有防守优势。但是我们依然不可否认其在区块链中的价值,它在*市场和博弈论的基础上建立起来,为之后的其他共识机制奠定了基础。

本文首发于系统学习区块链技术博客——深入浅出区块链