Page 250 - 《软件学报》2025年第7期
P. 250
张孝 等: 区块链测试基准综述 3171
准主要将资产转移 (即转帐业务) 作为其操作负载的核心, 并没有介绍复杂的应用模型的设计. BlockBench [39] 采用
了 3 个广受欢迎的以太坊智能合约 EtherId、Doubler 和 WavesPresale, 以及两个数据库基准 YCSB 和 Small Bank
作为工作负载. 然而, 它并未详细介绍这些工作负载的应用场景设计.
针对目前的基准分析, 将区块链基准的应用模型大体分为以下 3 类. 表 7 展示对目前基准的分析.
表 7 应用模型对比分析
基准 记账应用 复杂业务 基本操作
[39]
BlockBench ✓ ✓ ✓
Klenik等人 [50] ✓ - -
[88]
BBSF ✓ ✓ -
[42]
Diablo ✓ ✓ -
[46]
DAGBENCH - - ✓
[43]
Gromit - - ✓
[47]
xBCBench - - ✓
第 1 类: 记账应用, 包括交易所、NFT 市场、NFT 铸造以及 Small Bank 等场景. 此类场景特征是数据模式简
单, 合约逻辑简单, 操作简单, 可能某个时间段出现峰值交易.
第 2 类: 复杂业务应用, 包括游戏, 视频分享和移动应用等. 这些场景通常具有复杂的数据模型和操作流程, 并
且可能包含计算密集型的交易处理.
第 3 类: 基本操作类应用, 包括键值存储 (YCSB)、资产转移和算术运算等. 这些场景以简单的操作集合为特
征, 缺乏复杂的业务逻辑, 主要用于基础性能的评估.
5.2 数据模型
区块链测试基准的数据模型主要包含数据模式和数据集.
目前对数据模式的设置有两种方式, 一是基于数据库基准中的数据模式进行修改, 二是基于现有区块链中流
行的智能合约进行修改.
[39]
BlockBench 基于 Small Bank 场景设计了一个转账的智能合约. 合约中定义了账户表、储蓄表和支票表这
3 个表, 存储的键值由表名和账户 ID 组合而成. 利用 ChaincodeStub 接口 GetState 和 PutState 方法来获取和更新
账户的状态. 此外, BlockBench 使用了 3 个以太坊流行的智能合约 EtherId、Doubler 以及 WavesPresale 设计交易
内容, 并根据被测系统进行了调整, 例如在 Hyperledger 中, EtherId 合约创建了两个不同的键值命名空间. 第 1 个
用于存储域名数据结构, 在域名创建中, 合约将域名值插入此命名空间, 并使用域名作为键. 第 2 个命名空间用于
存储用户账户余额, 使用表名和账户名作为键. 在进行域名转让时, 交易需传入发送者、购买价值、域名、新价格
和新所有者的信息等参数.
文献 [50] 基于数据库基准 TPC-C 来构造合约和交易, 将 TPC-C 的关系数模式转换映射到 Hyperledger Fabric
键值数据库中实体. 键空间沿着“数据库表”进行分片, 使用数据库表名作为前缀来区分实体类型. 每个实体的键是
由主键连接而成的, 例如一个仓库键表示为: concat(‘WAREHOUSE’, w_id), 其中, w_id 是仓库实体的唯一主键.
数据集主要包括区块 (含交易) 数据和状态数据库. 现有的区块链测试基准中大多描述了区块交易, 对状态数
据库讨论较少. BlockBench 通过实现了一个键值存储的智能合约, 利用 YCSB 驱动的负载客户端预加载若干记录,
用于读写测试. DAGBENCH [46] 在执行查询负载以前, 预加载了不同数量的交易作为测试数据集. 对于数据加载的
方式, 智能合约的实现没有详细的描述. BBSF 中提到测试基准中需要设置测试的起始条件, 包含测试数据集, 钱
包与合约的初始余额和初始状态以及外部结构 (变量、函数、结构) 的初始值等. 由于数据集特别是状态数据库
大小对查询性能影响较大, 如果测试基准面向查询为止的应用场景, 应该包含数据集的具体参数.
5.3 负 载
区块链测试基准的负载描述应该包含负载的内容和负载的静态动态特征描述. 目前大多数区块链基准定义了

