共识算法:从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。

相关新闻

解锁AMD Ryzen隐藏潜能:SMUDebugTool让你的处理器焕然一新

解锁AMD Ryzen隐藏潜能:SMUDebugTool让你的处理器焕然一新

解锁AMD Ryzen隐藏潜能:SMUDebugTool让你的处理器焕然一新 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https:…

2026/10/24 14:17:33 阅读更多 →
从零跑通大模型全流程:基于Qwen3‑0.6B微调中医模型并Docker部署

从零跑通大模型全流程:基于Qwen3‑0.6B微调中医模型并Docker部署

文章目录前言1. 先给你们看看最终成品1.1 四个核心产物1.2 先把定位说清楚2. 我的本地环境家底2.1 硬件软件配置2.2 文件存放思路3. 整个流程就是一条流水线3.1 四个核心脚本3.2 完整数据流4. 数据清洗:先定好模型该学啥4.1 原始数据啥成色4.2 我是怎么筛数据的4.3 …

2026/10/23 13:26:54 阅读更多 →
零基础Milvus快速上手指南,手把手搭建RAG向量检索

零基础Milvus快速上手指南,手把手搭建RAG向量检索

文章目录前言1 环境准备1.1 Windows下用Docker部署Milvus1.2 安装Python依赖1.3 准备嵌入模型API2 连接Milvus并创建数据库2.1 建立客户端连接2.2 创建自定义数据库3 创建Collection集合3.1 检查并创建集合3.2 查看集合元数据4 准备嵌入模型4.1 初始化模型4.2 生成测试向量5 插…

2026/10/25 14:21:40 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/27 17:33:32 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/27 4:06:49 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/27 7:21:53 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/27 18:20:50 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/27 6:20:47 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/27 4:06:50 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 13:55:19 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 7:21:50 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 19:19:37 阅读更多 →