共识算法是指一种数据保存、处理和传输过程中,参与方之间通过特定的算法协商达成共识的一种算法模型。其目的是让各个参与方能够达成一致的结果,避免出现同时存在多个结果的情况,以保证最终的结果的有效性和可信度。
PoW (Proof of work) 工作量证明
PBFT (Practical byzantine fault tolerance) 实用拜占庭容错
PoS (Proof of stake) 权益证明
DPOS(Delegated proof of stake) 委托权益证明
Ripple 瑞波
Tendermint
PBFT (Practical byzantine fault tolerance) 实用拜占庭容错
通俗的解释就是大家共同商定好的一种规则,大家为了一个共同的目的共同达成的一个认知。区块链网络节点达成的记账共识与拜占庭将军问题的攻城是相似的,可以将区块链中的节点比作将军,不会背叛的将军比作正常节点,会背叛的将军比作恶意节点。
为了方便理解,我们假设有甲、乙、丙、丁 4 位将军攻城。同时有 3 位将军进攻视为进攻成功。我们假设将军乙为叛徒,将军甲派出通信兵告诉其他 3 位将军子时进攻,因为将军乙是叛徒,他收到将军甲的消息后,派出通信兵告诉将军丙和将军丁丑时进攻。将军丙收到将军甲的消息派出通信兵告诉将军乙和将军丁子时进攻。将军丁收到将军甲的消息派出通信兵告诉将军乙和将军丙子时进攻。于是:
将军乙收到:子时、子时、子时;
将军丙收到:子时、丑时、子时;
将军丁收到:子时、丑时、子时;
这样每个将军执行自己收到的最多的消息。将军丙和将军丁收到的子时进攻消息最多,将军甲、将军丙、将军丁 3 位将军于子时进攻,进攻成功。这就是 PBFT 算法,在研究拜占庭将军问题时,分布式节点总数必须大于或等于4,且恶意节点不能超过三分之一时,就可以保障节点达成一致性结果,区块链的中的各个节点按照这种算法即可达成共识。
PoW (Proof of work) 工作量证明
PoW的方法最直观——哈希函数是密码学上计算难度经过反复验证的东西,所以用它来做证明是最有效不过的。每发一条消息(上传一个区块)的时候,你要证明你付出了一定的算力,你的证据就是某串你加在区块里的无意义字符串,而加上这个字符串之后,你的区块的哈希值正好小于某个数。哈希函数的特性告诉我们,你没有任何取巧的方法可以做到这一点——唯一的可能是,你真的一个一个字符串地去试了。所以,我们知道你确实付出了很多的代价才能给出这么一个字符串。
然而,PoW不是没有缺陷,除了大量消耗能源之外,PoW的另外一个问题是它的价值回路必须要通过外部输入。
PoS (Proof of stake) 权益证明
POS的设想是非常好的——采用POS的货币的安全性直接与使用者相关,省去了矿工这个媒介。POS简单说就是,每当发表一条消息的时候,不用证明你付出了什么代价,而要证明你拥有一定数量的钱。而拥有钱代表着,如果你作弊损害了这个系统的安全性,你的钱会贬值,这变相地让你付出了代价。这东西更好的一点是,如果采用POS,实际上连挖矿奖励都不需要,因为POS实际上不需要付出任何代价。
然而,对于没钱的人而言,他们没代价可付,所以一些恶意行为对于他们是有益的,这就会导致著名的公地悲剧。这种叫Nothing-at-stake attack(无利益攻击),所有POS算法,必须有对付这种攻击的机制,否则就不能用。
DPOS(Delegated proof of stake) 委托权益证明
PoS 是根据节点的持币数量与持币时间争取记帐权, 而 DPoS 则是以网路中利益相关人的选票选择记帐节点。
DPoS 网路中,有两个重要的角色「见证人」与「利益相关者」
「见证人」或可称为超级节点,其工作是为区块链添加新的区块,也就是记帐。
「利益相关者」也就是网路中的持币者,能够透过交易所或钱包,在抵押代币后选择要支持谁来担任验证人,利益相关者持有的代币越多,投票的权重就越高,而有些验证人会提供分红,将挖矿奖励分享给支持他的利益相关者。
DPoS 的一个重要特点是,任何系统参数都可以通过利益相关者的投票进行更改。
Ripple 瑞波
Ripple(瑞波)是一种基于互联网的开源支付协议,可以实现去中心化的货币兑换、支付与清算功能。在 Ripple 的网络中,交易由客户端(应用)发起,经过追踪节点(tracking node)或验证节点(validatingnode)把交易广播到整个网络中。追踪节点的主要功能是分发交易信息以及响应客户端的账本请求。验证节点除包含追踪节点的所有功能外,还能够通过共识协议,在账本中增加新的账本实例数据
Ripple 共识算法:
Ripple 的共识达成发生在验证节点之间,每个验证节点都预先配置了一份可信任节点名单,每个验证节点都预先配置了一份可信任节点名单,称为 UNL(Unique Node List)。在名单上的节点可对交易达成进行投票。每隔几秒,Ripple 网络将进行如下共识过程:
1)每个验证节点会不断收到从网络发送过来的交易,通过与本地账本数据验证后,不合法的交易直接丢弃,合法的交易将汇总成交易候选集(candidate set)。交易候选集里面还包括之前共识过程无法确认而遗留下来的交易。
2)每个验证节点把自己的交易候选集作为提案发送给其他验证节点。
3)验证节点在收到其他节点发来的提案后,如果不是来自 UNL上的节点,则忽略该提案;如果是来自 UNL 上的节点,就会对比提案中的交易和本地的交易候选 候选集,如果有相同的交易,该交易就获得一票。在一定时间内,当交易获得超过 50%的票数时,则该交易进入下一轮。没有超过 50%的交易,将留待下一次共识过程去确认。
4)验证节点把超过 50%票数的交易作为提案发给其他节点,同时提高所需票数的阈值到 60%,重复步骤 3)步骤 4),直到阈值达到 80%。
5)验证节点把经过 80%UNL 节点确认的交易正式写入本地的账本数据中,称为最后关闭账本(Last Closed Ledger),即账本最后(最新)的状态。
Ripple是一种利用较大网络中的集体信任子网络的共识算法。在网络中,节点分为两种类型:参与共识过程的服务器和只转移资金的客户端。每台服务器都有一个唯一的节点列表(UNL)。UNL对服务器很重要。当确定是否将事务放入分类帐时,服务器将查询UNL中的节点,如果收到同意的数目已达到80%,该事务将被打包到分类帐中。对于节点,只要UNL中故障节点的百分比小于20%,分类帐将保持正确。
Tendermint
Tendermint属于拜占庭容错算法,它针对PBFT(实用拜占庭容错算法)做了优化,只需要有两轮即可达成共识。
投票
简单地说,Tendermint里面对高度为h的块共识的每一轮包括3个步骤:Propose(提议),Prevote(预投票),Precommit(预提交)。
当在某一轮达成共识(收到大于2/3的Precommit投票)后,就会进入对下一个高度的共识,从第0轮开始 。 Tendermint中有个很重要的概念:PoLC,全称为Proof of Lock Change,表示在某个特定的高度和轮数(height,round),对某个块或nil(空块)超过总结点2/3的Prevote投票集合,简单来说PoLC就是Prevote的投票集。Tendermint中的参与者叫做 “验证人”(validator)。他们轮流对交易区块进行提议,并对这些区块进行投票。区块会被提交到链上,每一个块占据一个高度h。当然提交块可能会失败,如果失败就会开始下一轮的提交。 要想成功提交一个块,需要有两个阶段的投票:预投票和预提交。在同一轮提交中,只有超过2/3 的验证人对同一个块进行了预提交,这个块才能被提交到链上。假设少于1/3的验证者是拜占庭,Tendermint保证安全永远不会被破坏。也就是说验证者(2/3以上)永远不会在同一个高度提交冲突的区块。因此,基于Temdermint的区块链永远不会分叉。