会员体验
专利管家(专利管理)
工作空间(专利管理)
风险监控(情报监控)
数据分析(专利分析)
侵权分析(诉讼无效)
联系我们
交流群
官方交流:
QQ群: 891211   
微信请扫码    >>>
现在联系顾问~
首页 / 专利库 / 智能合约 / 一种基于智能合约调用网络的智能合约漏洞检测方法

一种基于智能合约调用网络的智能合约漏洞检测方法

申请号 CN202011596588.3 申请日 2020-12-30 公开(公告)号 CN112613043A 公开(公告)日 2021-04-06
申请人 杭州趣链科技有限公司; 发明人 黄方蕾; 汪小益; 吴琛; 张帅; 胡麦芳; 张珂杰; 詹士潇; 匡立中; 谢杨洁; 邱炜伟; 蔡亮; 李伟;
摘要 本发明公开了一种基于智能合约调用网络的智能合约漏洞检测方法,该方法包括:首先根据智能合约的函数调用生成智能合约调用网络;然后根据智能合约创建信息生成智能合约创建网络;在智能合约创建网络中聚合开发者的信息作为合同的开发者特征,在源代码中提取智能合约操作特征,在智能合约调用网络中使用最大池化聚合函数对两类特征进行聚合并执行漏洞检测任务;最终根据智能合约的预测标签判定是否存在漏洞并最终决定是否上链。本发明通过从智能合约的开发者中获得开发信息作为开发者特征进行补充,有效的防止了当代码特征难以获得时无法预测的情况。
权利要求

1.一种基于智能合约调用网络的智能合约漏洞检测方法,其特征在于,包括以下步骤:S1、获得待检测漏洞的智能合约及其源代码;

S2、获取特征,包括源代码特征和开发者特征,建立智能合约调用网络;

S3、采用平均聚合的方法,得到每一个智能合约的开发者特征Hk;

S4、利用最大池化聚合方法对所述开发者特征Hk进行聚合,并根据聚合后的向量特征进行智能合约异常检测。

2.根据权利要求1所述的基于智能合约调用网络的智能合约漏洞检测方法,其特征在于,所述步骤S2中所获取的源代码特征包括:代码语句汽油费xg,转账函数的数量xo、调用其他合约函数的次数xf、transfor函数的个数xt,最终这些特征记录为Ho。

3.根据权利要求1所述的基于智能合约调用网络的智能合约漏洞检测方法,其特征在于,所述步骤S2中智能合约开发者特征包括:开发过的智能合约数、开发过的漏洞智能合约数、以太坊上的异常交易数。

4.根据权利要求3所述的基于智能合约调用网络的智能合约漏洞检测方法,其特征在于,根据智能合约的创建者信息构建智能合约开发者网络,即目标智能合约的创建者,以及该创建者创建的其他智能合约以及开发者之间的合作关系;所述智能合约开发者网络存在两类节点,分别为开发者和智能合约,开发者创建对应的智能合约。

5.根据权利要求4所述的基于智能合约调用网络的智能合约漏洞检测方法,其特征在于,所述智能合约开发者网络是从发布者地址转向地址为0的账户,一次这样的智能合约创建可视为一次开发者对于一个智能合约的开发,同时一名开发者会同时部署开发多个合约,而开发者之间也存在相互的合作关系,一个开发者开发的合约调用了其余开发者合约中的函数,这代表其存在合作关系,同时根据地址也可以直接找到开发者协作关系。

6.根据权利要求1所述的基于智能合约调用网络的智能合约漏洞检测方法,其特征在于,所述步骤S2中采用平均聚合的方法,将开发者特征聚合到智能合约上,作为每个智能合约的开发者特征。

7.根据权利要求6所述的基于智能合约调用网络的智能合约漏洞检测方法,其特征在于,所述平均聚合的具体过程为:

对目标节点和邻居节点的向量在每个维度上取均值,将得到的结果做一次非线性变换,取两阶邻居进行两次聚合,最终得到每一个智能合约的开发者特征Hk。

智能合约开发者特征获取方式为:

其中hj代表待检测智能合约开发者vj的特征向量,N(vi)为智能合约节点vi的邻域。

8.根据权利要求7所述的基于智能合约调用网络的智能合约漏洞检测方法,其特征在于,所述目标节点是每一个智能合约节点,邻居节点是以目标节点为中心的两阶邻域节点。

9.根据权利要求1所述的基于智能合约调用网络的智能合约漏洞检测方法,其特征在于,所述步骤S3中最大池化聚合函数的设置为:其中Ho、Hk分别代表源码特征以及开发者特征向量,W代表可训练的权重参数矩阵,ci代表智能合约网络中的第i个智能合约,N(ci)代表智能合约网络ci的邻域;

聚合函数训练完成后,根据聚合函数得到智能合约节点的特征进行节点分类任务,得到智能合约标签。

说明书全文

一种基于智能合约调用网络的智能合约漏洞检测方法

技术领域

[0001] 本发明涉及计算机技术领域,特别是涉及一种基于智能合约调用网络的智能合约漏洞检测方法。

背景技术

[0002] 智能合约是一种旨在以信息化方式传播、验证或执行合同的计算机程序,其允许在没有第三方的情况下进行可信交易并且这些交易可追踪不可逆转。目前以太坊上存在数
量众多的智能合约。然而由于区块链的不可篡改性,一旦智能合约被创建并上传到区块上,
合约的内容即不可修改同时任何人都可以对合约中的函数进行调用。这导致了一旦智能合
约中出现漏洞将产生不可控制的损失。例如一个竞价拍卖的智能合约有可能使得没有成功
拍到商品的出价者在拍卖结束无法收回已经支付的竞价以太币。或者一个庞氏骗局智能合
约将导致大多数的后来投资者无法获得回报。
[0003] 当前的智能合约漏洞检测是十分困难的。智能合约可以通过阅读其Solidity源代码进行漏洞分析,然而其效率较低同时由于公开的源代码占智能合约中的比例不高因此有
时无法检测。也有论文使用智能合约创建后的调用交易网络建模,同时结合智能合约源代
码的字节码转换,以这两个特征训练一个XGBoost分类器来进行庞氏骗局的检测,这也是一
种特殊的智能合约漏洞。然而,这样的检测方法需要获得合约交易信息,这意味着智能合约
需要上链并且通过用户调用合约来产生交易信息,也就是说这样的检测方法发生在上链
后,此时,智能合约已经被部署无法篡改,这样的检测显然无法挽回多少损失。目前的检测
方式存在以下不足:需要使用智能合约源代码,但效率不高;检测通常发生在智能合约部署
后;没有考虑智能合约开发者的信息;没有考虑智能合约间调用智能合约的信息。

发明内容

[0004] 本发明的目的是解决当前智能合约的漏洞检测问题,提出一种在上链前的智能合约漏洞检测技术从而确保智能合约的正确性,避免漏洞智能合约上链造成损失。
[0005] 为实现上述目的,本发明提供了如下方案:
[0006] 一种基于智能合约调用网络的智能合约漏洞检测方法,包括以下步骤:
[0007] S1、获得待检测漏洞的智能合约及其源代码;
[0008] S2、获取特征,包括源代码特征和开发者特征,建立智能合约调用网络;
[0009] S3、采用平均聚合的方法,得到每一个智能合约的开发者特征Hk;
[0010] S4、利用最大池化聚合方法对所述开发者特征Hk进行聚合,并根据聚合后的向量特征进行智能合约异常检测。
[0011] 优选地,所述步骤S2中所获取的源代码特征包括:代码语句汽油费xg,转账函数的数量xo、调用其他合约函数的次数xf、transfor函数的个数xt,最终这些特征记录为Ho。
[0012] 优选地,所述步骤S2中智能合约开发者特征包括:开发过的智能合约数、开发过的漏洞智能合约数、以太坊上的异常交易数。
[0013] 优选地,根据智能合约的创建者信息构建智能合约开发者网络,即目标智能合约的创建者,以及该创建者创建的其他智能合约以及开发者之间的合作关系;所述智能合约
开发者网络存在两类节点,分别为开发者和智能合约,开发者创建对应的智能合约。
[0014] 优选地,所述智能合约开发者网络是从发布者地址转向地址为0的账户,一次这样的智能合约创建可视为一次开发者对于一个智能合约的开发,同时一名开发者会同时部署
开发多个合约,而开发者之间也存在相互的合作关系,一个开发者开发的合约调用了其余
开发者合约中的函数,这代表其存在合作关系,同时根据地址也可以直接找到开发者协作
关系。
[0015] 优选地,所述步骤S2中采用平均聚合的方法,将开发者特征聚合到智能合约上,作为每个智能合约的开发者特征。
[0016] 优选地,所述平均聚合的具体过程为:
[0017] 对目标节点和邻居节点的向量在每个维度上取均值,将得到的结果做一次非线性变换,取两阶邻居进行两次聚合,最终得到每一个智能合约的开发者特征Hk。
[0018] 智能合约开发者特征获取方式为:
[0019]
[0020] 其中hj代表待检测智能合约开发者vj的特征向量,N(vi)为智能合约节点vi的邻域。
[0021] 优选地,所述目标节点是每一个智能合约节点,邻居节点是以目标节点为中心的两阶邻域节点。
[0022] 优选地,所述步骤S3中最大池化聚合函数的设置为:
[0023]
[0024] 其中Ho、Hk分别代表源码特征以及开发者特征向量,W代表可训练的权重参数矩阵,ci代表智能合约网络中的第i个智能合约,N(ci)代表智能合约网络ci的邻域;
[0025] 聚合函数训练完成后,根据聚合函数得到智能合约节点的特征进行节点分类任务,得到智能合约标签。
[0026] 与现有技术相比,本发明具有以下有益效果:
[0027] (1)本发明检测时间发生在上链前:智能合约检测无误后方可上链,保证漏洞智能合约不上链从而避免经济损失;
[0028] (2)本发明简化了智能合约的代码特征:不将智能合约使用字节码转换提取特征,仅通过智能合约的函数调用数、调用类型以及其他简单逻辑来提取代码特征;
[0029] (3)本发明采用了开发者特征进行补充:通过构建智能合约构建网络,从创建智能合约的开发者中获得开发者信息作为开发者特征进行补充,有效防止当代码特征难以获得
时的无法预测;
[0030] (4)本发明构建了智能合约调用网络进行预测:通过智能合约调用网络将智能合约间的相互调用关系建模成网络,并使用聚合后特征向量进行半监督节点分类任务,同时
当新的智能合约加入网络后,无需对整个网络进行重新嵌入,只需要通过已经学习好的聚
合函数来对该节点的邻域特征信息进行聚合就能进行分类。

附图说明

[0031] 为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施
例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图
获得其他的附图。
[0032] 图1为本发明方法流程图。

具体实施方式

[0033] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于
本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他
实施例,都属于本发明保护的范围。
[0034] 为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。
[0035] 如图1所示,本发明提供一种基于智能合约调用网络的智能合约漏洞检测方法,包括以下步骤:
[0036] S1、获得待检测漏洞的智能合约及其源代码;
[0037] 智能合约的源代码对于创建者来说,是先自己编写好然后再决定是否上传到以太坊上的,因此其创建者本来就拥有智能合约源代码。而对于已经发布到以太坊中的智能合
约,在以太坊平台上存在大约2w+的开源智能合约代码量。这并不多,也正是因为如此,才提
出本技术方案应对源码无法获取时也能进行较好的漏洞检测。
[0038] S2、获取特征,包括源代码特征以及开发者特征,并建立智能合约调用网络;
[0039] 源代码特征用来指示智能合约的漏洞风险,比如合约中send函数太多,那么其存在回调风险,即发送过去的汽油费会一次很多(但完成一次转账交易不需要这么多),这样
导致剩余的汽油费可以被转账地址进行一些反调用操作,即可造成风险,与之类似的还有
交易次数、总汽油费等特征。这些特征总体来说都是为了扩充智能合约的特征,并服务于后
续的聚合算法获得特征向量进行智能合约漏洞检测(可以视为节点分类任务)的,特征越多
越充分,自然检测效果越好。这里的源码特征与上面提到的开发者特征共同构成了智能合
约的特征作为下面智能合约调用网络中合约上的特征。
[0040] (1)根据智能合约的源代码获得代码特征:具体包括代码语句汽油费xg(智能合约中每执行一句代码都要消耗一定的汽油费gas以此限制调用次数以及无限循环)、转账函数
的数量xo、调用其他合约函数的次数xf、transfor函数的个数xt(该函数也是转账函数,但比
起send函数以及transfor函数来说存在更大风险,因为其附带的汽油费更多,可能导致剩
余足够的额外汽油费来执行有漏洞的语句)。最终这些特征记录为Ho。
[0041] (2)根据智能合约的创建者信息构建智能合约开发者网络,即目标智能合约的创建者,以及该创建者创建其他智能合约以及开发者之间的合作关系。该网络中存在两类节
点,开发者以及智能合约,开发者之间存在合作关系而开发者创建对应的智能合约。该网络
中开发者存在特征包括开发过的智能合约数、开发过的漏洞智能合约数、以太坊上的异常
交易数等。将开发者的特征聚合到智能合约上作为每个智能合约的开发者特征:具体聚合
过程如下:
[0042] 采用平均聚合:对目标节点和邻居节点的向量在每个维度上取均值。
[0043]
[0044] 其中hj代表待检测智能合约开发者vj的特征向量,N(vi)为智能合约节点vi的邻域。由于智能合约的开发者之间合作的信息对智能合约判断具有一定帮助,取两阶邻居进
行两次聚合,最终得到每一个智能合约的开发者特征Hk。
[0045] (3)根据智能合约的调用信息构建智能合约调用网络,一个智能合约中大多存在对其他智能合约的函数调用,将调用关系建模为边,一个智能合约建模为节点。根据已有的
错误或者存在漏洞的智能合约对相应的节点赋予漏洞智能合约的标签。
[0046] 智能合约调用网络是用来进行聚合特征并实现漏洞检测(节点分类任务的)。该网络中的节点完全由智能合约组成,连边代表智能合约间的调用关系。合约节点上存在的特
征来自于上文的开发者特征以及源代码特征,合约节点的标签为0代表正常合约,1代表存
在漏洞的合约,剩余的合约节点标签未知。漏洞检测算法就是利用这些已有的标签、网络结
构以及节点上的特征来聚合节点特征获得特征向量并后接分类器进行未知标签预测的算
法。最终给未知的合约节点打上预测标签,也就实现了漏洞的检测。
[0047] S3、利用最大池化聚合方法进行聚合函数的训练,进行智能合约异常检测,聚合函数设置如下:
[0048]
[0049] 其中Ho、Hk分别代表本发明中提到的源码特征以及开发者特征向量,W代表可训练的权重参数矩阵,ci代表智能合约网络中的第i个智能合约,N(ci)代表智能合约网络ci的邻
域。聚合函数训练完成后,根据聚合函数得到智能合约节点的特征进行节点分类任务。
[0050] 通过以上聚合函数得到最终节点的嵌入向量,将这样的嵌入向量连接一个全连接层,最小输入嵌入向量以及节点的交叉熵即可完成节点分类任务。也就是说,聚合只是为了
得到节点的嵌入向量的,对于节点分类任务也就是漏洞检测,只需要训练这样的全连接层
接收嵌入向量为输入,预测标签为输出,最终给定待预测的合约节点嵌入向量来获得预测
的输出标签。
[0051] S4、根据预测标签决定智能合约是否存在漏洞,存在漏洞的智能合约不允许部署到区块链上。
[0052] 预测标签为1,则代表该智能合约存在漏洞,预测标签为0则代表该智能合约为正常合约。
[0053] 以上所述的实施例仅是对本发明优选方式进行的描述,并非对本发明的范围进行限定,在不脱离本发明设计精神的前提下,本领域普通技术人员对本发明的技术方案做出
的各种变形和改进,均应落入本发明权利要求书确定的保护范围内。