0%

EtherDiffer

Kim S, Hwang S. EtherDiffer: Differential Testing on RPC Services of Ethereum Nodes[C]//Proceedings of the 31st ACM Joint European Software Engineering Conference and Symposium on the Foundations of Software Engineering. 2023: 1333-1344.

挑战

  • 测试用例生成
    • 语义有效的测试用例
    • 语义无效但是可执行的测试用例:变异生成
  • 执行交易前的初始状态一致

测试对象是4个客户端的RPC服务,意图是根据已有的SPEC规范来生成测试用例,实际贡献非常solid

项目开源:https://github.com/JosephK95/EtherDiffer-public

数据集:https://solidity-by-example.org/hello-world/

依赖:https://figshare.com/articles/software/EtherDiffer_Differential_Testing_on_RPC_Services_of_Ethereum_Nodes_Code_/23913096/1

实验数据:https://figshare.com/articles/dataset/EtherDiffer_Differential_Testing_on_RPC_Services_of_Ethereum_Nodes_Data_/21936555/1

Methodolody

Overview

针对4个客户端geth Nethermind Erigon Besu,每4个节点组成一个私链

测试用例生成依赖web3.js

定义了DSL,用于捕捉函数参数的语法和语义要求,并将库规范转换为$spec_{DSL}$。EtherDiffer首先从specDSL中选择一个方法,然后Generator生成符合语义要求的模板代码,其中所有参数都满足其要求。此外,Mutator以随机方式将其中一个参数更改为语义无效的值,同时保持其类型。最后,Test Case Converter通过将模板代码与每个目标节点绑定来实例化一组四个测试用例。一旦执行完成,Error Checker报告只有一部分节点引发错误,而其他节点返回值,并且Value Checker报告返回值是否彼此不一致。

测试用例使用try-catch语句包装,以正确识别错误,同时保持EtherDiffer的执行

测试用例生成

基于web3.js

为了自动化处理库规范,定义了一个领域特定语言,用于捕捉函数参数的类型和语义要求。规范s包括类型定义、子类型关系、属性定义和方法声明。类型t可以是基本类型t_p,对象类型,数组类型或两个类型的并集。对象类型是一组键-类型对的集合,其中一些可以是可选的。

image-20240312155349225

这部分能用solidity的声明吗?