郭加树 王 琪 李择亚 武梦德 张红霞
(中国石油大学(华东)青岛软件学院 青岛 266580)
(中国石油大学(华东)计算机科学与技术学院 青岛 266580)
智能合约[1]是以以太坊为代表的区块链2.0时代的核心技术,是一种部署在以太坊上,保障互不信任的参与节点之间进行通信交互的计算机协议,通常具有不可篡改和自动执行的特性。随着区块链技术的应用领域不断加深,智能合约的数据量也日益庞大,研究统计[2],以太坊上平均每月发布的智能合约可以达到六位数。数量巨大的智能合约带来了机遇和挑战,一方面智能合约的应用类别已超过数百种,使得许多与智能合约和区块链相结合的业务变得流行起来,比如:区块链与云计算[3]、云存储[4],智能合约与物联网[5]、智慧医疗[6]等相结合;而另一方面,基于智能合约的骗局陷阱正变得日益猖獗[7],包括庞氏骗局[8]、蜜罐陷阱[9]等恶意欺诈型骗局合约。对于用户来说,如何正确地检索和管理庞大的智能合约数据变得越来越困难。智能合约的分类问题已成为一项新兴的研究热点。
近年来,学者大多基于机器学习或者深度学习设计智能合约分类方法。例如,在智能合约的公共数据网站上爬取可用于模型训练的带有标签的数据集,通过引入智能合约语义信息以及相关交易信息作为数据特征,采用深度学习长短期记忆(Long-Short Term Memory, LSTM)模型或机器学习支持向量机(Support Vector Machine, SVM)算法等进行模型训练,合约分类。但目前的研究仍存在以下问题:(1)对合约类别不均衡以及数据重复问题考虑不充分,导致模型出现过拟合问题。(2)高精度的深度学习分类模型的前提是足够的标签训练数据量,但目前可用的标签数据量过少,无法满足较为复杂的深度神经网络的训练要求,导致训练的模型鲁棒性较差。(3)当前所用智能合约数据长度过长,未进行有效处理,在模型训练和分类时无法捕获合约自身的全局特征,导致分类效果不佳。
本文通过分析智能合约的数据结构特征,针对当前方法存在的问题,引入基于孪生神经网络[10]的度量学习方法,提出了小样本场景下基于双层孪生神经网络的区块链智能合约分类方法。首先,对数据类别不均衡的智能合约数据集进行了欠采样处理,每个类别仅保留相同数目且少量的合约数据,旨在以此克服数据类别不均衡问题。其次,针对智能合约数据长度过长的特点,设计了可以分别获取前后段合约特征的底层孪生网络。最后,在底层孪生网络的基础上构建了可以捕获全局数据特征并进行合约对相似度判断的双层孪生神经网络,提出了小样本场景下基于双层孪生神经网络的智能合约分类方法。对于智能合约分类问题,本文提出的分类方法借鉴了小样本学习[11]和度量学习[12]的思想,训练环境对标注数据量的需求更低,仅需要少量的数据量便可以完成模型训练,并达到较高的分类性能。
本文主要具有以下贡献:
(1)构建用于智能合约分类的双层孪生神经网络模型,可以有效处理较长的智能合约数据,并准确判别输入合约对的相似程度。
(2)提出小样本场景下基于双层孪生神经网络的模型训练策略和智能合约分类方法,以克服数据类别不均衡和标签数据量过少问题。
(3)真实数据集的实验结果表明,本文所提方法在小样本场景下的分类效果优于当前最先进的分类方法,同时训练过程对标签数据的需求更低,仅需同类型其他方法约20%数据量。
什么是和谐的教育生态?应该是全面、均衡、开放、可持续,其核心是亲和性、融洽性、创造性、自主性—教师由灌输知识转变为开发和培养学生的创造性思维和能力;学生由被动的客体变成积极的主体;教材内容由封闭、僵死变得开放、生动和更具包容性、新颖性;满堂灌、填鸭式教学转变为灵活多样的启发、诱导、对话、讨论;单纯的认知、接受转变为科学研究、主动创造和大胆的“自我构建”;进而实现求知向个人的兴趣和爱好转化。
得益于区块链技术的快速发展,区块链以及智能合约技术与其他领域的结合应用正变得越来越流行,部署在区块链上的智能合约的数量和规模也正变得越来越庞大。由于智能合约数量的爆发式增长,一方面为了方便用户检索,另一方面为了缓解平台信息泛滥问题,对于智能合约的分类已成为当前研究的热点问题。
Bartoletti等人[13]是智能合约分类领域的首批研究者之一,他们采用人工分析的方法研究了以太坊上811个智能合约和比特币网络23个智能合约的公开源代码,并依照合约的功能特征对它们进行了分类,包括以下5个类别,金融、公证、游戏、钱包和图书馆。黄步添等人[14]提出了一种基于语义嵌入与交易信息的智能合约分类方法,为了更好地捕获智能合约代码中隐藏的语义信息,该方法引入了Word2Vec[15]词向量嵌入模型进行向量转换,之后将包含全局语义信息的词向量表示输入到长短期记忆神经网络LSTM模型中进行反复训练以获取分类模型。此外,为了提高分类模型的准确性,作者还在模型训练过程中加入了智能合约中的账户信息特征。高飞[16]设计并实现了一种基于语义信息和相似性的智能合约分类系统,该系统可以对智能合约数据进行特征提取,并选取其中具有代表性的特征词条用以计算合约相似度,最后根据合约内容输出合约类别,实现合约分类。不同于之前的基于智能合约源代码或是字节码的研究方法,Sun等人[17]认为智能合约程序二进制接口(Application Binary Interface, ABI)含有包括智能合约功能和行为的关键信息,提出了一种基于ABI粒度的智能合约自动分类方法。该方法以ABI的词频和逆向文本频率(Term Frequency-Inverse Document Frequency,TF-IDF)向量作为输入,训练了一个基于传统机器学习方法的智能合约分类模型。
部分学者除关注到智能合约本身的数据信息,引入了注意力机制[18]到模型训练过程中以提高分类准确性。吴雨芯等人[19]提出了一种基于层级注意力和双向长短期记忆神经网络(Bidirectional Long Short Term Memory, BiLSTM)[20]的智能合约分类模型基于源代码和账户的分层注意力神经网络(Hierarchical Attention Neural Network with Source Code and Account, HANN-SCA)。该模型利用Bi-LSTM网络同时捕获智能合约源代码和账户信息特征,在特征提取和模型训练过程中,分别从词层面和句层面引入注意力机制,重点关注对分类模型建立有重要意义的句子和词语。Tian等人[21]综合考虑了智能合约数据的全局信息特征和数据中存在的语义稀疏问题,提出了一种基于Bi-LSTM模型和高斯隐含狄利克雷分布(Latent Dirichlet Allocation, LDA)的智能合约分类方法。该方法充分利用了智能合约中的辅助数据,可以将多种信息作为模型特征输入,包括源代码、账户信息、标签和注释等。并且还引入了注意力机制和语义增强方法来分别关注数据中的重要信息特征和克服合约注释存在的语义稀疏问题,以提高分类模型的可用性。
目前国内外的研究侧重于采用基于文本数据的机器学习和深度学习进行智能合约分类方法设计,包括引入合约数据的上下文信息、语义信息和账户特征等辅助数据,以及加入注意力机制、语义增强方法等来提高合约分类模型的准确性。但当前的大多数研究都仅是将传统的文本分类方法简单应用到智能合约领域,并未考虑到区块链领域和智能合约数据的特殊性,导致训练出的模型存在应用场景限制和分类性能不佳等问题。针对当前存在的问题,本文通过分析智能合约数据以及数据集的特点,提出了小样本场景下基于双层孪生神经网络的智能合约分类方法。
智能合约数据区别于传统的文本数据,是以太坊平台上该合约用户下所有信息的集合,包括合约主体、合约注释、关键字信息、账户信息和历史交易数据等,具有特殊性和复杂性的特征。智能合约的主体指的是采用高级编程语言 Solidity编写的智能合约源代码,源代码中包含了丰富的语义信息以及注释信息。但由于每个合约创建者的代码编程习惯不同以及注释信息的存在,若要深度发掘合约主体中包含的语义信息用以建立特征,对于合约主体的预处理过程极为重要。
由于不是每一个智能合约都包含有足够的账户信息用于特征提取,考虑到模型应用过程中数据特征的可用性,本文仅采用智能合约源代码进行数据分析和模型训练。本文通过以太坊以及区块链去中心化应用平台获取了带有类别标签的智能合约数据3 458份。进行数据整合时发现数据集存在严重的合约复制[22]现象,如果不进行处理,大量的重复数据会影响最终的分类结果。在进行去重以及删除自毁数据后得到了2 957份具有唯一精准字节码匹配的合约数据。仅包含有源代码数据和注释信息的原始合约主体无法直接用于模型训练,需要进行反编译处理为操作码格式。本文通过以太坊虚拟机数据包完成这一转换,图1展示了反编译后的操作码文件,其中包含两种不同类型的数据信息,包括操作码和指令地址,模型训练仅需保留操作码。
图1 操作码文件
通过检查经过预处理后的原始数据集,本文发现数据集存在严重的类别不均衡以及数据量过少问题,某些类别包含近千条数据,比如游戏类别的智能合约具有864条数据;而有些类仅包含几条数据,比如保险和存储类别的智能合约都仅有个位数的数据。每个类别包含的数据量比例,如图2所示。
图2 智能合约数据类别比例
本文从以太坊以及去中心化应用平台所获取的原始数据集共包含21个类别,涵盖了当前智能合约应用的大多数领域,具体的类别名称和所含数据量,如表1所示。其中DEFI为去中心化金融类别,NFT为非同质化通证类别,Farm为挖矿类别,Tools为工具类别。对于深度学习模型的训练来说,过少的标签数据量无法满足最优化权值参数的训练过程,容易出现模型过拟合现象。同时,数据类别不均衡问题也极易导致分类结果出现偏差,严重影响模型的整体分类性能。
表1 智能合约类别名称及数据量
本文对反编译后的智能合约数据长度(智能合约包含的操作码数量)进行检查时发现,大部分的智能合约是较长的,而过长的数据对传统的算法模型来说通常是难以处理的,因为模型无法精准地学习到序列数据中的长期依赖关系,甚至会在模型训练过程中出现梯度爆炸问题,导致最终的分类效果不理想。
针对以上数据分析中存在的问题,本文提出并设计了小样本场景下基于双层孪生神经网络的区块链智能合约分类方法。下面将详细介绍本文针对数据类别不均衡问题的数据欠采样处理,针对数据长度过长以及数据量过少问题设计的基于双层孪生神经网络的模型训练策略和智能合约分类方法的实现细节。
为了克服数据类别不均衡问题,本文进行了数据集欠采样处理。首先重新进行了数据整合,去除了因为标签网站长时间不更新而不具有参考价值的合约数据以及合并了一些数据量过少的类别,最后共有15个类别的智能合约,每个类别仅保留50条数据。具体的数据集类别名称,如表2所示。
表2 数据集类别
为了能够有效处理长度过长的智能合约数据,本文构建了用于智能合约分类的双层孪生神经网络模型。孪生神经网络是当前深度学习领域常用的框架结构,多用于处理两个及两个以上类似输入的相似度判别问题。考虑到智能合约的数据特点以及可用数据的稀缺性,本文参考了小样本学习和度量学习的思想,引入了孪生网络来处理合约分类问题。通过双层的孪生网络充分利用较长智能合约数据的全局上下文信息,以实现智能合约精准匹配分类。模型的总体设计,如图3所示。
图3 双层孪生神经网络模型
总体来看,模型可以分为5层、两部分。自底向上来看,分别是最底层的合约输入层、向量表示层、向量拼接层、距离计算层以及最上层的概率输出层。两部分包括处理合约的底层孪生神经网络以及类别判断的上层孪生神经网络,其中底层孪生神经网络部分包括底部的合约输入层和向量表示层,其余3层为上层孪生神经网络部分。
最底层是合约输入层,输入数据来自一对智能合约数据,包括ContractA和ContractB,根据数据分析发现大部分的智能合约是较长的,普遍包含大量的操作码,为了更好地捕获输入智能合约的全局序列特征,本文参考了文献[23]中的模型构造方法在输入层将输入的智能合约数据进行了对半切割处理,对半切割后的4个前后智能合约段,分别为ContractA1, ContractA2, ContractB1, ContractB2。
之后是向量表示层,为了精准获取合约操作码的语义信息,本文选用了智能合约领域语料预训练后的Bert模型用于词向量嵌入。该模型的限定最长输入长度是512个字符,而本文所使用数据集中大部分数据长度是大于512个字符的,在经过合约输入层对半切割处理后的智能合约段符合Bert模型的输入长度限制。输入到Bert模型中进行词向量嵌入表示,在该层可以获取4个合约段ContractA1,ContractA2, ContractB1, ContractB2的向量表示u1,v1,u2,v2。
然后是向量拼接层,在该层将之前获取的来自同一合约数据的前后段向量表示进行拼接处理,分别得到一对合约数据的全局向量表示E1和E2,可以表示为
拼接层之上是距离计算层,本文使用L1距离即曼哈顿距离来计算一对合约数据的向量距离,希望通过模型训练使得属于同一类别合约的向量距离尽可能小,分属不同类别的向量距离尽可能大,其中L1距离及该层的向量距离公式可以表示为
最顶层是概率输出层,在该层通过多个线性层以及Sigmoid激活函数输出合约数据对属于同一类别的概率,输出范围为[0,1],其中0表示不属于同一类别,1表示属于同一类别,可以表示为
针对智能合约数据量过少的问题,本文提出小样本场景下基于孪生神经网络的数据对形式的模型训练策略,可以对原始数据集实现平方级的数据扩充,并基于此设计了智能合约分类方法。
首先,本文选取数据集中每个类别80%的数据用于组成数据对进行模型训练,其中同一类别的合约数据所组成的数据对视为正类数据对,标签置为1;而分属不同类别的合约数据所组成的数据对视为负类数据对,标签置为0,同时将训练数据的正负数据对数量之比控制为1:1。通过匹配组合正负数据对形式的训练策略可以对原有数据集进行有效扩充增强。
然后,在基于双层孪生神经网络的模型训练过程中,Bert词向量嵌入模型的参数也不固定,同样参与模型的反向传播,进行参数更新。目的是希望通过数据对形式的模型训练策略,最终属于同一类别的智能合约输出的向量表示在空间上是相邻的,属于不同类别的合约向量表示是彼此远离的。
最后,剩余的20%数据用于合约分类,匹配测试。在进行合约分类测试时,待测试的合约数据通过训练好的智能合约分类模型与每个类别带有标签的支撑数据进行类别相似度计算,通过相似概率叠加的方式得到相似度得分,其中相似度得分最高的类别即作为测试合约的类别。训练及分类过程,如图4所示。
图4 模型训练及分类流程图
在使用基于度量学习的方法进行分类时需遵循一个假设:即相同类别的数据应保持相同的数据分布情况。词云图可以直观地通过图片的方式展示文本词汇的频率情况,通过比较数据集中相同类别智能合约的操作码词云图,如图5所示,本文发现相同类别的合约具有相似的操作码类型和频率。两幅图中的操作码词云图中均包含大量高频的表示跳转类型的操作码指令,如SWAP和JUMP等。因此可以认为相同类别的智能合约保持相同的数据分布情况,数据集遵循假设,符合度量学习的使用条件。
图5 操作码词云图
本节所有实验均处于相同的硬件环境下,模型的训练和测试工作是在开源的深度学习框架Keras下进行的。实验的推荐参数设置如下:学习率设置为0.001,批量大小设置为16,训练轮次设置为80,Bert模型的输入最大句长设置为510(其中还需要包括[CLS]和[SEP]字符)。对于实验的评价标准,本文采用了3种较为常见的评价指标来定量评估每类实验中的分类性能,包括F1值、精确率(Precision)和召回率(Recall)。
在双层孪生神经网络模型的向量表示层,本文引入了Bert模型[24]进行词向量嵌入转换。本文选取的是轻量级英文语料预训练的Bert模型。为了得到合适的词向量嵌入表示,本文参考了文献[25]关于Bert模型微调预训练的建议,通过获取海量的智能合约数据,重新在基于通用英文语料训练的Bert模型进行了基于智能合约领域语料的微调预训练。为了验证对Bert模型进行领域语料微调预训练是否有效,即验证加入先验知识是否会使得Bert模型更加适应于智能合约领域的训练环境,在本节设计了Bert模型是否进行领域语料微调预训练的实验,实验结果如图6所示,其中Finetune-Bert为经过智能合约领域语料微调预训练后的Bert模型,Bert为通用语料训练的Bert模型。
图6 模型预训练损失值对比
通过对通用语料训练的Bert模型以及加入智能合约领域语料微调预训练后的Finetune-Bert模型进行损失值下降速率对比,发现经过微调预训练后的Finetune-Bert模型在训练过程中损失值下降速率要更快一些,因此可以认为基于智能合约操作码微调预训练后输出的向量表示在词向量空间上要更加准确、贴切,更加适用于智能合约领域的分类任务,本文在后续实验部分均采用了基于智能合约操作码微调预训练后的Finetune-Bert模型。
为了验证本文所提出的双层孪生神经网络模型是否在智能合约分类时发挥作用,在本节设计了单层/双层孪生神经网络模型的对比实验。其中Single-Siamese模型指的是未加入处理合约的底层孪生神经网络部分,对大于输入限制的合约数据进行舍弃处理的单层孪生神经网络智能合约分类模型,而Double-Siamese即本文提出的完整的双层孪生神经网络智能合约分类模型。实验结果如表3和图7所示。
表3 单双层孪生网络模型实验结果对比
图7 单双层孪生网络模型损失值变化
通过对比两类模型训练时的收敛速度以及训练完成后用于合约分类时的实验性能,验证了本文所提出的完整的双层孪生神经网络模型是有效的,在进行合约分类时性能有所提升。双层孪生神经网络模型在进行数据对训练时达到高精度的速度要明显快于单层孪生神经网络模型,而且合约分类时的准确率也要明显高于单层孪生神经网络模型,证明完整的双层孪生神经网络模型获取到的合约特征信息要更加全面,可以有效捕获智能合约数据的全局特征,提升分类的准确性。
为了探究如何才能更好地捕获智能合约数据的全局信息特征,本文设置了向量拼接层的向量拼接方式的性能比较实验。本实验比较的向量拼接方式包括 (u,v) , (|u-v|) , (u×v) , (u,v,u×v) ,(|u-v|,u×v) 以及 (u,v,|u-v|) ,其中u,v指的是来自同一合约数据的前后段向量表示。实验结果如表4所示。
表4 向量拼接方式实验结果对比
通过比较以上向量拼接方式的分类性能,本文发现 (u,v,|u-v|)的向量拼接方式具有最好的实验效果,相比于其他的向量拼接方式,该拼接方式的设计能够更为有效地捕获并输出前后段合约的关键信息,在之后用于合约分类的效果也要更好。
本节主要实验数据量参数对于分类模型的性能影响。实验中均采用了相同数量数据对训练好的模型进行合约分类实验,但改变了每个类别用于合约分类测试的数据量,分别设置为10(8/2), 20(16/4),30(24/6), 40(32/8), 50(40/10)条数据,同时保持相同的划分比例8:2,即当类别数据量设置为50时,每个类别会划分出10条测试数据与40条带有标签的支撑数据进行合约分类测试。实验结果,如表5所示。
表5 类别数据量实验结果
本文发现随着类别数据量的增加,合约分类的准确率也在提升,数据量参数设置为50时具有最佳的分类性能,分类准确率达到了94.7%,召回率达到了94.6%,F1值也达到了94.6%。本文通过分析认为,在数据量参数设置为50时由于需要匹配计算的每个类别的支撑数据在增加,可以有效避免与错误类别匹配成功的偶然性,直接提升了总体的分类性能。但同时因为数据量参数设置的提升,需要遍历匹配的数据量在增加,合约分类所需要花费的时间也在增长。可以根据合约分类对于准确性与消耗时间需求的衡量,灵活选择用于分类的类别数据量。为了达到最优的分类性能,本文实验部分选择的类别数据量为50。
最后为了验证本文所提方法的实验性能,与其他论文所提方法以及基线方法进行了对比实验。其中,基于智能合约分类的双向长短时记忆网络 (Bi-LSTM for Smart Contract Classification, SCCBiLSTM)为文献[21]提出的方法,该方法采用了语义增强以及引入了注意力机制的Bi-LSTM模型来实现智能合约分类;支持向量机+交易信息以及神经网络+交易信息为文献[14]提出的方法,这两种方法采用了传统的机器学习算法并引入了智能合约中的交易信息特征来构建智能合约分类模型;HANN-SCA为文献[19]提出的一种基于层级注意力机制与Bi-LSTM神经网络的智能合约自动分类模型。Double-Siamese为本文提出的基于双层孪生神经网络的智能合约分类方法。其中对比方法遵循原论文的实验环境设置,所用数据是在以太坊或者区块链去中心化应用平台获取的原始的类别不均衡的智能合约数据集,本文所提方法是在小样本数据环境下进行的,对数据进行了过采样处理,每个类别都仅保留50条合约数据。与其他方法的分类性能比较如表6所示。
表6 合约分类对比实验结果
实验结果表明,相比于其他方法,本文所提方法具有最优的分类性能。但值得注意的是,为了达到最佳的分类效果,本文所提方法对内存的要求较高,因为该方法需要存储所有的带有标签的支撑数据,同时在合约分类预测阶段也需要花费较多时间,因为该方法需要遍历所有的支撑数据,逐一匹配计算相似性。但本文所提方法可以根据分类性能高低与耗费时间长短的不同任务需要,通过灵活调整用于分类匹配的数据量参数来实现不同场景下的不同需求。
本文针对当前智能合约分类领域存在的问题,提出基于双层孪生神经网络的智能合约分类模型,并通过分析智能合约数据集的特点,设计了小样本场景下的智能合约分类方法。首先,进行数据欠采样处理,对每个类别的智能合约仅保留相同数目少量的合约数据。其次,针对智能合约数据长度过长的特点,设计了可以分别获取前后段合约特征的底层孪生网络部分。然后,为了捕获全局数据特征,构建了可以进行向量拼接、合约对相似度判断的上层孪生神经网络部分。最后,提出了小样本场景下基于双层孪生神经网络的模型训练策略和智能合约分类方法,并通过实验验证了本文所提方法的可行性和有效性。