分布式共识协议
一、概述
总结:
私有链:封闭生态的存储系统,采用PAXOS、RAFT最佳联盟链:半公开半开放特性,采用拜占庭容错的PBFT算法比较合适公有链:POW、POS、DPOS是比较适合的高安全性的协议
RAFT与PBFT共识协议对比
容错节点类型
首先介绍一下节点类型:
故障节点:节点因为系统繁忙、宕机或者网络问题等其它异常情况导致的无响应拜占庭节点:可以故意对集群的其它节点的请求无响应,还可以故意发送错误的数据,或者给不同的其它节点发送不同的数据,使整个集群的节点最终无法达成共识
RAFT
只支持容错故障节点,假设集群总节点数为n,故障节点为 f ,根据小数服从多数的原则,集群里正常节点只需要比 f 个节点再多一个节点,即 f+1 个节点,正确节点的数量就会比故障节点数量多,那么集群就能达成共识
PBFT
系统中存在拜占庭节点,意味着该节点发布给其他不同节点的信息可能会是不一致的
假设系统节点数量为2f+1时,当前系统各个节点状态一致,下一个状态有两种情况,A情况和B情况。若仅仅收到f+1节点就认为是正确的,那么f个拜占庭节点在知晓其他诚实节点投票结果的前提下,显然,剩下的节点各有不同的投票结果。那么他们只需要给那些投票A情况的节点,发出信息说自己投的是A情况,给投票B情况的节点说自己投的是B情况。由于本身就有f个节点,那么诚实的节点必定会收到欺骗,那么系统就会存在A情况B情况两种,出现不一致。
算法复杂度
RAFT
核心共识过程是日志复制这个过程,这个过程分两个阶段,日志记录,提交数据。两个过程都只需要领导者发送消息给跟随者节点,跟随者节点返回消息给领导者节点即可完成,跟随者节点之间是无需沟通的。所以如果集群总节点数为 n,对于日志记录阶段,通信次数为n-1,对于提交数据阶段,通信次数也为n-1,总通信次数为2n-2,因此raft算法复杂度为O(n)
PBFT
核心过程有三个阶段,分别是pre-prepare阶段,prepare阶段和commit阶段。对于pre-prepare阶段,主节点广播pre-prepare消息给其它节点即可,因此通信次数为n-1;对于prepare阶段,每个节点如果同意请求后,都需要向其它节点再广播parepare消息,所以总的通信次数为n*(n-1),即n2-n;对于commit阶段,每个节点如果达到prepared状态后,都需要向其它节点广播commit消息,所以总的通信次数也为n*(n-1),即n2-n。所以总通信次数为(n-1)+(n2-n)+(n2-n),即2n2-n-1,因此pbft算法复杂度为O(n2)
二、开放式
POW
工作量证明,通过竞争记账的方式解决去中心化的记账系统的一致性问题, 即以每个节点的计算能力即“算力”来竞争记账权的机制。
1. 区块头
如下图所示,区块头由上一区块哈希,时间戳,难度值,随机调整数(nonce),Merkle根.
2. 相关术语
难度值
难度值是比特币系统中的节点在生成区块时的重要参考指标,它决定了节点大约需要经过多少次哈希运算才能产生一个合法的区块
难度的调整 : 在每个完整节点中独立自动发生的。每个区块,所有节点都会按统一的公式自动调整难度.(例如比特币为10分钟)
新 难 度 值 = 旧 难 度 值 ∗ 过 去 个 区 块 花 费 时 长 0 分 钟 新难度值 = 旧难度值 * \frac{过去个区块花费时长}{0分钟} 新难度值=旧难度值∗0分钟