Page 235 - 《软件学报》2025年第10期
P. 235
4632 软件学报 2025 年第 36 卷第 10 期
征提取不充分的问题, 提出了一种用于智能合约函数表示的切片交易属性图, 以全面准确地捕获智能合约函数中
的交易语义信息. Yu 等人 [35] 将庞氏骗局的识别和检测建模为节点分类任务, 通过人工抽取庞氏骗局合约的固有特
征, 并将这些特征与交易网络的拓扑结构相结合, 提出一种基于图卷积网络的检测模型来精确区分庞氏骗局合约.
将智能合约交易建模为交易网络的方式可以很好地捕捉交易的时间特性. 但是, 现有的节点嵌入方法会丢失
部分节点信息, 且不能很好地结合交易网络的节点特征和拓扑结构.
1.2 智能合约的中间表示
智能合约是一个有逻辑的程序, 合约代码反映着交易逻辑特征, 其中存在着投资者进行投资和接收回报的交
易机制 [36] . 因此, 对智能合约代码进行建模和分析, 以提取其中的控制流信息具有极其重要的意义. 在对智能合约
源代码进行控制流分析的相关研究中, 常用的方法主要包括将智能合约源代码描述为序列或抽象语法树的形
式 [37] .
序列表示将代码简单地视为一系列连续的标记 (如词法单元或语句), 按照它们在源代码中的顺序排列. 这种
表示不考虑代码结构或语义, 只是将代码视为一串字符或标记的线性排列. 当代码被描述为序列时, 可以进一步使
用处理序列的深度学习模型来学习智能合约的特征, 例如, Liu 等人 [38] 和 Hochreiter 等人 [39] 将合约代码表示为序
列, 然后分别使用 n-gram 语言模型和 LSTM 网络处理合约序列, 进而实现对智能合约的漏洞检测. 基于序列的代
码表示描述了智能合约语句的执行顺序, 但不能表征数据流、指令之间的调用关系以及语句的详细执行结构.
对此, 有研究 [28] 将智能合约表示为抽象语法树, 将代码表示为树状结构, 其中每个节点是代码中出现的一个
结构, 这种表示方式捕捉了代码的语法结构和组织方式. 抽象语法树去除了具体的细节, 如括号、分号等, 并以树
的形式展现代码的层次结构和语义信息. 例如, Xu 等人 [40] 将合约源代码表示为抽象语法树的形式, 然后使用 k 最
近邻方法 (k nearest neighbor, KNN) 对抽象语法树特征进行提取, 实现了对智能合约漏洞的检测. Wang 等人 [41] 使
用一种语言识别工具 ANTLR 将智能合约的功能片段解析为抽象语法树, 以提取智能合约的漏洞特征. 基于树的
代码表示可以描述代码的语法信息, 但仍然不能明确地描述语句的执行顺序, 并且缺乏数据流的信息.
现有研究 [42] 表明, 程序可以转换为符号图表示, 这能够保持程序元素之间的语义关系, 如数据依赖关系和控
制依赖关系. 例如, Liu 等人 [43] 将源代码丰富的控制流和数据流语义转换为合约图, 并设计了一个节点消除过程来
规范化合约图并突出图中的重要节点, 实现了对 3 种智能合约漏洞类型的高效识别. Yan 等人 [44] 将恶意软件程序
构建为控制流图 (control flow graph, CFG) 的方形式, 克服了现有恶意软件分类方法中非自适应图匹配技术的缺
点, 实现了对恶意软件的高效分类. Cai 等人 [45] 结合抽象语法树、控制流图、程序依赖图 (program dependency
graph, PDG), 构建了具有语法和语义特征的智能合约的图表示, 使得模型对智能合约漏洞检测的准确率高达
89.2%. Wen 等人 [46] 基于有向图的可视化方法来显示投资和奖励流程以及关键任务的执行路径, 从而轻松识别以
太坊上的庞氏骗局合约.
受此启发, 本文将智能合约源代码转换成图的形式来实现对庞氏骗局合约的检测. 具体来说, 本文使用基于控
制流图的方法来表征代码之间的数据依赖和控制依赖关系, 将合约代码的执行路径表示为有向图的形式. 控制流
图由节点和边组成, 其中节点代表基本块 (一组顺序执行的语句), 边代表控制流转移 (如条件分支、循环等) [47] . 控
制流图可以更形象直观地描述代码执行的路径和控制流程, 便于反映庞氏骗局合约的代码特征, 从而更有利于提
高对庞氏骗局合约的检测效果.
2 方 法
本文设计了一种基于代码控制流图的庞氏骗局合约检测模型, 该模型包括智能合约特征提取、特征对齐、特
征学习和合约分类 4 个模块.
模型的总体架构如图 2 所示. 首先, 将智能合约的源代码转换成控制流图的结构, 然后提取图结构的节点特征
和边特征. 其次, 考虑到不同合约生成的控制流图结构并不相同, 导致生成的特征维度有很大差别, 本文加入了特
征对齐模块. 然后, 利用 Transformer 与 GCN 对得到的节点和边的特征进行学习, 捕捉庞氏骗局合约的特征. 最后,

