用 Harness 实现 Agent 之间的拜占庭容错投票
拜占庭容错(Byzantine Fault Tolerance, BFT)是分布式系统领域的一个核心容错模型,它能在系统中存在任意行为的故障节点(拜占庭故障节点)时,仍然保证系统的正确性(Safety)和活性(Liveness)。BFT 系统的核心要素可以用(N, f)NNN:系统中的总节点数(包括诚实节点和拜占庭故障节点);fff:系统能容忍的最大拜占庭故障节点数;Safety(安全性)所有诚实
从跨域协作信任破局:Harness Chaos + OpenZeppelin + Cosmos SDK 构建模拟拜占庭容错(BFT)Agent 投票验证系统
1. 标题选项
- 《突破平台边界:用 Harness DevSecOps 工具链 + 轻量级区块链库,实现模拟拜占庭容错 Agent 投票》
- 《信任危机下的协作方案:手把手教你用 Harness、OpenZeppelin 和 Tendermint Light Client 验证 BFT 投票逻辑》
- 《从 Chaos 到 Trust:Harness 不是只有 CI/CD!用它驱动 BFT Agent 投票的端到端测试与验证》
- 《分布式协作入门:结合 Harness 的自动化能力,构建你的第一个可测试拜占庭容错投票原型》
2. 引言
2.1 痛点引入:为什么“普通投票”在多 Agent 协作里没用?
假设你在做一个智能仓储机器人集群调度系统:10 个搬运机器人(Agent)需要通过投票决定“现在该优先搬哪个批次的货物”。你可能会写个简单的 JavaScript 或 Python 脚本——每个 Agent 发个 vote('batch1') 或 vote('batch2'),服务器统计超过一半的票就算通过?
但现实是残酷的:
- 网络分区(Partition):仓储里 Wi-Fi 信号死角,3 个机器人连不上投票服务器,剩下的 7 个会不会分裂成 4 票 batch1、3 票 batch2?服务器该听谁的?
- 节点故障(Crash Fault):机器人搬着货物时突然电池没电挂了,挂之前可能已经发了半票、重复发了票,或者根本没来得及发?
- 拜占庭故障(Byzantine Fault):更可怕——其中 1 个机器人可能被黑客黑了,或者程序有逻辑漏洞,它故意发
vote('batch1')给机器人 A,发vote('batch2')给机器人 B,甚至发vote('fake_batch')给所有人?
这就是拜占庭将军问题(Byzantine Generals Problem):一群互不信任的将军(Agent)要通过信使(网络)达成一致,但其中可能有叛徒(拜占庭故障节点)。如果解决不了这个问题,你的智能仓储、自动驾驶编队、去中心化交易所(DEX)甚至卫星群都没法安全运行——普通的“少数服从多数”只在“全诚实/仅崩溃/无分区”的乌托邦里有效。
2.2 这里有个误解:Harness 本身不是 BFT 框架?
等等,你可能会疑惑:“用户明明说‘用 Harness 实现’,但我查 Harness 文档,全是 CI/CD Pipeline、Feature Flags、Chaos Engineering、Cloud Cost Management……完全没提拜占庭容错、共识算法啊?”
没错!这篇文章的核心创新点,不是“用 Harness 原生功能写 BFT 投票”(那是不可能的,Harness 是 DevSecOps 管理平台,不是分布式系统底层库),而是:
用 Harness 的 自动化编排(Pipeline)、故障注入(Chaos Engineering)、测试驱动验证(Test Intelligence)、多云部署(Cloud Cost & Deployments) 全流程能力, 快速构建、部署、测试、验证 一个基于 成熟开源 BFT 共识库(Tendermint Light Client)+ 智能合约交互框架(OpenZeppelin Defender + Contracts) 的 模拟拜占庭容错 Agent 投票验证系统。
简单来说:
- Tendermint Light Client 提供 BFT 投票的核心逻辑(PBFT 变种,支持最多 1 3 \frac{1}{3} 31 的拜占庭故障节点);
- OpenZeppelin Contracts 提供 Agent 身份验证(ERC-721/ERC-20 代币或角色权限)、投票结果上链存证(防止篡改)的功能;
- OpenZeppelin Defender 提供自动化触发 Agent 投票、监控投票状态、处理异常的 Web3 自动化能力;
- Harness 则是这个全栈系统的“指挥中心”:
- 用 Harness CI 自动编译、测试 Tendermint Light Agent 代码、OpenZeppelin 智能合约;
- 用 Harness CD 自动部署 Light Agent 到 AWS EC2/Azure VM/Kubernetes 集群;
- 用 Harness Chaos Engineering 故意注入网络分区、节点崩溃、恶意拜占庭故障(篡改 Light Agent 代码);
- 用 Harness Test Intelligence 自动运行端到端投票测试,验证在 ≤ 1 3 \leq \frac{1}{3} ≤31 故障时系统仍能达成一致,在 ≥ 2 3 \geq \frac{2}{3} ≥32 故障时系统会安全拒绝;
- 用 Harness Feature Flags 可以灰度发布新的 BFT 投票规则、新的故障类型;
- 用 Harness Cloud Cost Management 监控所有 Light Agent、测试节点、区块链节点的成本,避免浪费。
2.3 读者收益:读完这篇你能做什么?
如果你是:
- DevOps 工程师:学会如何把“看起来高大上的分布式系统/区块链技术”融入你的日常 CI/CD/Chaos 流程;
- 区块链开发者:学会如何用 Harness 自动化构建、测试、部署 Web3 应用,特别是 Tendermint 生态的轻客户端;
- 分布式系统入门者:通过一个可运行、可测试、可注入故障的原型,直观理解拜占庭将军问题、PBFT 变种共识算法(Tendermint)、容错阈值( 1 3 \frac{1}{3} 31)这些核心概念;
- 全栈开发者:学会如何构建一个“Web2 自动化 + Web3 存证/身份 + Tendermint BFT 投票”的跨域协作原型。
3. 准备工作
3.1 技术栈/知识要求
我们会用到很多工具,但不用担心——每一步都会有详细的教程,你不需要是每个领域的专家:
- 基础编程知识:至少会用 Python 或 Go 写简单脚本(我们的 Tendermint Light Agent 用 Go 写,因为 Tendermint 原生是 Go;测试脚本用 Python,因为简单易懂);
- 基础 Docker/Kubernetes 知识:知道 Dockerfile、Docker Compose 是什么,Kubernetes 的 Pod、Deployment、Service 是什么(Harness CD 会自动生成大部分配置,但你需要理解基本概念);
- 基础 Web3 知识:知道什么是区块链、智能合约、钱包地址、Gas 费、RPC 节点(我们用 Sepolia 测试网,不用花钱);
- 基础 Harness 知识:知道 Harness 的基本界面(Pipeline、Chaos、Test Intelligence)——如果完全不知道,先花 10 分钟看 Harness 官方快速入门;
- 数学基础:只需要高中数学——理解 1 3 \frac{1}{3} 31、 2 3 \frac{2}{3} 32 这些分数,知道集合的基本概念(交集、并集)。
3.2 环境/工具准备
3.2.1 本地开发环境
- 操作系统:Windows 10/11(WSL2)、macOS(Intel/Apple Silicon)、Linux(Ubuntu 22.04+ 推荐);
- 开发工具:
- VS Code(推荐)或 GoLand/PyCharm;
- Docker Desktop(或 Docker Engine + Docker Compose on Linux);
- kubectl(Kubernetes 命令行工具);
- Git;
- Go 1.21+(因为 Tendermint v0.38+ 要求 Go 1.21);
- Python 3.10+;
- Node.js 18+(用于 OpenZeppelin 智能合约编译);
- Foundry 或 Hardhat(用于智能合约测试,我们用 Foundry,因为速度快);
- MetaMask 钱包(用于 Sepolia 测试网操作)。
3.2.2 云环境/测试环境
- Harness 免费账号:注册 Harness Cloud,免费额度足够我们完成所有实验;
- AWS/Azure/GCP 免费账号:用于部署 Tendermint Light Agent(如果没有云账号,也可以用 Docker Compose 在本地部署 4 个 Light Agent,但本地 Chaos 效果可能不如云环境);
- Sepolia 测试网 RPC 节点:可以用 Alchemy、Infura 或 QuickNode 免费提供的 RPC 节点;
- Sepolia 测试网 ETH:从 Sepolia Faucet 或 Alchemy Faucet 领取,用于部署智能合约和支付 Gas 费。
4. 核心概念与背景知识
4.1 核心概念:什么是拜占庭容错(BFT)?
4.1.1 概念结构与核心要素组成
拜占庭容错(Byzantine Fault Tolerance, BFT)是分布式系统领域的一个核心容错模型,它能在系统中存在任意行为的故障节点(拜占庭故障节点) 时,仍然保证系统的正确性(Safety) 和活性(Liveness)。
BFT 系统的核心要素可以用 (N, f) 模型来描述:
- N N N:系统中的总节点数(包括诚实节点和拜占庭故障节点);
- f f f:系统能容忍的最大拜占庭故障节点数;
- Safety(安全性):所有诚实节点最终达成的决策是一致的(不会出现两个诚实节点一个认为“通过”,一个认为“拒绝”的情况);
- Liveness(活性):所有诚实节点最终都能做出决策(不会出现系统永远挂起的情况)。
4.1.2 容错阈值的数学推导:为什么是 1 3 \frac{1}{3} 31?
这是 BFT 系统中最重要、最经典的数学结论——我们必须理解它,否则无法设计我们的投票系统。
问题背景:假设我们有 N N N 个节点,其中最多有 f f f 个是拜占庭故障节点。诚实节点之间通过网络传递消息,但网络可能有延迟,但最终是同步的(或异步但有概率活性保证,比如 Tendermint)。
问题描述:要保证 Safety 和 Liveness, f f f 和 N N N 之间必须满足什么关系?
数学推导:
我们先推导Safety的条件,再推导Liveness的条件,最后取两者的交集。
4.1.2.1 Safety 条件推导
Safety 的核心是:不存在两个不同的诚实节点集合 S 1 S_1 S1 和 S 2 S_2 S2,使得 S 1 S_1 S1 中的所有诚实节点都同意决策 D 1 D_1 D1, S 2 S_2 S2 中的所有诚实节点都同意决策 D 2 D_2 D2( D 1 ≠ D 2 D_1 \neq D_2 D1=D2)。
拜占庭故障节点可以同时给 S 1 S_1 S1 和 S 2 S_2 S2 发送不同的消息,所以我们必须假设:为了让一个诚实节点同意某个决策,它收到的“同意该决策”的消息,必须 只来自于“足够多的诚实节点”,以至于不可能同时存在另一个不同的决策,也能收到“足够多的诚实节点”的同意消息。
假设一个诚实节点同意决策 D D D 的条件是:它收到了至少 k k k 个节点(包括自己)的同意消息。
现在,最坏情况下:
- 所有 f f f 个拜占庭故障节点都同时给 S 1 S_1 S1 发送同意 D 1 D_1 D1 的消息,给 S 2 S_2 S2 发送同意 D 2 D_2 D2 的消息;
- S 1 S_1 S1 中的诚实节点有 k − f k - f k−f 个(因为 f f f 个是故障节点的假消息);
- S 2 S_2 S2 中的诚实节点有 k − f k - f k−f 个(同理);
- S 1 S_1 S1 和 S 2 S_2 S2 中的诚实节点必须是不重叠的(否则那个重叠的诚实节点会同时收到两个不同的同意消息,不符合 Safety);
- 系统中的总诚实节点数是 N − f N - f N−f。
因此,我们有:
( k − f ) + ( k − f ) ≤ N − f (k - f) + (k - f) \leq N - f (k−f)+(k−f)≤N−f
化简一下:
2 k − 2 f ≤ N − f 2 k ≤ N + f k ≤ N + f 2 2k - 2f \leq N - f \\ 2k \leq N + f \\ k \leq \frac{N + f}{2} 2k−2f≤N−f2k≤N+fk≤2N+f
但这只是“不重叠”的条件,我们还需要保证一个诚实节点真的能收到至少 k k k 个同意消息(否则 Liveness 没法保证)。那 k k k 应该取多少呢?
我们希望即使所有 f f f 个拜占庭故障节点都不发送同意消息,剩下的 N − f N - f N−f 个诚实节点仍然能凑够 k k k 个同意消息(否则如果决策是“诚实节点普遍同意的”,系统会因为故障节点捣乱而挂起)。因此:
k ≤ N − f k \leq N - f k≤N−f
但等等,刚才的 Safety 条件是 k ≤ N + f 2 k \leq \frac{N + f}{2} k≤2N+f,现在要同时满足这两个条件,那我们应该取哪个作为决策的同意阈值?
其实反过来想:如果我们要求一个决策必须得到 至少 2 f + 1 2f + 1 2f+1 个节点的同意,那能不能满足 Safety?
我们来验证一下:假设决策 D 1 D_1 D1 得到了 2 f + 1 2f + 1 2f+1 个节点的同意,决策 D 2 D_2 D2 也得到了 2 f + 1 2f + 1 2f+1 个节点的同意( D 1 ≠ D 2 D_1 \neq D_2 D1=D2)。那么,同意 D 1 D_1 D1 和 D 2 D_2 D2 的节点的交集大小至少是:
( 2 f + 1 ) + ( 2 f + 1 ) − N = 4 f + 2 − N (2f + 1) + (2f + 1) - N = 4f + 2 - N (2f+1)+(2f+1)−N=4f+2−N
如果 4 f + 2 − N > f 4f + 2 - N > f 4f+2−N>f,那交集中至少有 f + 1 f + 1 f+1 个节点——而系统中最多只有 f f f 个拜占庭故障节点,所以交集中至少有 1 个诚实节点!这意味着那个诚实节点同时同意了 D 1 D_1 D1 和 D 2 D_2 D2,这是不可能的(诚实节点只会同意一个决策)。因此,为了避免这种情况,我们必须让:
4 f + 2 − N ≤ f 3 f + 2 ≤ N 4f + 2 - N \leq f \\ 3f + 2 \leq N 4f+2−N≤f3f+2≤N
因为 N N N 和 f f f 都是整数,所以我们可以写成:
N ≥ 3 f + 1 N \geq 3f + 1 N≥3f+1
这就是Safety 的必要条件——也是 BFT 系统的经典容错阈值!
4.1.2.2 Liveness 条件推导
刚才我们已经得到了 N ≥ 3 f + 1 N \geq 3f + 1 N≥3f+1,现在我们需要验证在这个条件下,是否能保证 Liveness(即所有诚实节点最终都能做出决策)。
假设我们有 N = 3 f + 1 N = 3f + 1 N=3f+1 个节点(最小的满足 Safety 的 N N N),其中 f f f 个是拜占庭故障节点,剩下的 2 f + 1 2f + 1 2f+1 个是诚实节点。
如果我们使用一个两阶段或三阶段的共识协议(比如 PBFT、Tendermint):
- 第一阶段(提案/预投票):某个诚实节点(提案者)提出一个决策 D D D;
- 第二阶段(投票/预提交):所有诚实节点收到提案后,如果同意,就发送预提交消息;
- 第三阶段(提交):如果某个诚实节点收到了至少 2 f + 1 2f + 1 2f+1 个预提交消息(其中至少有 f + 1 f + 1 f+1 个是诚实节点的,因为最多只有 f f f 个是故障节点的假消息),它就提交决策 D D D。
因为系统中有 2 f + 1 2f + 1 2f+1 个诚实节点,所以只要提案者是诚实的,并且网络最终同步,所有诚实节点最终都会收到提案,然后发送预提交消息,最终凑够 2 f + 1 2f + 1 2f+1 个预提交消息——因此Liveness 是可以保证的。
如果提案者是拜占庭故障节点,它可能会提出坏决策,或者不提出决策——这时候我们可以用轮询(Round-Robin)或随机选择的方式更换提案者,直到选到一个诚实的提案者——因为系统中有 2 f + 1 2f + 1 2f+1 个诚实节点,所以最多经过 f + 1 f + 1 f+1 轮,就能选到一个诚实的提案者,因此Liveness 仍然是可以保证的。
4.1.2.3 最终结论
结合 Safety 和 Liveness 的条件,我们得到 BFT 系统的核心数学模型:
N ≥ 3 f + 1 \boxed{N \geq 3f + 1} N≥3f+1
其中:
- N N N:总节点数(必须是整数);
- f f f:最大可容忍的拜占庭故障节点数(必须是整数,且 f ≥ 0 f \geq 0 f≥0)。
4.1.3 常见 BFT 共识算法对比
现在我们知道了 BFT 的核心数学模型,但具体怎么实现一个 BFT 共识协议呢? 历史上有很多 BFT 共识算法,我们在这里对比一下最经典、最常用的几个:
| 共识算法 | 发明者/组织 | 年份 | 变种类型 | 容错阈值 | 网络模型 | 性能(TPS) | 应用场景 | 核心优势 | 核心劣势 |
|---|---|---|---|---|---|---|---|---|---|
| PBFT(Practical Byzantine Fault Tolerance) | Miguel Castro 和 Barbara Liskov | 1999 | 经典三阶段 BFT | N ≥ 3 f + 1 N \geq 3f + 1 N≥3f+1 | 部分同步 | ~1000 | 私有链/联盟链(早期) | 第一个实用的 BFT 算法,有严格的正确性证明 | 复杂度高( O ( N 3 ) O(N^3) O(N3) 消息复杂度),扩展性差,不适合公链 |
| Tendermint | Jae Kwon 和 Ethan Buchman(Cosmos 团队) | 2014 | PBFT 变种(简化三阶段,引入轮询提案者和锁定机制) | N ≥ 3 f + 1 N \geq 3f + 1 N≥3f+1 | 部分同步(但有概率活性保证) | ~10000 | 联盟链/公链(Cosmos Hub、Binance Chain 早期) | 复杂度低( O ( N 2 ) O(N^2) O(N2) 消息复杂度),有严格的正确性证明,支持轻客户端验证,扩展性好(可以分片,比如 Cosmos IBC) | 部分同步模型,网络延迟高时活性会受影响,不适合极端异步环境 |
| HotStuff | IBM Research | 2018 | PBFT 变种(引入线性化三阶段,流水线共识) | N ≥ 3 f + 1 N \geq 3f + 1 N≥3f+1 | 部分同步 | ~100000 | 联盟链/公链(Facebook Libra/Diem 早期、Aptos、Sui) | 复杂度极低( O ( N ) O(N) O(N) 消息复杂度),性能极高,支持流水线共识,扩展性极好 | 正确性证明比 Tendermint 复杂,流水线共识可能导致延迟稍微增加,实现难度大 |
| Casper FFG(Friendly Finality Gadget) | Ethereum 基金会 | 2017 | PoW+PoS 混合 BFT 变种(后来变成纯 PoS 的 Casper CBC 简化版) | N ≥ 3 f + 1 N \geq 3f + 1 N≥3f+1(验证者节点) | 异步(有概率活性保证) | ~100(后来以太坊合并后用 Gasper,TPS 提升到 ~1000+ 分片后) | 公链(Ethereum 合并后) | 与 PoS 完美结合,异步模型,适合公链,最终性(Finality)强(一旦确认就无法回滚) | 性能不如 Tendermint 和 HotStuff,实现难度大,需要质押机制 |
4.1.4 为什么我们选 Tendermint Light Client?
在这篇文章中,我们选择 Tendermint Light Client 作为 BFT 投票的核心逻辑,原因如下:
- 简单易懂:Tendermint 的共识逻辑比 HotStuff 和 Casper FFG 简单,适合分布式系统入门者理解;
- 有严格的正确性证明:我们不需要自己写 BFT 共识逻辑(那是分布式系统专家的事,而且很容易出错),直接用 Tendermint 经过验证的代码;
- 支持轻客户端验证:轻客户端不需要存储整个区块链的历史数据,只需要存储最近的几个区块头和验证者集合,就可以验证投票结果的正确性——这非常适合我们的 Agent 场景(Agent 不需要是全节点,只需要是轻节点);
- 生态成熟:Tendermint 是 Cosmos 生态的核心,有大量的文档、教程和开源工具;
- 支持 Go 语言:我们的 Agent 用 Go 写,而 Tendermint 原生是 Go,集成非常方便。
4.2 核心概念:什么是 Harness DevSecOps 工具链?
4.2.1 概念结构与核心要素组成
Harness 是一个新一代的智能 DevSecOps 管理平台,它的核心目标是让软件交付更快、更安全、更可靠。
Harness DevSecOps 工具链的核心要素可以分为以下几个模块:
- Harness Platform:所有模块的基础,提供用户管理、项目管理、组织管理、访问控制(RBAC)、API 接口等功能;
- Harness CI(Continuous Integration):自动化编译、测试、打包代码的模块,支持 Docker、Kubernetes、VM 等多种构建环境,支持 Test Intelligence(只运行受代码变更影响的测试,节省时间);
- Harness CD(Continuous Delivery/Deployment):自动化部署代码到各种环境(本地、AWS、Azure、GCP、Kubernetes、Docker Swarm 等)的模块,支持蓝绿部署、金丝雀发布、滚动更新等多种部署策略,支持自动回滚;
- Harness Chaos Engineering(CE):故意注入故障(网络分区、节点崩溃、CPU 满载、内存不足、磁盘 IO 延迟、数据库连接失败等)到系统中的模块,用于验证系统的容错能力,支持自定义故障,支持自动停止故障和恢复系统;
- Harness Feature Flags(FF):灰度发布新功能的模块,支持按用户、按地理位置、按设备类型、按百分比等多种方式开启/关闭新功能,支持 A/B 测试;
- Harness Cloud Cost Management(CCM):监控和优化云成本的模块,支持 AWS、Azure、GCP、Kubernetes 等多种云环境,支持成本预算、成本告警、成本优化建议;
- Harness Security Testing Orchestration(STO):自动化安全测试的模块,支持 SAST(静态应用安全测试)、DAST(动态应用安全测试)、SCA(软件成分分析)、Secret Scanning(密钥扫描)等多种安全测试工具,支持安全漏洞的自动修复;
- Harness Service Reliability Management(SRM):监控和管理服务可靠性的模块,支持 SLO(服务水平目标)、SLA(服务水平协议)、Error Budget(错误预算),支持自动告警和自动修复。
4.2.2 为什么我们选 Harness 作为指挥中心?
在这篇文章中,我们选择 Harness 作为整个系统的指挥中心,原因如下:
- 一站式平台:我们不需要用多个工具(Jenkins + Argo CD + Chaos Monkey + LaunchDarkly + CloudHealth),只需要用 Harness 一个平台就能完成所有工作;
- 易用性强:Harness 的界面非常友好,有可视化的 Pipeline 编辑器,不需要写大量的 YAML 配置(当然也支持写 YAML);
- 智能自动化:Harness 有 Test Intelligence、Auto Rollback、Auto Heal 等智能功能,能大大减少我们的工作量;
- 支持多云/多环境:我们可以用 Harness 把 Light Agent 部署到任何环境,从本地 Docker 到 AWS EC2 到 Kubernetes 集群;
- 支持 Web3 应用:Harness 虽然不是专门的 Web3 平台,但它支持任何 Docker 容器化的应用,包括 Tendermint Light Agent、Foundry/Hardhat 测试脚本、OpenZeppelin Defender Webhook;
- 免费额度充足:Harness Cloud 的免费额度足够我们完成所有实验,不需要花钱。
4.3 核心概念:什么是 OpenZeppelin?
4.3.1 概念结构与核心要素组成
OpenZeppelin 是一个Web3 安全开发平台,它的核心目标是让智能合约开发更快、更安全、更可靠。
OpenZeppelin 的核心要素可以分为以下几个模块:
- OpenZeppelin Contracts:一个经过严格安全审计的智能合约库,提供 ERC-20、ERC-721、ERC-1155、角色权限、投票、多签、代理等常用功能的实现,是目前最流行的智能合约库;
- OpenZeppelin Defender:一个 Web3 自动化运维平台,提供 Relayer(中继器,用于自动发送交易)、Autotask(自动化任务,用于定时执行或触发执行智能合约函数)、Monitor(监控器,用于监控区块链事件和交易)、Advisor(安全顾问,用于检查智能合约的安全漏洞)等功能;
- OpenZeppelin Upgrades:一个智能合约升级工具,支持透明代理、UUPS 代理等多种升级模式,保证升级过程的安全性;
- OpenZeppelin Test Helpers:一个智能合约测试辅助库,提供时间快进、Gas 费计算、事件监听、余额检查等常用功能的实现,配合 Foundry 或 Hardhat 使用非常方便。
4.3.2 为什么我们选 OpenZeppelin?
在这篇文章中,我们选择 OpenZeppelin 作为身份验证和投票结果存证的模块,原因如下:
- 安全可靠:OpenZeppelin Contracts 经过了多次严格的安全审计,被以太坊、Binance Smart Chain、Polygon 等主流区块链上的数百万个智能合约使用;
- 易用性强:OpenZeppelin Contracts 提供了非常清晰的文档和示例代码,我们可以直接继承和扩展,不需要自己写复杂的身份验证和投票逻辑;
- 自动化运维:OpenZeppelin Defender 可以自动触发 Agent 投票、监控投票状态、处理异常,不需要我们自己写服务器;
- 免费额度充足:OpenZeppelin Defender 的免费额度足够我们完成所有实验,不需要花钱。
5. 概念之间的关系:系统架构与交互流程
5.1 系统整体架构图(Mermaid ER + 架构图混合)
首先,我们用 Mermaid 画一个系统整体架构图,展示所有核心概念之间的关系:
5.2 系统核心交互流程(Mermaid 流程图)
接下来,我们用 Mermaid 画一个系统核心交互流程图,展示从“用户发起投票请求”到“用户看到投票结果”的整个过程:
6. 系统设计
6.1 项目介绍
我们的项目叫做 BFT-Agent-Voting-Harness,它是一个模拟拜占庭容错 Agent 投票验证系统,用于验证在多 Agent 协作场景下,BFT 共识算法的正确性和容错能力。
项目的核心功能如下:
- Agent 身份管理:用 OpenZeppelin ERC-721 代币管理 Agent 的身份,只有拥有有效代币的 Agent 才能参与投票;
- 提案创建与管理:用 OpenZeppelin Governance 模块创建和管理投票提案;
- BFT 投票:用 Tendermint Light Client 实现 BFT 投票逻辑,支持最多 1 3 \frac{1}{3} 31 的拜占庭故障节点;
- 投票结果存证:用 Sepolia 测试网存证投票结果,防止篡改;
- 自动化运维:用 OpenZeppelin Defender 自动触发投票、监控投票状态、处理异常;
- 自动化构建与部署:用 Harness CI 自动编译、测试代码,用 Harness CD 自动部署 Light Agent;
- 故障注入与验证:用 Harness Chaos Engineering 故意注入故障,用 Harness Test Intelligence 自动运行端到端测试,验证系统的容错能力;
- 灰度发布:用 Harness Feature Flags 灰度发布新的投票规则。
6.2 系统功能设计
我们用 用例图(Use Case Diagram) 来展示系统的功能设计:
6.3 系统接口设计
我们的系统有以下几个核心接口:
6.3.1 Tendermint Light Agent HTTP API 接口
我们的 Tendermint Light Agent 提供以下 HTTP API 接口,用于与 OpenZeppelin Defender 和 Harness Test Intelligence 交互:
| 接口路径 | 请求方法 | 请求参数 | 响应参数 | 功能描述 |
|---|---|---|---|---|
/health |
GET | 无 | {"status": "ok", "agent_id": "string", "is_byzantine": "bool"} |
检查 Light Agent 的健康状态 |
/proposal |
POST | {"proposal_id": "string", "proposal_content": "string", "deadline": "int64"} |
{"status": "accepted", "message": "string"} |
接收投票提案 |
/vote_result |
GET | {"proposal_id": "string"} |
{"proposal_id": "string", "decision": "string", "proof": {"precommits": ["string"]}, "timestamp": "int64"} |
获取投票结果(如果已达成共识) |
/set_byzantine |
POST | {"is_byzantine": "bool", "byzantine_type": "string"} |
{"status": "ok", "message": "string"} |
(仅用于测试)设置 Light Agent 的拜占庭故障类型(none、split_vote、fake_proposal、no_response) |
6.3.2 OpenZeppelin 智能合约 Solidity 接口
我们的 OpenZeppelin 智能合约提供以下 Solidity 接口,用于与 MetaMask 和 OpenZeppelin Defender 交互:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/governance/Governor.sol";
import "@openzeppelin/contracts/governance/extensions/GovernorSettings.sol";
import "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol";
import "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol";
import "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol";
import "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Votes.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
// 我们的 BFT Agent 投票智能合约接口
interface IBFTAgentVoting {
// 创建 Agent 身份 ERC721 代币
function mintAgent(address to, uint256 tokenId) external;
// 销毁 Agent 身份 ERC721 代币
function burnAgent(uint256 tokenId) external;
// 设置 Tendermint 验证者集合(用于 Solidity 轻客户端验证投票证明)
function setValidators(bytes32[] calldata validatorPubkeys, uint256[] calldata validatorPowers) external;
// 最终化提案(传入 Tendermint 投票证明)
function finalizeProposalWithProof(
uint256 proposalId,
bytes32[] calldata precommitSignatures,
bytes32 blockHash,
uint64 blockHeight
) external
更多推荐



所有评论(0)