ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

共识算法:从PBFT到HotStuff的拜占庭容错演进

共识算法:从PBFT到HotStuff的拜占庭容错演进 共识算法从PBFT到HotStuff的拜占庭容错演进一、引言区块链的核心:在不可信网络中达成一致。从Liskov 1999年PBFT到2018年Facebook LibraBFT(HotStuff),历经20年从理论到生产的演进。本文将逐层推导共识算法的安全性证明和工程实现。二、PBFT三阶段协议的经典2.1 协议流程Client Request │ ▼ Primary (Leader) ───Pre-Prepare──→ Replica 1 ───Pre-Prepare──→ Replica 2 ───Pre-Prepare──→ Replica 3 (n3f14, f1) │ ┌─────────────┼─────────────┐ ▼ ▼ ▼ Prepare(1) Prepare(2) Prepare(3) ← 至少2f13个Prepare │ │ │ └─────────────┼─────────────┘ ▼ Commit(1,2,3) ← 至少2f1个Commit │ ▼ Reply → Client2.2 核心实现typePBFTstruct{viewuint64// 当前视图(View Leader编号)sequint64// 序列号phase Phase// PrePrepare/Prepare/Commitreplicasmap[uint64]*Replica fint// 最大容错数log*MessageLog timer*time.Timer}const(PrePrepare PhaseiotaPrepare Commit)typeConsensusMessagestruct{Type Phase Viewuint64Sequint64Digest[32]byte// 提案HashSenderIDuint64Signature[]byte}// Pre-Prepare: Leader广播提案func(p*PBFT)sendPrePrepare(request[]byte){digest:sha256.Sum256(request)msg:ConsensusMessage{Type:PrePrepare,View:p.view,Seq:p.seq,Digest:digest,SenderID:p.id,}msg.Signaturep.sign(msg)p.broadcast(msg)}// Prepare: 副本确认收到有效提案func(p*PBFT)handlePrePrepare(msg*ConsensusMessage)error{// 验证: View匹配 签名有效 未处理过ifmsg.View!p.view{returnErrWrongView}if!p.verifySignature(msg){returnErrInvalidSig}ifp.log.Has(msg.View,msg.Seq){returnErrDuplicate}p.log.Add(msg)p.sendPrepare(msg.Digest)returnnil}func(p*PBFT)sendPrepare(digest[32]byte){msg:ConsensusMessage{Type:Prepare,View:p.view,Seq:p.seq,Digest:digest,}msg.Signaturep.sign(msg)p.broadcast(msg)p.checkPrepared()}// Prepared条件: 2f1个Prepare消息(含自身)func(p*PBFT)checkPrepared(){prepares:p.log.GetPrepares(p.view,p.seq)// ★ 核心不变量: prepared(m,v,n) → 不会有其他m在(v,n)被committediflen(prepares)2*p.f1{p.preparedCertificateprepares p.sendCommit(prepares[0].Digest)}}// Committed条件: 2f1个Commit消息 → 最终确定性!func(p*PBFT)checkCommitted(){commits:p.log.GetCommits(p.view,p.seq)iflen(commits)2*p.f1{p.committedCertificatecommits p.execute(commits[0].Digest)// 执行请求,不可回滚p.sendReply()}}// View Change: Leader超时→换Leaderfunc(p*PBFT)startViewChange(){p.viewp.phasePrePrepare msg:ViewChangeMessage{NewView:p.view,LastSeq:p.seq,PreparedCert:p.preparedCertificate,// ★ 关键:携带prepared证明}p.broadcast(msg)}// ★ 安全性证明核心:View Change必须携带prepared证明// 新Leader收集2f1个ViewChange消息后,选取最新prepared的seq继续func(p*PBFT)handleNewView(msgs[]*ViewChangeMessage){// 1. 找到最高prepared的序列号maxPrepared:findMaxPreparedSeq(msgs)// 2. 对其prepared消息重新做PrePrepare(保证不冲突)ifmaxPrepared0{p.rePropose(maxPrepared)}// 3. 继续处理新请求p.seqmaxPrepared1}2.3 形式化安全证明定理1 (Safety): PBFT不会产生分叉 证明: 假设两个冲突的请求m和m都在序列号n被提交 → 需要两个不同的quorum: Q1和Q2,各含至少2f1个节点 → |Q1||Q2| ≥ 2(2f1) 4f2 3f1 n → 至少f1个节点同时在两个quorum中 → 诚实节点不可能对同一seq投两种票 → 矛盾 定理2 (Liveness): 在view change后最终能达成共识 → 新Leader的ViewChange消息包含prepared certificate → 至少2f1个节点接受了prepared消息 → 新Leader可以继续推进三、TendermintPBFT的实用化// Tendermint简化PBFT:去掉了PrePrepare,用提议预投票预提交三阶段typeTendermintConsensusstruct{heightint64roundint32step Step// Propose/Prevote/Precommitvalidators*ValidatorSet}const(Propose Stepiota// 提议者广播区块Prevote// 验证者投票(类似PBFT Prepare)Precommit// 验证者提交(类似PBFT Commit))// Tendermint关键改进:// 1. Round-based: 每一轮有固定Proposer(基于VRF选择)// 2. 锁定机制: Precommit后锁定区块,新轮必须解锁或重提案// 3. 超时递增: 每轮timeoutdelta,避免活锁func(tc*TendermintConsensus)enterNewRound(roundint32){tc.roundround tc.stepPropose// Proposer validators[height % len(validators)]iftc.isProposer(){block:tc.createBlock()tc.broadcastProposal(block)}// 超时进入下一轮tc.scheduleTimeout(tc.timeoutDuration())}四、HotStuff链式BFT革命4.1 三链确认规则Leader每次只提出一个区块,累积QC(Quorum Certificate): Block1 ──→ Block2 ──→ Block3 ──→ Block4 │ │ │ │ QC1 QC2 QC3 QC4 (Prepare) (PreCommit) (Commit) (Decide) ★ 关键: Block3携带Block1的Commit QC → Block1被最终确定!4.2 核心实现// HotStuff的精妙: View Number同时作为Phase指示器// view%30 → Prepare, view%31 → PreCommit, view%32 → CommittypeHotStuffstruct{viewuint64bLock*Block// 最高PreCommit的块bExec*Block// 最高Commit的块bLeaf*Block// 最新块qcHigh*QuorumCert// 最高QC}typeQuorumCertstruct{Type Phase Viewuint64BlockHash[32]byteSigs[]Signature// 包含2f1个签名}// ★ 单链Leader提议(线性通信! PBFT需要O(n²))func(hs*HotStuff)onPropose(block*Block){// 1. 验证前驱QC(Leader必须附带最新QC)if!hs.verifyQC(block.Justify){return}// 2. 更新安全规则: fork必须扩展bLock(PreCommit的块)ifblock.Parent.Viewhs.bLock.View{// 不在bLock之后的分叉 → 拒绝return}// 3. 发送Vote(带签名)hs.sendVote(block)}// ★ Leader收集2f1个Vote → QCfunc(hs*HotStuff)onReceiveVotes(block*Block,votes[]*Vote){iflen(votes)2*hs.f1{qc:hs.aggregateQC(votes)hs.updateHighQC(qc)// ★ 三链确认: 检查祖父区块b1:block// 当前b2:block.Parent// 父b3:block.Parent.Parent// 祖父ifb1.Justify.Viewb2.View1b2.Justify.Viewb3.View1{// b3已获得连续三代QC → Finalize b3hs.commitBlock(b3)}}}// ★ 领导者更换: Pacemakerfunc(hs*HotStuff)onLeaderTimeout(){hs.viewhs.startViewChange()hs.broadcast(NewViewMessage{View:hs.view,HighQC:hs.qcHigh})// O(n)消息复杂度(vs PBFT O(n²))}4.3 性能对比协议消息复杂度延迟吞吐量验证者上限PBFTO(n²)3RTT~1K TPS~30TendermintO(n²)2RTT~5K TPS~100HotStuffO(n)3RTT~50K TPS~1000AvalancheO(k·log n)1s~4500 TPS无上限五、Avalanche随机抽样共识5.1 Snowball ProtocoltypeSnowballstruct{kint// 每轮抽样数alphaint// 多数阈值betaint// 连续确认轮数preference Color// 当前偏好(0或1)countint// 连续偏好计数}func(s*Snowball)decide()Color{for{// 1. 随机抽样k个节点samples:randSample(s.network,s.k)// 2. 查询偏好votes:query(samples)majority:tally(votes)// 3. 更新偏好ifcountOf(majority)s.alpha{ifs.preferencemajority{s.count}else{s.preferencemajority s.count1}}// 4. 连续beta轮 → 确定ifs.counts.beta{returns.preference}}}// 优势:// - 无Leader,完全去中心化// - 吞吐量与节点数无关(每次只抽样k个)// - 亚秒级最终确定性// - 支持数万验证者六、总结区块链共识的演化路径:PBFT(1999)— 奠基理论:3f1容错三阶段协议Tendermint(2014)— 工程化:round-based锁机制增量超时HotStuff(2018)—革命性:线性消息复杂度流水线三链确认Avalanche(2020)— 新范式:随机抽样亚稳态无Leader选择:联盟链用PBFT,公链PoS用HotStuff,高去中心化用Avalanche。
返回列表