从跨域协作信任破局: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'),服务器统计超过一半的票就算通过?

但现实是残酷的:

  1. 网络分区(Partition):仓储里 Wi-Fi 信号死角,3 个机器人连不上投票服务器,剩下的 7 个会不会分裂成 4 票 batch1、3 票 batch2?服务器该听谁的?
  2. 节点故障(Crash Fault):机器人搬着货物时突然电池没电挂了,挂之前可能已经发了半票、重复发了票,或者根本没来得及发?
  3. 拜占庭故障(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 则是这个全栈系统的“指挥中心”
    1. 用 Harness CI 自动编译、测试 Tendermint Light Agent 代码、OpenZeppelin 智能合约;
    2. 用 Harness CD 自动部署 Light Agent 到 AWS EC2/Azure VM/Kubernetes 集群;
    3. 用 Harness Chaos Engineering 故意注入网络分区、节点崩溃、恶意拜占庭故障(篡改 Light Agent 代码);
    4. 用 Harness Test Intelligence 自动运行端到端投票测试,验证在 ≤ 1 3 \leq \frac{1}{3} 31 故障时系统仍能达成一致,在 ≥ 2 3 \geq \frac{2}{3} 32 故障时系统会安全拒绝;
    5. 用 Harness Feature Flags 可以灰度发布新的 BFT 投票规则、新的故障类型;
    6. 用 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 技术栈/知识要求

我们会用到很多工具,但不用担心——每一步都会有详细的教程,你不需要是每个领域的专家:

  1. 基础编程知识:至少会用 Python 或 Go 写简单脚本(我们的 Tendermint Light Agent 用 Go 写,因为 Tendermint 原生是 Go;测试脚本用 Python,因为简单易懂);
  2. 基础 Docker/Kubernetes 知识:知道 Dockerfile、Docker Compose 是什么,Kubernetes 的 Pod、Deployment、Service 是什么(Harness CD 会自动生成大部分配置,但你需要理解基本概念);
  3. 基础 Web3 知识:知道什么是区块链、智能合约、钱包地址、Gas 费、RPC 节点(我们用 Sepolia 测试网,不用花钱);
  4. 基础 Harness 知识:知道 Harness 的基本界面(Pipeline、Chaos、Test Intelligence)——如果完全不知道,先花 10 分钟看 Harness 官方快速入门
  5. 数学基础:只需要高中数学——理解 1 3 \frac{1}{3} 31 2 3 \frac{2}{3} 32 这些分数,知道集合的基本概念(交集、并集)。

3.2 环境/工具准备

3.2.1 本地开发环境
  1. 操作系统:Windows 10/11(WSL2)、macOS(Intel/Apple Silicon)、Linux(Ubuntu 22.04+ 推荐);
  2. 开发工具
    • 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 云环境/测试环境
  1. Harness 免费账号注册 Harness Cloud,免费额度足够我们完成所有实验;
  2. AWS/Azure/GCP 免费账号:用于部署 Tendermint Light Agent(如果没有云账号,也可以用 Docker Compose 在本地部署 4 个 Light Agent,但本地 Chaos 效果可能不如云环境);
  3. Sepolia 测试网 RPC 节点:可以用 AlchemyInfuraQuickNode 免费提供的 RPC 节点;
  4. Sepolia 测试网 ETH:从 Sepolia FaucetAlchemy 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 kf 个(因为 f f f 个是故障节点的假消息);
  • S 2 S_2 S2 中的诚实节点有 k − f k - f kf 个(同理);
  • S 1 S_1 S1 S 2 S_2 S2 中的诚实节点必须是不重叠的(否则那个重叠的诚实节点会同时收到两个不同的同意消息,不符合 Safety);
  • 系统中的总诚实节点数是 N − f N - f Nf

因此,我们有:
( k − f ) + ( k − f ) ≤ N − f (k - f) + (k - f) \leq N - f (kf)+(kf)Nf
化简一下:
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} 2k2fNf2kN+fk2N+f
但这只是“不重叠”的条件,我们还需要保证一个诚实节点真的能收到至少 k k k 个同意消息(否则 Liveness 没法保证)。那 k k k 应该取多少呢?

我们希望即使所有 f f f 个拜占庭故障节点都不发送同意消息,剩下的 N − f N - f Nf 个诚实节点仍然能凑够 k k k 个同意消息(否则如果决策是“诚实节点普遍同意的”,系统会因为故障节点捣乱而挂起)。因此:
k ≤ N − f k \leq N - f kNf
但等等,刚才的 Safety 条件是 k ≤ N + f 2 k \leq \frac{N + f}{2} k2N+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+2N
如果 4 f + 2 − N > f 4f + 2 - N > f 4f+2N>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+2Nf3f+2N
因为 N N N f f f 都是整数,所以我们可以写成:
N ≥ 3 f + 1 N \geq 3f + 1 N3f+1
这就是Safety 的必要条件——也是 BFT 系统的经典容错阈值

4.1.2.2 Liveness 条件推导

刚才我们已经得到了 N ≥ 3 f + 1 N \geq 3f + 1 N3f+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):

  1. 第一阶段(提案/预投票):某个诚实节点(提案者)提出一个决策 D D D
  2. 第二阶段(投票/预提交):所有诚实节点收到提案后,如果同意,就发送预提交消息;
  3. 第三阶段(提交):如果某个诚实节点收到了至少 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} N3f+1
其中:

  • N N N:总节点数(必须是整数);
  • f f f:最大可容忍的拜占庭故障节点数(必须是整数,且 f ≥ 0 f \geq 0 f0)。
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 N3f+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 N3f+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 N3f+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 N3f+1(验证者节点) 异步(有概率活性保证) ~100(后来以太坊合并后用 Gasper,TPS 提升到 ~1000+ 分片后) 公链(Ethereum 合并后) 与 PoS 完美结合,异步模型,适合公链,最终性(Finality)强(一旦确认就无法回滚) 性能不如 Tendermint 和 HotStuff,实现难度大,需要质押机制
4.1.4 为什么我们选 Tendermint Light Client?

在这篇文章中,我们选择 Tendermint Light Client 作为 BFT 投票的核心逻辑,原因如下:

  1. 简单易懂:Tendermint 的共识逻辑比 HotStuff 和 Casper FFG 简单,适合分布式系统入门者理解;
  2. 有严格的正确性证明:我们不需要自己写 BFT 共识逻辑(那是分布式系统专家的事,而且很容易出错),直接用 Tendermint 经过验证的代码;
  3. 支持轻客户端验证:轻客户端不需要存储整个区块链的历史数据,只需要存储最近的几个区块头和验证者集合,就可以验证投票结果的正确性——这非常适合我们的 Agent 场景(Agent 不需要是全节点,只需要是轻节点);
  4. 生态成熟:Tendermint 是 Cosmos 生态的核心,有大量的文档、教程和开源工具;
  5. 支持 Go 语言:我们的 Agent 用 Go 写,而 Tendermint 原生是 Go,集成非常方便。

4.2 核心概念:什么是 Harness DevSecOps 工具链?

4.2.1 概念结构与核心要素组成

Harness 是一个新一代的智能 DevSecOps 管理平台,它的核心目标是让软件交付更快、更安全、更可靠

Harness DevSecOps 工具链的核心要素可以分为以下几个模块:

  1. Harness Platform:所有模块的基础,提供用户管理、项目管理、组织管理、访问控制(RBAC)、API 接口等功能;
  2. Harness CI(Continuous Integration):自动化编译、测试、打包代码的模块,支持 Docker、Kubernetes、VM 等多种构建环境,支持 Test Intelligence(只运行受代码变更影响的测试,节省时间);
  3. Harness CD(Continuous Delivery/Deployment):自动化部署代码到各种环境(本地、AWS、Azure、GCP、Kubernetes、Docker Swarm 等)的模块,支持蓝绿部署、金丝雀发布、滚动更新等多种部署策略,支持自动回滚;
  4. Harness Chaos Engineering(CE):故意注入故障(网络分区、节点崩溃、CPU 满载、内存不足、磁盘 IO 延迟、数据库连接失败等)到系统中的模块,用于验证系统的容错能力,支持自定义故障,支持自动停止故障和恢复系统;
  5. Harness Feature Flags(FF):灰度发布新功能的模块,支持按用户、按地理位置、按设备类型、按百分比等多种方式开启/关闭新功能,支持 A/B 测试;
  6. Harness Cloud Cost Management(CCM):监控和优化云成本的模块,支持 AWS、Azure、GCP、Kubernetes 等多种云环境,支持成本预算、成本告警、成本优化建议;
  7. Harness Security Testing Orchestration(STO):自动化安全测试的模块,支持 SAST(静态应用安全测试)、DAST(动态应用安全测试)、SCA(软件成分分析)、Secret Scanning(密钥扫描)等多种安全测试工具,支持安全漏洞的自动修复;
  8. Harness Service Reliability Management(SRM):监控和管理服务可靠性的模块,支持 SLO(服务水平目标)、SLA(服务水平协议)、Error Budget(错误预算),支持自动告警和自动修复。
4.2.2 为什么我们选 Harness 作为指挥中心?

在这篇文章中,我们选择 Harness 作为整个系统的指挥中心,原因如下:

  1. 一站式平台:我们不需要用多个工具(Jenkins + Argo CD + Chaos Monkey + LaunchDarkly + CloudHealth),只需要用 Harness 一个平台就能完成所有工作;
  2. 易用性强:Harness 的界面非常友好,有可视化的 Pipeline 编辑器,不需要写大量的 YAML 配置(当然也支持写 YAML);
  3. 智能自动化:Harness 有 Test Intelligence、Auto Rollback、Auto Heal 等智能功能,能大大减少我们的工作量;
  4. 支持多云/多环境:我们可以用 Harness 把 Light Agent 部署到任何环境,从本地 Docker 到 AWS EC2 到 Kubernetes 集群;
  5. 支持 Web3 应用:Harness 虽然不是专门的 Web3 平台,但它支持任何 Docker 容器化的应用,包括 Tendermint Light Agent、Foundry/Hardhat 测试脚本、OpenZeppelin Defender Webhook;
  6. 免费额度充足:Harness Cloud 的免费额度足够我们完成所有实验,不需要花钱。

4.3 核心概念:什么是 OpenZeppelin?

4.3.1 概念结构与核心要素组成

OpenZeppelin 是一个Web3 安全开发平台,它的核心目标是让智能合约开发更快、更安全、更可靠

OpenZeppelin 的核心要素可以分为以下几个模块:

  1. OpenZeppelin Contracts:一个经过严格安全审计的智能合约库,提供 ERC-20、ERC-721、ERC-1155、角色权限、投票、多签、代理等常用功能的实现,是目前最流行的智能合约库;
  2. OpenZeppelin Defender:一个 Web3 自动化运维平台,提供 Relayer(中继器,用于自动发送交易)、Autotask(自动化任务,用于定时执行或触发执行智能合约函数)、Monitor(监控器,用于监控区块链事件和交易)、Advisor(安全顾问,用于检查智能合约的安全漏洞)等功能;
  3. OpenZeppelin Upgrades:一个智能合约升级工具,支持透明代理、UUPS 代理等多种升级模式,保证升级过程的安全性;
  4. OpenZeppelin Test Helpers:一个智能合约测试辅助库,提供时间快进、Gas 费计算、事件监听、余额检查等常用功能的实现,配合 Foundry 或 Hardhat 使用非常方便。
4.3.2 为什么我们选 OpenZeppelin?

在这篇文章中,我们选择 OpenZeppelin 作为身份验证和投票结果存证的模块,原因如下:

  1. 安全可靠:OpenZeppelin Contracts 经过了多次严格的安全审计,被以太坊、Binance Smart Chain、Polygon 等主流区块链上的数百万个智能合约使用;
  2. 易用性强:OpenZeppelin Contracts 提供了非常清晰的文档和示例代码,我们可以直接继承和扩展,不需要自己写复杂的身份验证和投票逻辑;
  3. 自动化运维:OpenZeppelin Defender 可以自动触发 Agent 投票、监控投票状态、处理异常,不需要我们自己写服务器;
  4. 免费额度充足:OpenZeppelin Defender 的免费额度足够我们完成所有实验,不需要花钱。

5. 概念之间的关系:系统架构与交互流程

5.1 系统整体架构图(Mermaid ER + 架构图混合)

首先,我们用 Mermaid 画一个系统整体架构图,展示所有核心概念之间的关系:

Tendermint BFT 投票层

Web3 身份验证/存证层

Harness DevSecOps 指挥中心

发起投票请求

调用智能合约

触发投票事件

将投票结果上链存证

返回投票结果

展示投票结果

自动编译/测试

自动编译/测试

自动编译/测试

自动部署

自动部署

自动部署

自动部署(故障版本)

注入网络分区

注入节点崩溃

注入恶意代码

发送投票提案

达成共识后发送投票结果

自动运行端到端测试

自动运行端到端测试

灰度发布新投票规则

人类用户/调度系统

MetaMask 钱包

Harness CI
编译/测试代码

Harness CD
部署 Light Agent

Harness Chaos
注入故障

Harness Test Intelligence
端到端测试

Harness Feature Flags
灰度发布规则

OpenZeppelin Defender
Autotask/Relayer/Monitor

Sepolia 测试网
以太坊全节点

OpenZeppelin 智能合约
Agent身份/投票存证

Tendermint Light Agent 1
(诚实)

Tendermint Light Agent 2
(诚实)

Tendermint Light Agent 3
(诚实)

Tendermint Light Agent 4
(拜占庭故障)

测试脚本

5.2 系统核心交互流程(Mermaid 流程图)

接下来,我们用 Mermaid 画一个系统核心交互流程图,展示从“用户发起投票请求”到“用户看到投票结果”的整个过程:

Harness Test Intelligence Harness Chaos Engineering Tendermint BFT 投票层(4个 Agent,N=4,f=1) OpenZeppelin Defender Sepolia 测试网 MetaMask 钱包 人类用户/调度系统 Harness Test Intelligence Harness Chaos Engineering Tendermint BFT 投票层(4个 Agent,N=4,f=1) OpenZeppelin Defender Sepolia 测试网 MetaMask 钱包 人类用户/调度系统 假设 Light_Agent_4 是拜占庭故障节点 它故意给 Light_Agent_1 发同意 batch1 的消息 给 Light_Agent_2 发同意 batch2 的消息 给 Light_Agent_3 发同意 fake_batch 的消息 即使注入 ≤1 个故障,系统仍能达成一致 发起“优先搬 batch1 货物”的投票请求 1 调用 OpenZeppelin 智能合约的 createProposal() 函数 (支付 Sepolia ETH Gas 费) 2 验证用户身份(ERC-721 Agent 管理员代币) 3 生成提案 ID,存储提案内容 4 返回提案创建成功的交易哈希 5 展示提案创建成功的消息 6 发出 ProposalCreated 事件 7 轮询/监听 ProposalCreated 事件 8 触发 VoteProposal Autotask 9 通过 HTTP API 发送投票提案 (提案 ID、提案内容、截止时间) 10 进入 Tendermint 共识流程(预投票 ->> 预提交 ->> 提交) 11 诚实节点(1、2、3)忽略故障节点的假消息 只信任来自其他诚实节点的消息 12 诚实节点(1、2、3)都收到了 2 个其他诚实节点的同意 batch1 的消息 加上自己的,一共 3 个(≥ 2f+1=3) 13 所有诚实节点都提交决策“同意 batch1” 14 可选:注入网络分区(比如断开 Light_Agent_3 的网络) 15 可选:注入节点崩溃(比如杀死 Light_Agent_2 的进程) 16 可选:注入恶意代码(比如篡改 Light_Agent_4 的代码) 17 可选:发送测试投票提案 18 可选:验证是否达成一致决策 19 可选:验证投票结果是否上链存证 20 可选:生成测试报告 21 通过 HTTP API 发送投票结果 (提案 ID、决策结果、投票证明:2f+1 个预提交签名) 22 验证投票证明(用 Tendermint Light Client 验证) 23 通过 Relayer 调用 OpenZeppelin 智能合约的 finalizeProposal() 函数 (支付 Sepolia ETH Gas 费) 24 验证投票证明(用 Solidity 实现的 Tendermint Light Client 验证) 25 存储投票结果,标记提案为已完成 26 返回提案完成的交易哈希 27 发出 ProposalFinalized 事件 28 轮询/监听 ProposalFinalized 事件 29 可选:通过邮件/短信/Slack 通知用户投票结果 30 轮询/监听 ProposalFinalized 事件 31 展示投票结果“同意 batch1” 32

6. 系统设计

6.1 项目介绍

我们的项目叫做 BFT-Agent-Voting-Harness,它是一个模拟拜占庭容错 Agent 投票验证系统,用于验证在多 Agent 协作场景下,BFT 共识算法的正确性和容错能力。

项目的核心功能如下:

  1. Agent 身份管理:用 OpenZeppelin ERC-721 代币管理 Agent 的身份,只有拥有有效代币的 Agent 才能参与投票;
  2. 提案创建与管理:用 OpenZeppelin Governance 模块创建和管理投票提案;
  3. BFT 投票:用 Tendermint Light Client 实现 BFT 投票逻辑,支持最多 1 3 \frac{1}{3} 31 的拜占庭故障节点;
  4. 投票结果存证:用 Sepolia 测试网存证投票结果,防止篡改;
  5. 自动化运维:用 OpenZeppelin Defender 自动触发投票、监控投票状态、处理异常;
  6. 自动化构建与部署:用 Harness CI 自动编译、测试代码,用 Harness CD 自动部署 Light Agent;
  7. 故障注入与验证:用 Harness Chaos Engineering 故意注入故障,用 Harness Test Intelligence 自动运行端到端测试,验证系统的容错能力;
  8. 灰度发布:用 Harness Feature Flags 灰度发布新的投票规则。

6.2 系统功能设计

我们用 用例图(Use Case Diagram) 来展示系统的功能设计:

渲染错误: Mermaid 渲染失败: No diagram type detected matching given configuration for text: useCaseDiagram actor "人类用户/调度系统" as User actor "Harness DevOps 工程师" as DevOps actor "Harness 安全工程师" as Security package "Web3 身份验证/存证层" { usecase "创建 Agent 身份代币" as UC1 usecase "创建投票提案" as UC2 usecase "查看投票提案" as UC3 usecase "查看投票结果" as UC4 } package "Tendermint BFT 投票层" { usecase "参与 BFT 投票" as UC5 usecase "达成共识决策" as UC6 } package "Harness 指挥中心层" { usecase "编译/测试代码" as UC7 usecase "部署 Light Agent" as UC8 usecase "注入故障" as UC9 usecase "运行端到端测试" as UC10 usecase "灰度发布规则" as UC11 usecase "监控云成本" as UC12 } User --> UC1 User --> UC2 User --> UC3 User --> UC4 DevOps --> UC7 DevOps --> UC8 DevOps --> UC11 DevOps --> UC12 Security --> UC9 Security --> UC10 UC2 --> UC5 UC5 --> UC6 UC6 --> UC4 UC7 --> UC8 UC9 --> UC5 UC9 --> UC6 UC10 --> UC5 UC10 --> UC6 UC10 --> UC4 UC11 --> UC5

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 的拜占庭故障类型(nonesplit_votefake_proposalno_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
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐