Page 256 - 《软件学报》2025年第7期
P. 256
张孝 等: 区块链测试基准综述 3177
中将区块链抽象为 (E, R, I) 的元组, 其中 E 代表区块链的节点集合, R 代表了资源状态的结合, 例如账户余额、智
能合约状态等, I 代表了交易类型, 例如转账、合约调用等. 新的区块链加入需要实现至少 1 种交易类型和 4 个具
体的区块链执行函数. 这些函数包括创建客户端、创建资源、编码交互和触发交互发送到区块链. 上述两个基准
中虽然提供了统一的适配接口, 但是各区块链系统需要通过自己的部署脚本进行部署适配.
BCadvisor [44] 是一个面向资源的区块链测试基准, 它采用了模块化架构, 包括 3 个协作模块: 区块链模块、数
据解析器和指标可视化器. 其中, 区块链模块采用 Docker 技术进行部署管理, 保证了新区块链协议的兼容性. 研究
中没有针对 Docker 部署的方式进行详细的描述. DAGBENCH [46] 中配置文件包含网络、负载、环境的配置, 通过
读取配置文件, 可以完成 DAG 实例的初始化. 但是研究中缺少针对部署管理的详细描述.
5.5.2 攻击配置
区块链系统的安全性是其成功应用和广泛采用的关键因素之一, 也是其区别于数据库技术的显著特征, 因此
攻击配置是区块链基准的要素之一. 根据第 4 节的分析, 可以通过模拟节点故障、网络分区和恶意攻击等常见故
障及攻击来测试系统的安全性. 目前的基准中仅有 BlockBench、BBSF、Diablo 和 BCadvisor 考虑了攻击配置, 但
是前三者均没有考虑恶意攻击的情况. C2B2 和 BCTMark 提供了网络仿真的功能, 能够通过配置文件的描述实现
对各种网络故障的模拟, 但是二者均缺少了实验分析.
BlockBench [39] 在压测过程中通过关闭服务器来模拟节点故障, 评估了各系统应对系统崩溃故障的能力. 通过
模拟导致网络分区的攻击, 评估了区块链系统抵御双重支付或自私挖矿攻击的能力. Diablo [42] 通过注入高工作负
载, 测试区块链的性能, 以此来评估区块链系统抵御拒绝服务攻击的能力. BBSF [88] 在一个 32 节点的区块链上运行
工作负载, 通过分别设置 0、4 和 8 个节点返回空值和随机值来模拟崩溃故障和恶意攻击, 测量和分析不同故障情
况下的性能变化, 从而评估系统在面对安全攻击时的性能影响程度.
BCTMark [45] 中提供了网络仿真功能, 通过配置文件的描述, 可模拟数据包丢失率、网络延迟和网络速率 (带
宽) 等网络特性, 这个功能可用于研究网络故障、延迟对区块链性能的影响. 但是研究中没有针对网络故障进行测
试. C2B2 集成了 Kubernetes 的云原生混沌工程库 ChaosMesh, 并扩展了其网络仿真能力, 支持多个目标网络配置.
用户可以使用简单的高级描述文件描述目标网络环境和网络故障 (例如网络性能损失、节点崩溃、分区等). 该研
究中利用该功能评估了地理分布对性能的影响, 但缺少了对网络故障等条件下区块链系统性能的分析.
文献 [47] 中给出了故障负载 (Faultload) 的定义, 是指当出现磁盘故障、网络超载或故意攻击等情况时, 区块
链系统应能够保证账本的不可变性, 并在不崩溃的情况下正常运行. 但是该文献在实验设计中没有对区块链进行
攻击配置.
BCadvisor [44,87] 模拟了两种常见的攻击: DDoS 攻击和 Sybil 攻击. 评估了这两类攻击对系统性能的影响情况.
5.5.3 测试流程
在现有的区块链测试基准中, 超过一半的基准都对测试流程进行了详细的描述. 虽然各个基准的工具实现方
式不同, 其基准测试的流程也存在差异, 但大多数都包括了环境准备、测试执行和测试报告这 3 个部分. 以下进行
详细对比分析.
DAGBENCH 定义了基准测试的步骤, 包括初始化区块链环境、部署负载、执行负载、产生报告和环境清理
等. BCTMark [45] 定义基准测试的基本流程包括申请资源、部署测试环境、执行测试、备份结果和环境清理等.
xBCBench 的工作流程包括 3 个阶段: 准备阶段、测试阶段和报告阶段, 其中准备阶段包括环境部署、合约
部署和监控组件的启动. 测试阶段是按照预定的测试计划执行负载, 并收集进度信息. 报告阶段的主要工作是收集
资源效率数据和性能数据, 并汇集成可视化报告.
BlockMeter [48] 的工作流程主要包括用户创建、负载创建、流量/负载生成、事务请求、请求预处理、性能监
控和事务响应等环节. 在测试过程中, 它利用 JMeter 生成 HTTP 请求, 并将其发送至 API 网关. API 网关在接收到
HTTP 请求后, 会创建实例并初始化性能矩阵. 请求随后被转发至事务处理程序, 进行预处理并发送至区块链平台.
当事务准备提交至区块链时, 性能监控器开始记录性能矩阵以及 Docker 容器/实例的使用情况. 一旦区块链完成
事务处理, 它会向框架发送响应, 此时性能矩阵被最终确定, 并向 JMeter 返回成功的状态码. 性能数据, 包括事务

