区块链系统采用分散式设计,网络节点分散且相互独立。因此,由不同节点组成的系统必须依靠一个系统来维护系统的数据一致性,奖励提供区块链服务的节点,惩罚恶意节点。
这个制度的建立需要依赖一套方法和规则,即由谁取得一个区块的打包权(或称记账权),并获取该区块的奖励或者怎样界定谁是作恶者,让他受到怎样的惩罚,这套方法和规则便是共识机制。
目前,区块链使用了许多共识算法,其中包括:工作量证明(Proof of Work,PoW)算法、权益证明(Proof of Stake,PoS)算法、股份授权证明(Delegated Proof of Stake,DPoS)算法、实用拜占庭容错(Practical Byzantine Fault Tolerance,PBFT)算法。.
1 PoW算法
PoW算法是一种防止分布式服务资源被滥用和拒绝服务攻击的机制。
PoW算法要求节点执行消耗适当时间和资源的复杂操作,结果可以被其他节点快速检查,以时间和能量消耗为保障,确保服务和资源被真实需求所使用。比特币首次使用PoW算法验证交易,并向互联网广播区块。现在许多区块链人也使用PoW算法。PoW算法已经成为一种广泛使用的共识算法。
矿工执行消耗计算能力的哈希运算,算出“正确结果”并广播给全网,其他矿工或普通节点同步块并检查是否正确。
选民把选票投到了某个节点。如果某个节点被选为核算节点,那么核算节点在获得奖励后往往可以用任何方式来回报自己的选民。
这n个记账节点将轮流发出区块,节点之间相互监督。如果他们作恶,誓言将被扣除。
4 PBFT算法
PBFT算法解决了拜占庭的一般问题。
拜占庭是古代东罗马帝国的首都。为了自卫,每个封地都驻扎了一支由一名将军率领的军队,将军们只能通过信使传递信息。战争中,所有将领必须达成共识,决定是否一起开战。
但是,军队中可能会有汉奸,他们会影响将军们达成共识。拜占庭将军的问题是指当已知一些将军是叛徒时,剩下的将军如何达成一致的决定。
1982年,莱斯利兰波特等人在论文《拜占庭将军问题》中证明,当将军总数大于3f,叛徒数为F或更少时,忠诚的将军可以达成命令的一致,即3f ^ 1n,算法复杂度为O(nf ^ 1)。
米盖尔卡斯特罗和巴巴拉利斯科夫在1999年发表了一篇论文《实用拜占庭容错》,提出了PBFT算法。算法的容错数也满足3f 1n,算法复杂度为O(n2)。
该算法可以提供高性能的操作,使系统能够每秒处理数千个请求,比旧系统更快。
PBFT算法的一致性过程
PBFT算法的共识过程如下:客户端发起消息请求并广播给每个副本,其中一个Leader发起建议消息预准备并广播。其他节点获得原始消息,并在验证完成后发送准备消息。每个节点接收2f 1准备消息,也就是说,它被认为是准备好的,并发送一个提交消息。当节点收到2f 1提交消息时,我们假设该消息已被确认并回复。