基于交易语义识别的庞氏合约检测

一、论文信息

题目:《Ponzi Scheme Detection in Smart Contract via Transaction Semantic Representation Learning》

级别:IEEE Transactions on Reliability,中科院二区,CCF-C类

作者院校:扬州大学

二、论文动机

现有方法的局限性:

  1. 语义不足
  2. 庞氏关键语义获取
  3. 未充分利用特征

提出一个基于学习交易语义的方法:用一种新的代码表示方法sTPG,将交易语义表示成一个图,然后利用gcn来学习交易模式。

设计方法的考量:

  1. 为了处理复杂语义:cfg
  2. 为了处理无关代码:切片
  3. 状态变量的过程内数据依赖重要性

三、具体方法

文中有给一个走完了全流程的例子,各部分的最后一段是对该例子的操作。

训练阶段

简单说就是通过静态分析,程序切片和过程内状态变量依赖分析这三个步骤,从一个合约中获得一组sTPG,然后用这些sTPG作为特征进行训练。

3.1 静态分析

  1. 先构建交易函数集
  2. 然后用slither对每个交易函数构建cfg
  3. 接着对每个cfg用forward dominance relation方法来获得控制依赖边,用变量def-use链来获得数据依赖边和数据流边
  4. 构建状态变量依赖边,从read到write

至此对每个交易函数都有一个PDG图,图中有5种边,控制依赖边、数据依赖边、控制流边、数据流边和状态变量依赖边。

3.2 程序切片

对静态分析中获得的每个PDG应用以下两个切片标准:

  1. 每个transfer API,后向切片
  2. 切片1中存在的全部状态变量,后向前向切片

3.3 过程内状态变量依赖分析

在所有可调用的函数中,查找修改了(交易API依赖的状态变量)的语句,添加过程间状态变量依赖边,从read到write。

3.4 模型训练

初始化:

  • 节点嵌入初始化:用一个开源的基于AST的模型Infercode来获得向量
  • 边嵌入初始化:先合并同方向边,接着将边编码成五维的onehot形式,每一维度分别表示控制流、数据流、数据依赖、控制依赖和状态变量依赖

为了利用上边的信息,他们提出了一个relation-sensitive gcn:先用一个MLP计算边的隐藏特征,然后将节点特征和隐藏特征相拼接,用拼接后的特征进行图卷积(不太了解图卷积,这里没懂),最后用一个最大池化层和MLP进行分。

检测阶段

类似训练阶段

四、实验复现

数据集是开源的,放在了https://github.com/smartcontract-detect-yzu/PonziDataset,一部分是之前文章的开源数据集,一部分是从各个地方找合约然后人工打标签的,剩下是etherscan上标记为庞氏的。

用slither进行静态分析,然后用Networkx构建sTPG,接着用Pytorch和PYG实现RS-GCN。

硬件信息和模型参数都有交代,见EXPERIMENT章节的Implementation段

五、不足

  1. 仅针对solidity
  2. 识别出的交易语义源自一个交易函数——可扩展到跨函数交易语义挖掘
  3. 可尝试利用更多信息,比如AST中的信息
  4. 数据不平衡