Page 237 - 《软件学报》2025年第10期
P. 237
4634 软件学报 2025 年第 36 卷第 10 期
为了深入挖掘合约代码的运行逻辑, 本文根据 Chen 等人 [21] 数据集. 从 Etherscan 网站爬取了每一个合约的源
代码, 并将每个合约的源代码都转换成控制流图的形式. 控制流图是一种图形表示, 能够清晰地展示代码中的控制
结构和执行路径, 有助于理解代码的逻辑结构和可能的执行流程. 具体实现过程如下.
(1) 代码解析与语法分析
首先需要将智能合约的编程语言 Solidity 转化为计算机能够理解的抽象语法树. 该过程主要是通过语法分析
器将代码字符串分解成的词法单元序列转换为树状结构, 可以更好地反映合约源代码的层次和语法结构. AST 是
程序的抽象表示, 树状结构的节点代表代码的各个部分, 如函数声明、表达式、语句等, 树状结构的边则表示这些
节点之间的关系, 如语法结构的父子关系、节点之间的操作依赖关系、程序执行的控制流转移等.
(2) 构建基本块
在对智能合约进行语法分析的基础上, 将代码划分为基本块, 每一个代码块即一组连续的语句, 在执行的过程
中不存在跳转或分支. 每个基本块只能从第 1 条语句进入并从最后一条语句离开, 即只有一个入口点和一个出口
点, 这是基本块的特征. 构建基本块的目的是将代码分割成更小、易于处理的模块, 为后续的分析和图形的构建奠
定基础.
(3) 建立控制流图
根据基本块之间的控制关系, 构建控制流图. 控制流图由节点和边组成, 其中每个节点对应一个基本块, 每条
边对应基本块之间的控制转移路径, 从而形成一个有向图结构. 例如, 条件语句会引入分支, 循环语句会引入循环
体, 这些都会在控制流图中体现出来.
控制流图的边不仅可以表示控制转移关系, 还可以表示数据流的传递. 通过对节点之间的数据流进行分析, 可
以追踪合约中变量在程序执行过程中的使用和赋值情况, 帮助理解智能合约源代码的交易行为和潜在的安全问
题. 后文图 4 展示了一个由智能合约生成的控制流图的局部结构, 其中每个节点代表一组连续的语句, 而节点之间
的连线则表示代码块之间的数据流转移路径. 通过这个图可以直观地观察到各个代码模块之间的控制流转移情况.
庞氏骗局合约交易存在的显著特点是前期投资者的回报往往来自后期加入的投资者的资金, 因此, 控制流图
可以很好地捕捉这一数据流特点, 从而有助于识别潜在的庞氏骗局合约.
2.2 特征提取与对齐
(1) 特征提取
Word2Vec 是自然语言处理中一种流行的词嵌入算法, 可以将单词映射到低维的向量表示, 并且还会保留单词
之间的语义关系. 本文将基本块视为“单词”, 控制流图视为“文本”, 然后利用 Word2Vec 算法将基本块的结构信息
转换为向量表示. 具体实现过程如图 5 所示.
首先, 需要遍历控制流图中的每一个基本块, 收集其中的指令和操作数. 将收集到的基本块内容按照控制流图
中的顺序排列, 形成一个文本序列. 然后, 将生成的文本序列作为输入, 使用 Word2Vec 模型进行训练, 得到每个基
本块的词向量表示. 通过对图中的节点进行嵌入, 将节点表示为低维度的向量, 以捕捉节点之间的相似性和关联
性. 本文使用的是 Word2Vec 模型中的 Skip-gram 模型, 该模型主要是通过对给定的中心词来预测上下文词的概
率. 这里, 对于给定的中心词 ω c , 上下文词 ω o 的概率可以通过如下公式计算:
T
exp(v v ω c )
ω o
P(ω o |ω c ) = ∑ (1)
T )
ω
exp(v v ω c
ω∈V
其中, ω c 的向量表示. Skip-gram 模型是通过最大化预测正确上下文词的
v ω o 和 v ω c 分别表示上下文词 ω o 和中心词
概率来学习单词的向量表示.
对于一个给定的控制流图, 可以将节点 (基本块) 看作是单词, 基于节点序列训练 Skip-gram 模型, 学习每个节
点的向量表示.
通过上述模型训练, 可以得到每个基本块对应的向量表示, 这些基本块向量捕捉了基本块在控制流图中的语
义信息. 但是, 这些原始向量可能过于庞大, 不太适合后续任务的直接应用. 因此, 需要对这些基本块向量进行降维

