32

区块链共识机制之工作量证明(POW)

 4 years ago
source link: https://learnblockchain.cn/2019/11/20/Consensus-POW/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

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

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

共识机制在区块链中

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

区块链上矿工的工作

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

2UvuM3Z.jpg!web

可能存在的问题

根据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协议,唯一的也是最重要的不同就在于它选择主链的方式。

jQvEFjR.jpg!web

以太坊的出块时间只有十多秒,缩短出块时间就意味着难度降低,同一时间能出块的矿工就会变多,分叉概率就会大大升高,如上图,这种情况下如何维护一条主链。这就是GHOST的精妙之处,在比特币的最长链规则下,要避免出现分叉,而在GHOST协议下,却是利用分叉来保护区块链的安全性,如下图:

UzIVf2E.jpg!web

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

本文来自社区共建者 影无双

深入浅出区块链 - 打造高质量区块链技术博客,学区块链都来这里,关注 知乎 、微博 掌握区块链技术动态。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK