Page 252 - 《软件学报》2025年第7期
P. 252

张孝 等: 区块链测试基准综述                                                                 3173


                 分布是根据    Uniswap-V2  的历史数据生成的. NFT     市场: 一个   NFT  市场的交易量. 工作负载包括列出交易、发布
                 NFT、销售交易以及资金和         NFT  的转移. 工作负载的大小、交易组合和到达分布基于                OpenSea 的历史数据. NFT
                 铸造: 通过生成独特的随机数确定           NFT  特征, 使用  IPFS  将艺术作品与代币绑定, 并将代币交给用户完成交易. 这
                 个工作负载的交易在时刻         0  就完成了, 不需要到达分布, 因为典型的          NFT  项目在初始部署时完成大部分或全部的
                 铸造. 工作负载的大小基于常见的          NFT  项目规模. 体育博彩网站: 工作负载涉及计算赢家并支付奖金, 所有交易都
                 从时刻   0  开始, 区块链以最大吞吐量运行. 工作负载的大小是根据当前                Web2  体育博彩网站    (如  Fanduel) 上不同规
                 模比赛的数据确定. BBSF      [88] 中使用历史数据来确定交易组合和到达分布, 交易组合描述了负载中交易类型及其比
                 例, 到达分布描述了负载的特征, 包括负载类型和频率随着时间的变化.
                    DAGBENCH  [46] 中转账操作作为事务处理的工作负载. 转账操作被定义为将货币或任意数据从一个用户转移
                 到另一个用户. Gromit   [43] 使用固定的资产转移作为工作负载, 工作负载由至多              64  个客户端发出, 均匀地分配给每
                 一个验证节点. 但是文献中没有详细介绍工作负载的智能合约实现. xBCBench                    [47] 根据不同的区块链系统开发了不
                 同的工作负载. 对于以太坊, 开发了         3  种工作负载: 账户创建、账户查询和账户之间的转账. 对于                Sawtooth, 开发了
                 查询和   Small Bank  工作负载. 对于  FiscoBcos, 开发了设置  (set) 和获取  (get) 两种工作负载, 其中设置负载负责生
                 成一个   HelloWorld  智能合约并部署该智能合约, 获取负载负责调用智能合约并输出                  Hello World. xBCBench  中所
                 有负载的发送速率通过基准测试层进行配置. BlockMeter             [48] 中选取了  3  个典型的区块链应用作为负载. 一是简单
                 的键值存储应用程序: 该应用程序在区块链中根据唯一                  ID  存储特定的值, 并执行插入、更新和删除数据等操作.
                 二是数据密集型应用程序: 该应用程序在每个事务中处理大量数据, 对大小为                         10 KB  的记录执行读写操作. 三是

                 CPU  密集型应用程序: 该应用程序包括对随机数进行重复算术运算操作.
                    (3) 负载产生器
                    少量区块链测试基准提供了一个负载产生器, 可以自由定义负载的类型和比例, 但并不绑定具体应用场景.
                 Touloupou  等人  [99] 提出的测试基准中开发了两个组件, 负责生成账户并在网络中执行交易. 用户可以通过参数, 调
                 整要执行的交易数量和要交换的货币金额. BCTMark              [45] 中提供了两种方式产生负载, 一种是使用         Python  编写的负
                 载生成器   Locust 产生随机负载, 另一种是基于区块链主网的历史交易数据生成负载, 重放交易过程. BCadvisor                      [44]
                 开发了一个工作负载引擎, 为区块链生成预定义的工作负载量.

                 5.3.2    数据查询负载
                    目前区块链基准中只有         BlockBench [39] 和  DAGBENCH [46] 定义了数据查询负载. BlockBench [39] 中定义了一个查
                 询负载用来测试区块链数据层的性能. 该负载包含以下两个查询, 实现从区块链数据获取统计信息.
                    ● Q1: 计算在第   i 个块和第  j 个块之间提交的总交易金额.
                    ● Q2: 计算在第   i 个块和第  j 个块之间涉及给定状态        (账户) 的最大交易金额.
                    DAGBENCH   [46] 定义了交易查询的负载用来测试        DAG  网络对历史数据检索的性能. 它包含两个查询: 查询               1
                 (Q1): 计算给定账户的输入交易数量和输出交易数量. 查询               2 (Q2): 计算给定账户的余额.

                 5.3.3    负载总结
                    目前的测试基准大多数都包含了对工作负载的说明, 但是仍然存在一些问题.
                    ● 对于实现工作负载的智能合约描述的都比较简单, 缺少了对合约具体实现方法的设计和描述.
                    ● 大多数文献缺少了对负载动态特性的考虑, 只有               BlockBench [39] 、BBSF [100] 和  Diablo [42] 关注了负载的动态特
                 性, 并将其设置为与真实业务场景相匹配.
                    ● 数据查询负载比较少, 只有        BlockBench [39] 和  DAGBENCH [46] 中定义了查询负载, 其他测试基准均没有考虑
                 数据查询负载.

                 5.4   指 标

                 5.4.1    指标定义
                    根据业务场景不同, 区块链测试基准中的指标定义也不同, 现有测试基准的指标总结如表                            9  所示. 绝大部分区
   247   248   249   250   251   252   253   254   255   256   257