关键词:
智能合约
差分测试
Solidity编译器
合约生成
摘要:
Solidity是一种新兴的编程语言,专门设计用于简化智能合约的开发,在支撑不断增长的区块链交易中发挥着关键作用。到目前为止,大约有5000万个合约部署在以太坊上,为跨多领域的分散应用程序提供了基础层,包括加密货币钱包、金融服务、社交和游戏等。智能合约的源代码必须经过其语言处理器(即Solidity编译器)处理,以便能够在区块链上部署和调用。如果编译器存在缺陷,可能导致智能合约的错误执行或安全问题,恶意攻击者可以利用这些问题攻击合约,造成资金损失或数据泄露等严重后果。因此,确保编译器本身的无缺陷性或正确性至关重要。
模糊测试是一种对软件的稳定性与安全性进行测试的技术,被广泛认可为发现常规软件程序和编译器基础设施中潜在错误或缺陷的最有效方法之一。尽管已经对更传统的语言处理器(如C和Java的编译器,以及Python和Java Script的解释器)进行了广泛的模糊测试研究,但对于这种新兴的、快速迭代的且经济性极强的Solidity编译器模糊测试的相关研究却寥寥无几。因此,本研究受深度神经网络强大的学习能力的启发,首次提出了将基于深度学习生成模型融合到Solidity编译器模糊测试中的方法,用于探索Solidity编译器中可能存在的缺陷。本研究的主要工作体现在以下两个方面:
(1)提出融合神经代码生成和突变的Solidity智能合约自动生成方法。首先,该方法的主要组件是一个基于Transformer的智能合约生成模型。通过对收集的合约源代码进行预处理构建了合约语料库,并采用基于字符级的切分方法对语料库中的合约进行切分,以获取训练样本驱动Transformer模型实施有监督学习,进而获取到基于Transformer架构的合约生成模型。然后,采用语义编码和聚类构建初始种子池,并使用生成模型集成精心设计的生成策略和细粒度突变策略,基于种子合约去自动生成高质量测试合约。最终,实验结果表明,这些设计使得生成模型在生成合约时达到了90.8%的语法有效性,并显著提高了代码的多样性和覆盖率。
(2)提出基于差分测试的Solidity编译器缺陷检测方法。该方法是对差分测试的一种改进,旨在对Solidity编译器进行全面的测试。首先,对生成合约使用0.4.24版本的编译器进行编译,自动捕获并解析编译信息,检测编译器内核错误。对编译通过的生成合约,通过建立本地化的以太坊虚拟机执行环境,进行执行并对各种指标(包括Gas消耗,操作码大小和计算结果等)进行了细致的记录和对比分析,检测编译器优化错误。然后,根据每份生成合约的具体检测结果,计算其对应的有趣分数,从而进行种子池的自动更新。最后,通过三个月时间的研究测试,六个编译器内核错误和许多的编译器优化错误被依次的发现,充分反映了本研究方法在发现Solidity编译器错误方面的出色表现。