基于交易语义识别的庞氏合约检测
一、论文信息
题目:《Ponzi Scheme Detection in Smart Contract via Transaction Semantic Representation Learning》
级别:IEEE Transactions on Reliability,中科院二区,CCF-C类
作者院校:扬州大学
二、论文动机
现有方法的局限性:
- 语义不足
- 庞氏关键语义获取
- 未充分利用特征
提出一个基于学习交易语义的方法:用一种新的代码表示方法sTPG,将交易语义表示成一个图,然后利用gcn来学习交易模式。
设计方法的考量:
- 为了处理复杂语义:cfg
- 为了处理无关代码:切片
- 状态变量的过程内数据依赖重要性
三、具体方法
文中有给一个走完了全流程的例子,各部分的最后一段是对该例子的操作。
训练阶段
简单说就是通过静态分析,程序切片和过程内状态变量依赖分析这三个步骤,从一个合约中获得一组sTPG,然后用这些sTPG作为特征进行训练。
3.1 静态分析
- 先构建交易函数集
- 然后用slither对每个交易函数构建cfg
- 接着对每个cfg用forward dominance relation方法来获得控制依赖边,用变量def-use链来获得数据依赖边和数据流边
- 构建状态变量依赖边,从read到write
至此对每个交易函数都有一个PDG图,图中有5种边,控制依赖边、数据依赖边、控制流边、数据流边和状态变量依赖边。
3.2 程序切片
对静态分析中获得的每个PDG应用以下两个切片标准:
- 每个transfer API,后向切片
- 切片1中存在的全部状态变量,后向前向切片
3.3 过程内状态变量依赖分析
在所有可调用的函数中,查找修改了(交易API依赖的状态变量)的语句,添加过程间状态变量依赖边,从read到write。
3.4 模型训练
初始化:
- 节点嵌入初始化:用一个开源的基于AST的模型Infercode来获得向量
- 边嵌入初始化:先合并同方向边,接着将边编码成五维的onehot形式,每一维度分别表示控制流、数据流、数据依赖、控制依赖和状态变量依赖
为了利用上边的信息,他们提出了一个relation-sensitive gcn:先用一个MLP计算边的隐藏特征,然后将节点特征和隐藏特征相拼接,用拼接后的特征进行图卷积(不太了解图卷积,这里没懂),最后用一个最大池化层和MLP进行分。
检测阶段
类似训练阶段
四、实验复现
用slither进行静态分析,然后用Networkx构建sTPG,接着用Pytorch和PYG实现RS-GCN。
硬件信息和模型参数都有交代,见EXPERIMENT章节的Implementation段
五、不足
- 仅针对solidity
- 识别出的交易语义源自一个交易函数——可扩展到跨函数交易语义挖掘
- 可尝试利用更多信息,比如AST中的信息
- 数据不平衡