区块链时间[1, 2]实质上是一个分散式分享来去账本, 由区块链蚁集中的整个节点在共鸣公约[3]约束下共同诊治. 区块链时间具有去中心化、防改削、不可逆及可纪念等特色, 转换了传统行业的固有形态新金瓶梅3d, 在医疗[4−6]、版权保护[7−9]、供应链管制[10−12]、动力互联网[13−15]、物联网办事[16−18]等诸多鸿沟取得了打破性进展[19].
智能合约[20, 21]是区块链时间最获胜的应用之一, 还是成为学术界和工业界研究的新温雅点. 早在1994年, 智能合约的意见就被Szabo提倡[22], 但直到区块链时间的出现, 才为其提供了可靠的实行环境和应用基础. 智能合约实质上是一段运行在区块链上的筹谋机步履, 由图灵完备(Turing complete)言语编写, 可以在区块链蚁集中自动实行. 刻下, 已迥殊以万计的智能合约部署在种种区块链平台上, 举例以太坊(Ethereum)[23]、EOS[24]、维特链(VNT Chain)[25]等, 而况其数目仍在速即增长, 在往常几个月中, 仅在以太坊平台上就部署了突出10万个新的智能合约. 然而, 跟着智能合约数目的增多, 智能合约安全问题也相继而至. 据Bcsec和Slowmist统计[26, 27], 智能合约安全罅隙导致的经济蚀本还是突出数十亿好意思元. 由于智能合约是一段步履代码, 其在联想和征战过程中不免会出当代码安全问题, 而况部署在公链上的智能合约闲居露馅在洞开蚁集环境中, 这进一步使得智能合约容易成为受攻击的宗旨. 由于区块链的不可改削与不可逆等本性, 当黑客攻击某个智能合约时, 咱们只可眼睁睁地看着资金流入攻击者账户而无法中断或不容合约实行. 目下, 由智能合约罅隙激发的大范围安全案例不在少数, 而况每隔一段时候就会发生关连的安全罅隙事件. 举例: 2016年6月, 黑客利用DAO(decentralized autonomous organization)[28]合约的可重入罅隙, 窃取了价值约6 000万好意思元的以太币(即以太坊数字货币); 2017年7月, 由于Parity多签名钱包合约的Delegatecall罅隙(parity multi-sig wallet delegatecall)[29], 价值近3亿好意思元的以太币被冻结; 2018年4月, 坏心攻击者利用好意思链BEC合约[30]的整数溢露马脚无尽复制代币, 导致BEC代币的价值挥发归零; 2018年11月, 攻击者向EOS.WIN发起引导就地数攻击[31], 赚钱突出20 000枚EOS(即EOS数字货币); 2019年5月, Binance来去所遭到黑客坏心攻击, 导致7 000多枚比特币被盗; 2020年以来, 智能合约游戏FarmEOS, Playgames, LuckBet, EOSPlaystation等[32−35]齐碰到了不同进度的黑客攻击, 累计变成近百万好意思元的蚀本. 智能合约安全罅隙不仅变成了弘远的经济蚀本, 也破裂了东谈主们对区块链与智能合约的信任基础, 智能合约的罅隙检测与安全注重还是成为亟待措置的关键问题和弘远挑战.
智能合约之是以容易受到安全罅隙影响的原因, 可以归纳为以下4个方面.
起首, 刻下的智能合约编程言语和器具(如Solidity)仍然是新颖且不祥的, 而使用新的编程言语和运行环境编写的智能合约相对更难以测试, 尤其因为智能合约运行时被允许与外部合约函数或接口交互, 这可能导致重迭的外部调用, 从而激发安全罅隙;
其次, 由于智能合约征战东谈主员一时候无法统统辖会新颖的智能合约编程言语和器具的基本实行逻辑, 因此无法预想合约在将来遇到的整个可能现象和环境, 导致了征战东谈主员容易编写出存在罅隙或易受攻击的合约;
第三, 区别于传统步履, 普通的应用步履发布后遇到安全问题时, 征战东谈主员可以检测步履乖谬并进行修改. 然而, 由于智能合约二进制码过火现象是存储在不可改削且不可变的区块链蚁集上, 智能合约一朝部署即是不可逆的, 也无法进行更新或修改, 这就导致区块链蚁集上可能存在一些有潜在安全问题而无法修补的合约;
第四, 由于区块链平台上的数字货币(如比特币[36]和以太币)被智能合约督察和操控, 使得智能合约成为极具诱惑力的被攻击宗旨, 诱导了许多坏心攻击者, 他们尝试种种技能挖掘并利用智能合约中可能存在的罅隙, 以窃取资金或防碍区块链蚁集.
要而论之, 相较于其他的软件和应用步履, 露馅于洞开环境下的智能合约更容易受到安全罅隙和坏心攻击的影响, 也进一步凸显了智能合约罅隙检测和安全注重的曲折性.
本文泛泛网罗了智能合约安全鸿沟的关连研究, 文件及第程序为该文件与智能合约罅隙检测顺利关连, 并在智能合约安全罅隙挖掘与检测鸿沟提倡了新方法、新时间. 本文收录时候为2015年以来安妥要求的文件为程序, 网罗范围涵盖Web of Science, IEEE Xplore, SpringerLink以及中国知网CNKI等筹谋机鸿沟常用的国表里数据库. 截止到2020年6月, 共有91篇关连文件. 可以看出: 近3年来, 智能合约安全罅隙分析与检测鸿沟的研究论文数目速即增长(如图 1所示).

本文第1节从Solidity代码层、EVM实行层、区块链系统层这3个层面先容常见的智能合约罅隙类型和典型案例. 第2节阐明智能合约罅隙检测的常用方法及相应的罅隙检测器具. 第3节比较分析种种罅隙检测器具的特色、自动化进度、开源进度及检测性能, 并分析了它们的局限性和改造念念路. 第4节归来全文, 计议现存智能合约罅隙检测方法的不及之处, 并计议深度学习时间预计改日智能合约罅隙检测的研究宗旨.
1 智能合约安全罅隙类型和典型案例跟着区块链时间的发展、智能合约数目的增多以及去中心化应用(decentralized application, DAPP)的普及[37−40], 智能合约的安全罅隙被越来越多的攻击者发现并利用[41−44]. 相较于传统的应用步履, 智能合约引起的安全问题愈加辣手、罅隙分析愈加复杂. 本节归纳归来了刻下主要的智能合约安全罅隙类型和典型案例.
1.1 智能合约安全罅隙类型以太坊是刻下影响力最大的开源区块链平台, 亦然目下为止智能合约数目最多、罅隙类型最多、罅隙变成的蚀本最大的区块链平台. 从2020年前2个季度的DAPP市集占比来看, 以太坊DAPP占总创造价值的82%, 其中80%属于博彩、游戏等高风险类别; 其次, 据Dune Analytics数据统计[45], 仅2020年3月份, 部署在以太坊平台上的智能合约就突出200万份. 此外, 智能合约罅隙的典型案例大多由以太坊智能合约激发, 而况多数区块链平台上的智能合约是基于太坊智能合约进行联想与编写, 征战东谈主员和研究东谈主员闲居以以太坊智能合约为研究对象进行实验与分析. 因此, 本文以以太坊为例, 详实阐明了智能合约安全罅隙并进行了分类.
左证以太坊智能合约罅隙发生的端倪不同, 可以将合约罅隙分为3个层面, 分别是Solidity代码层、EVM实行层、区块链系统层. 本节中先容了15种以太坊智能合约罅隙, 具体的罅隙分类与解释说卓识表 1.

(1) 可重入罅隙
步履实行具有原子性和煦序性. 一般来说, 当调用非递归函数时, 一次步履呐喊实行扫尾前将不会有新的实行呐喊进入. 然而智能合约的实行并非如斯, 由于Solidity智能合约独到的回调(fallback)机制[46], 很可能使坏心攻击者在步履呐喊实行扫尾前再次进入被调用函数. 近似于大多数步履言语, 以太坊智能合约处理业务逻辑时会进行跨合约的函数调用, 不同的是, 智能合约闲居波及转账等敏锐操作. 此外, 由于智能合约的固有本性, 转账操作必定会触发采纳者合约中的回调函数. 当智能合约进行跨合约的转账操作时, 如果这些外部调用被坏心攻击者利用, 很可能会导致合约进一时局实行危机操作. 举例, 攻击者在其回调函数中联想坏心的攻击代码, 递归调用受害者合约的转账函数以盗取以太币. 以太坊可重入罅隙就是因为这种机制而产生的, 变成了有史以来最着名的智能合约安全罅隙事件(即the DAO攻击[28]), 不仅蚀本了价值近6 000万好意思元的以太币, 而且顺利导致了以太坊硬分叉(hard-fork)[47].
(2) 整数溢露马脚
整数溢露马脚具有广大性, 许多步履中齐可能存在整数溢出问题. 整数溢出一般分为上溢和下溢, 智能合约中的整数溢出类型包括3种: 乘法溢出、加法溢出和减法溢出. 以太坊智能合约中, 一般指定整数为固定大小且无记号整数类型, 即默示整型变量只然则一定范围内的数值, 突出这个范围则会产生整数溢出乖谬. Solidity言语的整型变量步长一般以8递加, 救援从uint8到uint256. 以uint8类型为例, 其变量长度为8位, 救援存储的数字范围是[0, 255]. 若试图将大小突出这个范围的数据存储到uint8类型变量中, 以太坊诬捏机(Ethereum virtual machine, EVM)将会自动截断高位, 从而导致运算放胆非常, 产生整数溢出乖谬. 不同于其他步履, 智能合约整数溢露马脚变成的蚀本是弘远且不可弥补的, 举例好意思链BEC合约的整数溢露马脚[30]导致其代币价值俄顷归零. 目下, 为了驻防智能合约的整数溢出, 一方面可以在算数逻辑前后进行考证; 另一方面, 征战东谈主员能使用SafeMath安全库[48]处理算术逻辑, 驻防整数溢出.
(3) 权限箝制罅隙
智能合约权限箝制罅隙[41, 49]产生的最根柢原因是未能明确或未仔细查验合约中函数的拜访权限, 从而允许坏心攻击者能进入本不该被其拜访的函数或变量. 权限箝制罅隙主要体目下两个层面.
1) 合约代码层面. Solidity智能合约函数和变量的拜访限定有4种, 即public, private, external, internal.如果函数未使用这些标志符, 那么默许情况下, 智能合约函数的拜访权限为public, 亦即该函数允许被本合约或其他合约的任何函数调用, 这种情况可能导致该函数被攻击者坏心调用;
2) 合约逻辑层面. 闲居使用函数修饰器对函数或变量进行约束. 举例, 某些关键函数需要使用修饰器onlyOwner或onlyAdmin来约束. 若未给这些函数添加修饰器, 任何东谈主齐有权力拜访并主管这些关键函数, 则很有可能导致关键函数被坏心攻击者主管, 从而进一时局破裂智能合约逻辑.
(4) 非常处理罅隙
以太坊智能合约中, 有3种情况会抛出非常: ①实行过程中的Gas(即部署或实行智能合约的用度)铺张殆尽; ②调用栈溢出; ③实行语句中有throw呐喊. 一般来说, 如果被调用的合约抛出非常时, 合约将和会过回滚的形貌处理非常行径, 即隔断刻下合约实行并还原到上一步现象, 同期复返一个乖谬标志符(即false). 然而, 当一个合约以不同的形貌调用另一个合约时, 以太坊智能合约却莫得统一的方法处理非常, 发起调用的合约可能无法获取被调用合约中的非常信息. 举例, 智能合约中的子调用发生非常时, 闲居会自动朝上司传播, 但是一些底层调用函数(如send, call, delegatecall)发生非常时只复返False, 而不抛出非常[41, 49]. 因此, 只是左证有无非常抛出就判断合约实行是否获胜是不安全的, 在调用底层函数时必须严格查验复返值, 而况对非常领受一致性的处理形貌.
(5) 断绝办事罅隙
断绝办事(denial of service, DOS)[41, 43, 44]是以太坊智能合约常见的罅隙, 攻击者通过破裂合约华夏有的逻辑, 铺张以太坊蚁集中的资源(如以太币和Gas), 从而使合约在一段时候内无法正常实行或提供正燕办事. 针对智能合约的DoS攻击形貌闲居有3种.
1) 通过(unexpected)Revert发动DoS攻击. 当智能合约现象的转换由外部函数的实行放胆断定, 而况这个实行一直失败时, 若未对函数实行失败的情况进行处理, 将会使智能合约处于容易遭到DoS攻击的现象;
2) 通过以太坊区块的Gas限定发动DoS攻击. 以太坊蚁集中每个区块齐设定了Gas上限, 如果来去破耗的Gas突出上限, 会导致来去失败. 因此, 即使莫得受到坏心攻击, 智能合约的运行也可能因为突出Gas限定而出现问题; 更严重的情况是, 若攻击者坏心主管Gas铺张而导致其达到区块上限, 则会使合约的来去过程以失败告终;
3) 合约Owner账户发动DoS攻击. 许多智能合约齐有Owner账户, 其领有开启或住手合约来去的权限, 若莫得保护好Owner账户, 导致其被攻击者操控, 很可能会使合约来去被永恒冻结.
(6) 类型唠叨罅隙
以太坊智能合约使用高等言语Solidity编写, 它是强类型编程言语, 会自动查验步履中是否有类型匹配乖谬[48], 举例在变量赋值时, 若把字符串赋值给整型变量, 则会产生类型匹配乖谬. 然而在智能合约中, 有些情况即使类型不匹配, 合约在实行过程中也不会激发非常. 因此, 征战东谈主员只怕候会默许合约可以自行查验步履中的类型匹配问题时, 不息会刻薄东谈主工查验, 从而导致预想除外的罅隙发生.
(7) 未知函数调用罅隙
近似于大多数编程言语, 智能合约通过函数名和函数参数类型确保函数的独一性. 当一个智能合约调用另一个合约中的函数时, 若函数和参数类型无法匹配到被调用合约中的函数, 此时将会默许调用该合约中的Fallback函数. 要是该Fallback函数中守秘了攻击者联想的坏心操作, 那么很可能会出现安全问题[44, 49].
(8) 以太冻结罅隙
转账操作是智能合约最曲折且最独到的功能之一. 智能合约可以采纳以太币转账, 也可以转账给其他合约地址. 值得一提的是: 一些合约自己乌有现转账函数, 而是通过delegatecall调用外部合约中的转账函数来达成转账功能. 然而, 要是这些提供转账函数的外部合约带有Self-destruct或Suicide等操作时, 那么通过delegatecall调用转账函数的合约很可能会发生因为被调用合约的自毁操作而导致自己以太币被冻结的情况[43, 44, 49].
1.1.2 EVM实行层(1) 短地址罅隙
智能合约短地址罅隙[41, 44, 49]其实是利用了以太坊诬捏机自动补0的本性. 在智能合约ABI表率中, 输入的合约地址长度必须为20字节, 当地址长度小于20字节时, 以太坊诬捏机和会过在末尾自动补0来得志地址长度的要求. 然而, 恰是因为这个本性使得坏心攻击者趁虚而入. 举例, 攻击者挑升把账户地址少输一个字节, 以太坊诬捏机领路时就会从下一个参数(即以太币数目)取吃力的编码位数对地址进行补全, 然后在整串二进制码的末位补0至正常的编码位数, 这就意味着以太币数目这个参数被左移了一个字节, 此时要是实行的是转账操作, 则可能使合约转出超出推行应该转发的以太币数目给攻击者.
(2) 以太丢失罅隙
智能合约转账以太币时必须指定采纳方的合约地址, 而况地址必须是表率的. 要是采纳方的合约地址是统统独处的旷地址, 即它们与任何其他用户或合约齐没联系联, 如果将以太币转账给这么的合约地址, 将会导致以太币始终丢失[49].
(3) 调用栈溢露马脚
智能合约每调用一次外部合约或者自己调用, 齐会增多一次合约的调用栈深度[41, 49]. 在以太坊诬捏机中, 调用栈的限定为1 024, 若攻击者联想一系列的嵌套调用, 最终可能会获胜激发调用栈的溢出, 从而进一步使智能合约处于不安全的现象.
(4) Tx.Origin罅隙
以太坊智能合约有一个全局变量tx.origin[44], 它大约回溯整个调用栈复返率先发起调用的合约地址. 要是合约使用这个变量作念用户考证或授权操作时, 攻击者便可以利用tx.origin的本性创建相应的攻击合约盗取以太币. 举例, 攻击者在我方的Fallback函数中调用受害者合约的取钱函数, 通过诱导受害者合约转账以太币给攻击者合约, 而由于“tx.origin==owner”的启事, 会导致无法检测出非常, 从而使受害者合约中的以太币整个转到攻击者合约账户中.
1.1.3 区块链系统层(1) 时候戳依赖罅隙
智能合约闲居使用矿工(即区块链蚁集中的节点或用户)阐发的区块时候戳(block.timestamp)来达成时候约束[41−44, 49], 合约可以检索区块的时候戳且区块中的整个来去分享兼并个时候戳, 这保证了合约实行后现象的一致性. 然而, 创建区块的矿工可以在一定进度上刻意聘请成心于他们的时候戳来篡夺利益.
(2) 区块参数依赖罅隙
以太坊智能合约中无法顺利创建就地数, 合约征战者不息会编写就地函数来产生就地数, 一般通过区块号(block.number)、区块时候戳(block.timestamp)或者区块哈希(block.blockhash)等关连的区块参数或信息四肢产生就地数的基数种子[44]. 然而, 与时候戳依赖罅隙近似, 由于就地数生成依赖的这些区块参数可以被矿工提前获取, 这将导致生成的就地数是可预测的, 从而可能会被坏心攻击者利用并产生对他们成心的就地数.
(3) 来去轨则依赖罅隙
区块链蚁集中的来去实行轨则是由区块链蚁集中矿工决定的, 有些合约对来去实行轨则是有严格要求的, 乖谬的轨则可能对合约变成负面影响[43]. 如图 2所示的来去轨则依赖案例, 用户1和用户2同期在t时刻分别提交了来去T1和T2, 然而T1和T2的实行轨则是被区块中的矿工决定, 如果T1先实行, 则合约现象将由S变为S1, 反之则变为S2. 因此, 最终的合约现象依赖于矿工采取的来去实行轨则. 如果坏心的矿工监听到区块中对应的合约来去, 便可以通过提交坏心的来去转换刻下合约现象, 从而有契机提前部署攻击.

智能合约督察和操控着价值数千亿好意思元的数字货币. 面对如斯弘远的钞票的诱惑, 坏心攻击者尝试利用智能合约罅隙来窃取利益. 本节详实阐明了现实寰球中还是发生的智能合约安全罅隙事件的典型案例.
1.2.1 The DAO案例[28]DAO是一个去中心化的自治组织, 达成了用于众筹的The DAO合约, 该合约在遭到攻击前还是筹集了价值约2.45亿好意思元的以太币. 攻击者利用该合约的可重入罅隙窃取了价值约6 000万好意思元以太币, 顺利引起了以太坊的硬分叉. 为了更好地知道The DAO攻击, 咱们在图 3中呈现了简化的The DAO攻击案例.

具体而言, 合约Bank存在两个函数: deposit函数允许用户存入以太币, withdraw函数允许用户提取存入合约的以太币. 攻击者的具体攻击重要如下.
1) 攻击者Attacker起首调用合约Bank中的deposit函数存入10个以太币;
2) 然后利用withdraw函数取出以太币;
3) 当合约Bank调用withdraw函数, 并通过内置函数call.value将以太币转出给攻击者Attacker时, 合约Attacker中的Fallback函数(即“function () payable”)将会自动实行;
4) 攻击者Attacker在其Fallback函数中又递归调用了10次withdraw函数来取出以太币, 合约Bank将相应地实行10次转币操作, 共转出100个以太币给攻击者.
最终, 攻击者通过其Fallback函数窃取到了90个不属于他的以太币.
1.2.2 KoET案例[50]KoET(king of the ether throne)[50]是一款以太坊智能合约游戏, 参与的玩家通过竞争最终的以太坊“王座”赢取合约奖池中的整个奖金. 每当玩家向合约发送“竞争费”(即以太币)竞争“王座”时, 就会触发KoET合约中的Fallback函数, 该Fallback函数起首会查验玩家发送的“竞争费”是否弥散: 如果不够, 合约将抛出非常并回滚本次来去; 如果弥散, 玩家将成为新的“王座”, 且KoET合会聚将玩家“竞争费”的一部分四肢薪金发送给前任“王座”, 一部分则留在合约中四肢最终的奖金. 24小时后, 终末一位竞争获胜的玩家将得到合约中整个的奖金.
这个游戏合约看起来很合理, 推行并非如斯, 该合约容易受到断绝办事(DoS)攻击. 如图 4所示, 攻击者通过以下攻击重要, 将会一直抢占“王座”直到夺得合约中整个奖金: 1) 攻击者Malicious实行setKing函数, 向KoET合约中转入弥散的“竞争费”成为新的“王座”; 2) 当有新的玩家参加竞选并支付弥散的“竞争费”后, KoET合约将会向刻下“王座”(即Malicious)发送薪金, 这会触发Malicious中的Fallback函数. 然而, 攻击者Malicious的Fallback函数中仅有抛出非常的操作, 将会断绝该次来去并导致来去回滚. 此时, KoET合约将会再行尝试发送薪金给Malicious, 会遇到相通的情况. 最终, 来去屡次的发送薪金会让Gas铺张殆尽, 将莫得东谈主能再次竞选成为“王座”, 攻击者Malicious将一直抢占“王座”, 赢取KoET合约中整个的奖金.

Parity多签名钱包是智能合约达成用来管制用户数字资产的环球库合约, 其中包括一些常用函数和逻辑代码, 用户可以在他们的钱包合约中调用该环球库合约中的函数来实行相应的业务逻辑. 然而, 环球库合约中的函数麇集管制很容易成为攻击的宗旨. 由于以太坊中的大部分用户钱包齐依赖于此环球库合约, 因此, 攻击者只消通过攻击环球库合约, 就可以影响整个依赖于它的钱包合约.
图 5描写了多签名钱包冻了案例, 其中包括WalletLibrary和MulitisigWallet的合约片断.
合约WalletLibrary中, initWallet函数用来脱手化钱包的使用日限和整个者等参数, 任何使用delegatecall的钱包合约齐可以公开调用initWallet函数, 如合约MulitisigWallet的第9行所示, 钱包实例使用delegatecall调用了环球库WalletLibrary. 由于WalletLibrary中的整个环球函数(举例initDayLimit和initMulitowned)齐可以被未经授权的任何东谈主调用, 攻击者只消通过调用WalletLibrary中的initWallet函数索要多签名钱包整个权, 就可以箝制该多签名钱包. 在Parity多签名钱包冻了案例中, 攻击者获取该多签名钱包整个权后, 通过Self- destruct操作断送了该钱包, 导致整个依赖于该环球多签名钱包的整个用户钱包被冻结, 统共冻结的以太币价值近3亿好意思元.

智能合约中, 如果对整型变量值操作欠妥, 极易产生整数溢出景象. 现实寰球中的智能合约整数溢出案例许多, 举例在Proof-of-Week-Hands(简称POWH)合约中[51], 攻击者利用其整数溢露马脚窃取了约2 000个以太币. 比年来, 最着名的智能合约整数溢出案例则是好意思链BEC合约罅隙, 攻击者通过BEC合约的批量转账方法无尽生成代币, 导致整个好意思链BEC代币价值俄顷挥发归零.
图 6呈现了好意思链BEC合约中存在整数溢出问题的代码片断, 其中, batchTransfer是一个批量转账函数, 通过传入多个地址和转账金额后, 达成BEC的批量转账. 然而, 这个转账函数中存在整数溢露马脚, 问题出在图 6中的第6行代码“uint256 amount=uint256(cnt)*_value”. 智能合约中, uint256默示256位无记号整数, 数据范围为[0, 2256−1], 若传入的_value值过大时, 则会使amount的值突出uint256的数据范围, 从而出现整数上溢的问题. 攻击者恰是利用这里的罅隙, 通过传入很大数值的_value, 最终导致BEC合约发生了整数溢露马脚, 变成了不可逆转的蚀本.

庞氏骗局[52, 53]是一种经典的投资诈骗技能, 其典型的特征在于将新加入的投资者的一部分参与费四肢答复支付给现存的投资者. 庞氏骗局的发起者闲居同意加入投资能产生高答复且风险小, 以此诱导新的投资者.然而, 这类骗局最终只会毁伤绝大多数参与者的利益.
跟着智能合约的泛泛哄骗, 庞氏骗局脱手渐渐呈现新的特征[54]. 由于区块链的匿名性, 整个的参与者无法知谈合约发起者的信得过身份, 导致许多庞氏骗局可以在智能合约的遏止下伪装起来, 咱们将这类庞氏骗局称为智能合约庞氏骗局. 由于智能合约具有自动实行、不可改削等本性, 这使得它成为庞氏骗局诱导受害者最成心的技能之一. 为了更好地了解智能合约庞氏骗局, 本节在图 7中呈现了一个典型的智能合约庞氏骗局Rubixi案例.

从图 7中可以看到, Rubixi合约均分别包含Rubixi构造函数、Fallback函数、collectAllFees函数以及addPayout函数.
● Rubixi构造函数会在合约创建时实行, 而况只实行一次;
● Fallback函数(即“function () { addPayout(); }”)会在收到以太币转账时自动实行, 当参与者将以太币进入到Rubixi合约时, Fallback函数将自动被触发;
● collectAllFees函数用于合约创建者提取合约中存放的资金;
● addPayout函数则是最关键的函数, 它达成了庞氏骗局的主要逻辑: (1) 纪录参与者的地址和参与用度; (2) 筹谋参与者的投资用度; (3) 当合约中余额弥散时, 则支付给现存的参与者薪金用度.
瓦解, 从图 7的代码片断中可以看出, pyramidMultiplier是箝制参与者大约得到些许利润的关键变量: 为了诱导早期的投资参与者, 合约整个者事先树立其值为300; 当参与东谈主数达到10和25时, pyramidMultiplier的值降为200和150. 从整个合约逻辑来看, 该合约发起者主要目的其实是为了窃取投资参与者的投资用度, 如“collectedFees+=(msg.value*fee)/100”(第29行)用来收取每笔投资10%的参与费, 通过调用collectAllFees函数提取用度“creator.send(collectedFees)”(第16行), 这就是一个典型的智能合约庞氏骗局.
2 智能合约安全分析方法智能合约安全罅隙变成的要紧蚀本一方面严重影响了用户体验, 另一方面破裂了区块链智能合约的信用体系, 刻下智能合约的安全问题正成为研究者和征战者共同温雅的焦点. 为了驻防坏心攻击者利用智能合约罅隙, 研究者们还是尝试使用种种方法对以太坊智能合约源代码以及EVM字节码进行全面分析. 传统的步履罅隙检测方法使用的是特征匹配[55], 即: 对一些坏心代码进行提取抽象, 通过匹配模块对静态源代码进行检测. 然而, 这种方法应用范围有限、漏报率高. 比年来, 智能合约罅隙检测方法主要有5种, 包括体式化考证法[56−58]、记号实行法[59−61]、隐隐检测法[62−64]、中间默示法[65]和深度学习法[66−70].
2.1 体式化考证法体式化考证是智能合约安全分析的曲折时间之一. 通过体式化言语, 把合约中的意见、判断、推理迂曲成体式化模子, 从而扬弃合约中的歧义性和欠亨用性, 然后互助严谨的逻辑和讲解, 考证智能合约中函数功能的正确性和安全性. 目下, 体式化考证时间还是在核电、航天等高安全要求的鸿沟取得了获胜应用, 通过将体式化方法应用于智能合约罅隙检测, 可以使得智能合约的生成和实行有表淘气约束, 从而保证合约的委果性和可靠性.
常见的体式化考证方法包括模子检测和演绎考证: 模子检测列举出整个可能的现象并逐个历练, 这种方法的基本念念想是, 通过现象空间搜索来阐发合约是否具有相应的性质; 演绎讲解基于定理讲解的念念想, 领受逻辑公式描写系统过火性质, 通过一些推理端正讲解系统具有某些性质. 节略来讲, 体式化考证通过数理逻辑讲解形貌, 考证代码在表率描写的前提下得志某些本性. 目下, 基于体式化考证的智能合约罅隙分析方法有以下5种.
(1) F* framework[71].
F*是一种体式化考证方法, 通过将EVM字节码的语义体式化并把EVM字节码编译成Ocaml体式, 最终将智能合约源码和字节码迂曲成函数编程言语F*, 以便分析和考证合约的安全性和功能正确性, 从而获胜检测以太坊智能合约罅隙. 图 8中描写了F* framework的总体架构和检测过程, 它达成了Solidity*和EVM*这2个模块来考证Solidity源代码和EVM字节码之间的功能等效性与正确性.

(2) KEVM framework[72].
KEVM是一种体式化分析的框架, 它利用K框架构建了基于EVM字节码栈的可实行体式化表率, 提供了EVM的表率、参考解释器以及用于步履分析和考证的器具.
(3) Isabelle/HOL[73].
Isabelle/HOL是一种EVM字节码级别的体式化考证方法, 其通过将字节码序列构变成直线代码块或将合约拆分红基本块, 并在此基础上创建逻辑步履进行推理考证.
(4) ZEUS[74].
ZEUS是一种静态分析器具, 其基于体式化考证的方法大约正确且公谈地分析智能合约. ZEUS利用抽象解释和记号模子查验以及约束语句来快速考证合约的安全性, 救援多种智能合约罅隙的检测, 举例可重入罅隙、整数溢露马脚、非常处理罅隙等.
(5) VaaS[75].
VaaS是基于体式化考证方法的“一键式”智能合约安全检测平台, 它可以自动检测智能合约中10大项32小项的老例安全罅隙, 而况大约精确定位风险代码位置以及给出修改建议.
2.2 记号实行法记号实行法的主要念念想是, 将代码中的变量记号化. 通过记号化步履输入, 记号实行大约为整个的实行旅途诊治一组约束; 实行之后, 约束求解器将用于求解约束并详情导致该实行的输入; 终末, 利用约束求解器得到新的测试输入, 检测记号值是否可以产生罅隙. 记号实行法应用于智能合约罅隙检测的实行过程为: 起首, 将合约中的变量值记号化; 然后逐条解释实行步履中的教唆, 在解释实行过程中更新实业绩态、征集旅途约束, 以完成步履中整个可实行旅途的探索并发现相应的安全问题. 目下, 基于记号实行的智能合约罅隙检测器具有以下6种.
(1) Oyente[76]
Oyente是最早的智能合约罅隙静态检测器具之一, 其在合约箝制流图的基础上, 利用记号实行的方法检测智能合约罅隙. Oyente以智能合约字节码和以太坊现象四肢输入, 模拟EVM而况遍历合约的不同实行旅途, 其救援检测的罅隙类型包括可重入罅隙、非常处理罅隙、来去轨则依赖罅隙等. Oyente共有4个模块: CFGBuilder, Explorer, CoreAnalysis和Validator, 具体架构和检测过程如图 9所示.

(2) Maian[77]
Maian是一种基于记号分析的智能合约分析器具, 它通过长序列的合约调用过程来发现安全罅隙. 区别于一般的合约分析器具, Maian只专注于3种类型的合约罅隙, 即资产无尽期冻结的合约罅隙(greedy)、易知道资产给目生账户的合约罅隙(prodigal)、合约可以被任何东谈主粗俗断送的罅隙(suicidal).
(3) Securify[78]
Securify是一种用于以太坊智能合约的静态安全分析器, 具有可伸缩、统统自动化、准确率高等本性, 其通过分析合约的依赖图以及从代码中提取精确的语义信息来查验合约的合规性与安全罅隙.
(4) Mythril[79]
Mythril是一种智能合约静态分析器具, 其使用意见分析、流毒分析以及箝制流考证来检测以太坊智能合约中常见的罅隙类型, 包括可重入罅隙、整数溢露马脚、非常处理罅隙等.
(5) TeEther[80]
TeEther是一种智能合约静态分析器具, 区别于一般的罅隙检测器具, 它有筹商了智能合约罅隙自动识别以及合约生成方法, 并通过分析合约字节码查找关键的实行旅途, 以检测合约的安全问题.
(6) Sereum[81]
Sereum是一种专注于智能合约可重入罅隙的新颖检测有盘算推算, 该措置有盘算推算利用动态流毒追踪监视智能合约实行过程中的数据流, 从而自动检测并驻防现象不一致的情况, 灵验地检测了可重入攻击.
2.3 隐隐测试法隐隐测试是刻下游行的罅隙检测时间之一. 从意见上讲, 隐隐测试从宗旨应用步履中生成无数正常和非常的测试用例, 尝试将生成的用例提供给宗旨应用步履, 并监视实业绩态中的非常放胆以发现安全问题. 与其他时间比较, 隐隐测试具有细密的可延长性和适用性, 可以在莫得源代码的情况下实行. 目下, 哄骗在智能合约罅隙检测中的隐隐检测方法有以下3种.
(1) ContractFuzzer[82]
ContractFuzzer是第一个基于隐隐测试的以太坊智能合约安全罅隙的动态分析方法, 其基于智能合约ABI表率生成隐隐测试用例, 并界说测试有盘算推算来检测安全罅隙. ContractFuzzer对EVM进行建树, 并纪录智能合约运行时的行径. 通过分析这些日记并检测罅隙. 图 10具体描写了ContractFuzzer的总体架构和检测过程.

(2) Regurad[83]
Regurad是一种专注于智能合约可重入罅隙的隐隐测试分析器, 其通过迭代生成就地且种种化的测试用例, 对智能合约实行隐隐测试, 从而在合约的实行过程中进行追踪, 进一时局动态识别可重入罅隙.
(3) ILF[84]
ILF是基于神经蚁集的智能合约隐隐测试器, 它利用记号实行引擎生成灵验的测试和调用序列, 以带领神经蚁集模子的特征学习, 从而达成存效的罅隙检测.
2.4 中间默示法智能合约实质上是一种筹谋机步履, 其区别于其他言语的方面在于: (1) 智能合约有其独到的Fallback函数; (2) 智能合约能主管数字货币转账和来去. 因此, 比较于其他步履来说, 智能合约言语的分析更复杂, 安全罅隙变成的蚀本也更大. 为了大约准确地分析智能合约, 研究者们通过将智能合约源码或字节码挪动成具有高语义抒发的中间默示(intermediary representation, IR), 然后对合约的中间默示进行分析以发现安全问题. 目下, 利用中间默示法的智能合约分析器具有以下6种.
(1) Slither[85]
Slither是一种以太坊智能合约的静态分析框架, 它将智能合约Solidity源代码挪动为SlithIR的中间默示, SlithIR使用静态单一分派(SSA)体式和精简教唆集来简化合约分析过程, 同期保留了Solidity源代码挪动为EVM字节码时丢失的语义信息. 图 11描写了Slither的中枢检测过程, Slither不仅能用于检测智能合约的常见罅隙, 而况能给出合约代码优化的建议.

(2) Vandal[86]
Vandal是一种EVM字节码层面的智能合约静态分析器具, 它由一个分析管谈和一个反编译器构成. 该反编译器实行抽象解释, 以逻辑关系的体式将字节码挪动为更高等别的中间默示(IR), 然后使用新颖的逻辑驱动方法检测合约罅隙.
(3) Madmax[87]
Madmax是一种专注于以太坊智能合约Gas关连的罅隙分析器具, 它基于Vandal达成了箝制流分析和反编译器的步履结构性检测方法. 该器具相通将EVM字节码反编译成具有高语义信息的中间默示, 大约高精度地检测Gas关连的罅隙, 举例以太冻结罅隙等.
(4) Ethir[88]
Ethir是一种基于EVM字节码层面的分析器具, 它基于Oyente生成箝制流图(CFG), 然后将CFG挪动为基于端正的中间默示(RBP), 从而分析和推断EVM字节码的安全属性.
(5) Smartcheck[89]
SmartCheck是一种可延长的智能合约静态分析器具, 它将智能合约Solidity源代码挪动为基于XML的中间默示, 然后利用XPath的形态来检测智能合约罅隙.
(6) ContractGuard[90]
ContractGuard是一种面向以太坊智能合约的入侵检测器具, 它基于入侵检测系统(IDS)检测潜在攻击激发的非常箝制流, 通过灵验的落魄文标记(context-tagged)无环旅途达成入侵检测.
2.5 深度学习法比年来, 深度学习在步履安全鸿沟还是有越来越多的获胜实践[66−70], 取得了令东谈主饱读励的效果. 深度学习时间的进步促进了种种安全检测方法的出生, 关于新颖的安全罅隙类型, 深度学习方法具有细密的延长性和安妥性. 目下, 基于深度学习的智能合约罅隙检测方法有以下5种.
(1) SaferSC[91]
SaferSC是第1个基于深度学习的智能合约罅隙检测模子, 其基于Maian远隔的3类合约罅隙, 达成了比Maian更高的检测准确率. 此外, SaferSC在智能合约操作码(operation code, opcode)层面进行分析, 利用LSTM蚁集构建了以太坊操作码序列模子, 达成了精确地智能合约罅隙检测.
(2) ReChecker[92]
ReChecker是第1个基于深度学习的智能合约可重入罅隙检测方法, 其通过将智能合约Solidity源代码挪动为合约块(contract snippet)的体式, 拿获了合约中基本的语义信息和箝制流依赖信息. ReChecker利用双向短历久驰念模子(bidirectional long short-term memory, BLSTM)和防止力机制(attention)[93]达成了以太坊智能合约可重入罅隙的自动化检测.
(3) DR-GCN[94]
DR-GCN是第1个利用合约图(contract graph)的形貌来检测智能合约罅隙, 其将智能合约源代码挪动为具有高语义默示的合约图结构, 并利用图卷积神经蚁集构建了安全罅隙检测模子. DR-GCN救援2个平台(即以太坊和维特链)的智能合约罅隙分析, 大约检测可重入罅隙、时候戳依赖罅隙以及死轮回罅隙.
(4) TMP[94]
TMP通过将智能合约中的关键函数和关键变量挪动成具有高语义信息的中枢结点来构建合约图, 关键的实行形貌挪动成箝制流和数据流依赖的有向时序边. TMP在DR-GCN的基础上有筹商了合约图中边的时序信息, 并利用时序图神经蚁集[95, 96]达成了相应的智能合约罅隙检测. 如图 12所示, TMP起首将源代码挪动为图, 然后对合约图作念归一化处理, 最终通过期序图神经蚁集模子输露马脚检测放胆.

(5) ContractWard[97]
ContractWard从智能合约操作码中提取bigram特征, 利用多种机器学习算法和采样算法进行智能合约罅隙检测, 其统共救援6种罅隙类型, 包括可重入罅隙、整数溢露马脚以实时候戳依赖罅隙.
3 智能合约罅隙检测器具分析和比较本节起首概述了统共25种智能合约检测器具; 然后比较了不同检测器具的可检测罅隙类型; 接着评估了智能合约罅隙检测器具的性能, 包括准确率、F1-Score和平均检测时候; 终末分析了刻下罅隙检测方法的局限性, 并计议了它们存在的研究挑战以及改造念念路.
3.1 检测器具概览表 2概述了不同的智能合约罅隙检测器具.

● 第1列先容了5种常见的智能合约罅隙检测方法;
● 第2列列举了相对应的检测器具;
● 第3列阐明了每种检测器具的自动化进度: 全自动指端到端的措置方法, 即输入一个合约输出对应的罅隙检测放胆; 半自动指在检测过程中需要手动界说关连的合约属性等, 举例体式考证法使用定理证理智能合约的安全性, 由于这些讲解是半自动化的, 因此体式化考证法需要无数的东谈主工操作对智能合约进行分析和反馈;
● 第4列概述了相应的检测器具救援的智能合约言语和体式;
千涩bt核工厂● 第5列说明了检测器具的开源进度, 而况给出了相应的开源地址;
● 终末一列对应的是具体的参考文件.
左证表 2中的统计放胆, 咱们进行了以下分析.
● 相较于其他的检测方法, 体式化考证检测器具的自动化进度偏低且开源性较低;
● 基于记号实行和中间默示的罅隙检测器具类型比较多, 它们大约实行全自动的罅隙检测, 而况绝大多数齐能找到开源代码;
● 基于隐隐测试的检测器具比较少, 其原因可能是隐隐检测的动态实行方法操作比较复杂和繁琐, 且由于测试用例的就地性, 其无法达到理想的测试旅途秘籍率;
● 基于深度学习的智能合约罅隙检测大多数更专注于智能合约Solidity源代码的层面, 它们可以达周全自动化的检测, 而况开源进度较好.
3.2 检测器具性能分析 3.2.1 智能合约罅隙检测评估表 3统计了25种智能合约罅隙检测器具及它们救援的可检测罅隙类型, 统共包括3大类15种智能合约罅隙类型.

具体的分析从以下两个角度来看.
(1) 罅隙类型检测情况
● 从Solidity代码层的检测放胆来看, 大多数检测器具齐救援可重入罅隙的检测, 这可能是因为智能合约历史上最着名的“The DAO”事件由可重入罅隙引起, 因此研究者和征战者大多会温雅此类罅隙的分析. 另外, 许多检测器具也救援整数溢出、以太冻结、非常处理和未知函数调用等罅隙的检测, 这些安全罅隙齐曾引起过要紧的合约攻击事件, 举例好意思链BEC合约整数溢出事件、Parity多签名钱包冻结事件等. 值得指出的是: 救援权限箝制、断绝办事和类型唠叨等罅隙检测的器具比较少, 这3类罅隙发生的频率较少且易于注重;
● 从EVM实行层的检测放胆来看, 由于短地址罅隙发生概率小且容易校验, 因此救援该罅隙检测的器具比较少. 另外, 由于体式化考证法和深度学习法更温雅于Solidity代码层的罅隙分析, 因此它们齐繁重对EVM实行层罅隙检测的有筹商, 举例, ZEUS, F* framework, ReChecker, DR-GCN和TMP齐不救援该层面的罅隙检测;
● 从区块链系统层的检测放胆来看, 时候戳依赖是比较常见的罅隙且易于检测, 大多数检测器具齐救援对时候戳依赖罅隙的检测. 值得防止的是, F* framework, ZEUS和Securify可以救援区块链层整个罅隙类型的检测.
要而论之, 尽管目下大多数智能合约罅隙齐有相应的检测器具救援, 但有一些易于检测的合约罅隙反而救援的罅隙检测器具很少, 举例权限箝制和短地址罅隙, 它们唯有2种罅隙检测器具可以检测. 这两类罅隙发生的概率较小, 要是发生此类罅隙, 变成的蚀本亦然不可揣摸的. 因此, 罅隙类型的全面秘籍, 仍然是刻下检测器具面对的关键挑战. 跟着智能合约数目的逾越式增长, 相应的罅隙数目和类型也在增多, 使用罅隙检测器具对合约进行更全面以及可拓展的罅隙检测, 是亟需措置的关键问题.
(2) 检测器具的救援进度
左证表 3中的统计放胆, 体式化考证器具救援检测的智能合约罅隙类型较少, 其中, KEVM和Isabelle/ HOL提供了步履分析与体式化考证的方法来考证合约实行时的安全性、功能正确性和步履逻辑合感性, 但未用作具体的智能合约罅隙检测. 此外, F* framework, ZEUS和VaaS险些齐不救援EVM实行层的罅隙检测. 体式化考证法大多使用数学定理讲解及复杂机制进行考证, 因此, 使用体式化考证法分析智能合约并非易事.
基于记号实行的检测器具大多能救援较多类型的合约罅隙检测. 举例, Oyente, Securify和Mythril分别可以救援6种、12种和8种罅隙类型的检测, 其中, Securify是25种检测器具中救援最多罅隙类型检测的器具. Maian, TeEther和Sereum救援的罅隙类型较少, 其中, Maian主要是对其远隔的3类独到的罅隙进行检测(即Greedy, Prodigal, Suicidal), 而Sereum只专注于可重入罅隙检测.
比较较于其他方法, 基于隐隐测试法的ContractFuzzer, Reguard和ILF救援检测的罅隙类型较少, 其中, ContractFuzzer和ILF救援6种常见的罅隙检测, 而Reguard只专注于可重入罅隙检测.
基于中间默示法的检测器具取得了可以效果, 其中, Vandal, Slither, Smartcheck和ContractGuard救援检测的罅隙类型较多, 分别能检测6种、7种、8种、10种罅隙类型, 而Madmax和Ethir分别只可检测2种和4种罅隙.
基于深度学习的方法救援检测的罅隙类型较少, SaferSC和ContractWard分别大约救援4种和5种罅隙类型的检测, 而ReChecker只专注于可重入罅隙的检测; DR-GCN和TMP分别救援2种罅隙类型的检测, 即可重入罅隙和时候戳依赖罅隙.
要而论之, 种种罅隙检测器具涵盖的罅隙类型仍然是不全面的, 其中大多数还只是能检测初级别的安全违法行径和罅隙, 吃力对合约可实行旅途的判断与考证, 难以检测由外部合约调用导致的安全问题. 因此, 在刻下智能合约数目弘远且日益增长的配景下, 使用单一的检测器具对合约罅隙进行全面考证, 仍是有挑战性的难题.
3.2.2 检测器具性能评估表 4详实比较分析了不同罅隙检测器具的性能. 咱们从前文所述的5种智能合约罅隙检测方法中聘请相应的具有代表性检测器具, 分别是VaaS, Oyente, Smartcheck, ContractFuzzer和TMP, 而况从以太坊官方网站Etherscan[23]中就地及第了300个信得过的以太坊智能合约四肢测试样本, 就可重入罅隙、整数溢露马脚、时候戳依赖罅隙这3种合约罅隙, 从准确率、F1-Score和平均检测时候这3个维度对检测器具进行了性能评估与比较.

左证表 4中聘请的罅隙类型以及相应的检测器具, 咱们分别从不同的智能合约罅隙类型以及不同类别的罅隙检测方法两个角度进行计议与分析.
● 从不同的智能合约罅隙类型来看. 刻下的5类检测方法齐救援检测的智能合约罅隙唯有可重入罅隙和时候戳依赖罅隙, 这进一步标明, 不同类别的罅隙检测方法可救援检测的罅隙类型仍然不全面;
● 从不同类别的罅隙检测方法来看. 刻下, 许多罅隙检测器具仍无可用的开源代码, 且存在源代码的检测器具许多处于半开源现象或只给出实验放胆. 举例, 体式化考证法中的几个检测器具大多莫得开源, 因此本文聘请VaaS四肢对比; 记号实行法中大约运行的器具有Oyente, Maian, Securiy和Mythril, 因此本文聘请Oyente四肢对比; 隐隐测试法中的Reguard和ILF也莫得开源, 因此本文聘请ContractFuzzer四肢对比; 中间默示法中大约运行的器具有Slither, Vandal和SmartCheck, 因此本文聘请SmartCheck四肢对比; 深度学习法中大约运行的器具有ReChecker, DR-GCN和TMP, 其中, TMP是它们中准确率最高的罅隙检测器具, 因此本文聘请它四肢对比.
要而论之, 就刻下罅隙检测器具的开源进度以及不同罅隙检测方法可救援检测的罅隙类型来看, 对不同罅隙的针对性检测方法进行对比仍是有难度的, 亟待进一时局研究与探讨.
智能合约罅隙检测器具的性能评估主要包括以下3个方面.
(1) 准确率
为了评估检测器具的优劣, 起首温雅最常见的评估方针, 即准确率(accuracy). 准确率在某种真理真理上可以判定一个分类器是否灵验, 大约客不雅地反应种种检测器具最顺利的检测效果. 罅隙检测其实是一个二分类问题, 即检测器具判断合约是否存在某类罅隙. 关于二分类问题, 闲居将信得过情况与检测放胆的匹配放胆四肢曲折的评估方针, 其中包括以下4种情况.
● 真阳性(true positive, TP): 关于某一合约, 检测器具的检测放胆是有罅隙且信得过情况亦然有罅隙, 即检测放胆是正确的;
● 假阳性(false positive, FP): 关于某一合约, 检测器具的检测放胆是有罅隙而信得过情况却是无罅隙, 即检测放胆存在误判;
● 假阴性(false negative, FN): 关于某一合约, 检测器具的检测放胆是无罅隙而信得过情况却是有罅隙, 即检测放胆存在漏判;
● 真阴性(true negative, TN): 关于某一合约, 检测器具的检测放胆是无罅隙且信得过情况亦然无罅隙, 即检测放胆是正确的.
瓦解, TP+FP+FN+TN的放胆是300个智能合约测试样本, 智能合约信得过值和检测值的污辱矩阵(confusion matrix)如图 13所示, 其中, 准确率的筹谋方法如公式(1)所示:
$ Accuracy = \frac{{TP + TN}}{{TP + FP + FN + TN}} $ (1)
左证表 4中的评估放胆.
● 在可重入罅隙的检测上, 深度学习方法TMP达成了最高的准确率(84.48%); 体式化考证器具VaaS和隐隐测试器具ContractFuzzer分别达成了82.54%和67.89%的准确率; 比较较来说, Oyente和Smartcheck检测的准确率稍稍不及, 分别唯有61.62%和52.97%;
● 关于整数溢露马脚: VaaS的准确率高达86.80%, 而Oyente和Smartcheck唯有66.85%和58.48%的准确率, ContractFuzzer和TMP则不救援该类罅隙的检测;
● 关于时候戳依赖罅隙: VaaS和TMP达成了较高的检测准确率, 分别为89.20%和83.45%; 而Oyente, Smartcheck和ContractFuzzer检测的准确率很低, 分别唯有59.45%, 51.32%和68.08%.
(2) F1-Score
F1-Score是分类问题中曲折的斟酌方针, 它是精确率(precision)和调回率(recall)长入平均数, 常被用作一些分类问题的最终评估程序, 其筹谋方法如公式(2)−公式(4)所示:
$ Precision = \frac{{TP}}{{TP + FP}} $ (2) $ Recall = \frac{{TP}}{{TP + FN}} $ (3) $ F1{\text{ - }}Score = 2 \cdot \frac{{Precision \times Recall}}{{Precision + Recall}} $ (4)左证表 4的评估放胆.
● 在可重入罅隙的检测上: TMP达成了最高的F1-Score(74.15%), 其次是VaaS的73.95%, 其他几类检测器具的F1-Score相对较低;
● 在整数溢露马脚的检测上, VaaS则得到了80.10%的F1-Score, Oyente和Smartcheck的F1-Score分别为59.64%和54.96%;
● 关于时候戳依赖罅隙的检测, VaaS和TMP齐得到了可以的F1-Score, 分别为82.46%和79.19%.
(3) 平均检测时候
检测时候亦然评估自动化检测器具的曲折方针之一, 刻下, 大多数检测器具审计时候较长导致罅隙分析的遵循低下. 左证表 4的评估放胆: 体式化考证器具VaaS和隐隐测试器具ContractFuzzer的平均检测时候较长, 分别为159.4 s和352.2 s; 比较于来说, Oyente和Smartcheck的平均检测时候为29.6 s和14.5 s. 值得防止的是, TMP对不同罅隙的检测时候是不同的: 关于可重入罅隙检测, 它的平均检测时候为2.5 s; 而关于时候戳依赖罅隙, 它的平均检测时候为2.1 s.
综合上述分析, 咱们对这5类检测器具进行了以下分析和归来.
● VaaS在3种罅隙的检测上达成了比较高的准确率和F1-Score, 但它的平均检测时候相对来说较长. VaaS是“一键式”的体式化考证平台, 领受了多种体式化考证方法, 具有考证遵循高、自动化进度高、精确率高等特色;
● Oyente是基于记号实行的合约分析器具, 它对3种罅隙的检测效果仍有不及, 其通过简化合约中轮回处理和基于端正匹配判断方法来进步遵循, 但也因此导致许多漏报和误报情况;
● Smartcheck是利用基于XML端正合约中间默示分析智能合约安全问题的器具, 然而, 由于它依赖于刻板节略的逻辑端正, 关于合约罅隙的检测存在许多误报情况, 从而导致了很低的准确率和F1- Score. 值得一提的是: 由于其依赖于节略的逻辑端正, 相对来说破耗的检测时候比较少;
● ContractFuzzer是基于以太坊平台的智能合约安全罅隙隐隐测试器具. 实验对比中, 它只救援可重入和时候戳依赖罅隙的检测. 由于隐隐测试用例所能涵盖的系统行径有限, 其无法达到理想的旅途秘籍率, 因此取得的效果并不好. 此外, 由于ContractFuzzer基于以太坊平台, 它在使用时还需要获取区块链蚁集的响应以实行径态考证, 因此实行一次检测需要破耗无数时候;
● TMP是新颖的基于图神经蚁集的智能合约罅隙检测模子, 具有可延长性高、准确率高、批量检测等特色. 实验对比中, TMP救援可重入和时候戳依赖罅隙的检测, 而况取得了令东谈主饱读励的效果. 同期, 由于利用还是西席好的检测模子, TMP的平均检测时候很是少, 极地面进步了智能合约罅隙检测的遵循.
3.3 检测方法评估与改造念念路 3.3.1 局限性分析刻下的智能合约罅隙检测方法天然大约较好地分析智能合约罅隙, 但它们仍然存在固有的局限性. 本节分别对前述的5类罅隙检测方法进行了具体地分析与计议.
(1) 体式化考证法通过一些数学技能在智能合约人命周期内对其进行推导与讲解, 需要交互式的考证与判断, 因此自动化进度较低, 而况依赖东谈主工二次核验, 导致其无法较好地兼容EVM实行层罅隙.同期, 由于体式化考证技能依赖于严谨的数学推导与考证, 它无法实行径态分析, 而况吃力对合约中可实行旅途的检测与判断, 从而导致了较高的误报率和漏报率. 举例: F* framework和KEVM将智能化合约字节码迂曲为体式化模子, 以考证合约代码中的种种属性来检测罅隙, 它们仍然是半自动的; ZEUS和VaaS较好地达成了全自动体式化考证, 但它们检测出来的罅隙不一定存在可达的实行旅途, 因此存在较高的误报率;
(2) 记号实行法利用记号替代具体的实行步履教唆、征集旅途约束、遍历合约步履中整个可实行旅途, 这一方法天然灵验地改善了记号实行的检测效果, 但也权臣地进步了罅隙分析过程中的筹谋资源和时候支拨, 而况无法透顶措置现象空间爆炸与实行旅途指数级增长等问题. 举例, Oyente和Maian为了驻防旅途爆炸问题, 限定轮回条目的次数来进步遵循, 但也导致了较高的漏报率. 另外需要指出的是: 许多记号实行法其实并不可作念到统统自动化, 相通需要东谈主工协助与反馈;
(3) 隐隐测试法很猛进度上依赖于全心联想的测试用例, 其在动态实行过程中监测合约的非常行径以发现罅隙. 然而, 隐隐测试对导致罅隙的具体语义代码洞悉有限, 这使得其很难追踪到存在罅隙真的切代码位置. 举例, ContractFuzzer天然灵验地裁汰了误报率, 但由于其测试用例生成的就地性, 无法达到理想的旅途秘籍率, 因此很难找出整个的潜在恐吓;
(4) 中间默示法通过将原始的智能合约挪动为相应的中间默示, 利用箝制流、数据流以及流毒分析等技能对合约进行审查, 但它们不息依赖于预界说的语义端正或分析列表, 从而无法检测出智能合约复杂的业务逻辑问题, 且极易产生误报. 另外, 它们无法对合约中可能存在的实行旅途进行遍历. 举例: Slither的中间默示SlithIR依赖于固定的语义端正且繁重体式化语义, 这限定其实行更详实的安全分析, 因此无法准确检测相应的罅隙; Smartcheck依赖于刻板且节略的预界说端正, 因此无法检测出一些由流毒分析或动态实行考证的合约罅隙;
(5) 深度学习法闲居对智能合约进行预处理, 以构建成心于模子学习的数据集. 举例, 文件[92]利用LSTM模子处默默能合约源码序列片断, 文件[94]通过GNN模子处默默能合约图. 然而, 这些方法一方面无法杰出智能合约源码中的关键变量而变谚语义建模不及, 导致检测放胆不睬想, 而况吃力对EVM实行层罅隙的有筹商; 另一方面, 由于神经蚁集的“黑箱性”, 因此其大多数情况下可解释性较差, 即无法像传统的检测器具一样给出可能存在罅隙真的切位置或代码行. 举例, TMP是一个端到端的罅隙检测模子, 以合约测试集为输入, 输出相应的罅隙检测放胆, 它的中间处理过程是黑盒的, 因此其可解释性较差, 且检测放胆难以令东谈主坚信.
3.3.2 研究挑战与改造念念路针对现存的智能合约罅隙检测方法存在的问题, 本节分别就它们面对的研究挑战以及改造念念路进行了计议与分析, 主要围绕以下5个方面张开.
(1) 进步体式化考证自动化进度, 延长应用范围
现存的体式化考证时间的研究责任大多数自动化进度不高, 且检测出来的罅隙不一定存在可达的步履旅途. 目下的体式化考证方法用数学推演来分析可能存在复杂罅隙的合约, 天然灵验地诊治了智能合约的安全但其难度很高. 另外, 使用体式化考证时间对更泛泛的智能合约罅隙进行检测仍然面对着严峻挑战. 改日的研究应针对不同的罅隙检测宗旨定制对应的考证表率描写, 打破其不安妥大范围合约及多罅隙类型等时间限定, 并延长体式化考证的应用范围, 从考证一般功能属性和安全属性、检测常见罅隙到渐渐达成营业场景中复杂业务逻辑的智能合约罅隙分析与考证[44].
(2) 提取记号实行重心旅途, 缩减旅途空间
记号实行刻下边临的最主要挑战就是现象空间爆炸和实行旅途指数级增长的问题. 改日可行的方法是: 计议现存记号实行器具的审计告诫以及罅隙分析情况, 寻找智能合约中易产生罅隙的高危教唆, 如SUICIDE, CALL, DELEGATECALL, ORIGIN, ASSERT等[41], 界说波及这些操作码的旅途为重心旅途. 为了进步罅隙检测遵循, 在具体的实践中无谓对整个可能的实行旅途进行查验, 仅记号实行温雅的重心旅途并进行罅隙考证, 从而灵验地缩减旅途空间.
(3) 完善测试用例, 改造隐隐测试器具
相较于传统应用步履, 智能合约存在许多独到的变量和函数, 这给面向智能合约的隐隐测试带来了全新的挑战.
起首, 由于智能合约全局现象与调用序列的本性, 导致生成灵验的测试用例变得极为艰难. 面向传统步履的隐隐测试有盘算推算生成测试用例时仅有筹商单测试用例, 因此并不适用于智能合约. 其次, 智能合约基于诬捏机运行, 其罅隙的形成原因与传统步履有较大的不同. 智能合约中的罅隙有较大辞别, 它们既不会变成步履崩溃, 也莫得许多共同的特征用于罅隙检测, 这些罅隙的产生根源可能来自于区块链、诬捏机和高等言语等不同的层面, 且彼此之间也有较多的各异, 这也为智能合约的罅隙检测带来了很大挑战[43].
具体而言, 隐隐测试依赖于其测试用例的健壮性, 因此需要进一步改造现存的测试用例生成算法, 举例使用多宗旨优化算法. 另外, 隐隐测试也可以有筹商计议其他检测方法来进步检测遵循, 领受静态分析、记号实行、隐隐测试相计议的计策. 举例, 使用静态分析提取关键旅途, 通过记号实行生成测试用例, 从而进步隐隐测试的遵循.
(4) 优化中间表示体式, 计议动态实行
中间默示法闲居将智能合约源码或字节码挪动为特有的中间默示体式来检测特定的几类罅隙, 同期, 它们也依赖于大众界说的罅隙端正. 但这些端正不息比较刻板节略, 且容易被攻击者绕过. 因此, 为了进步这类罅隙检测方法的拓展性及安妥性, 研究者们应当专注于让智能合约的中间表示体式具备更好的通用性, 在检测多种类型罅隙的同期, 兼顾不同智能合约的统一默示体式. 另外, 静态分析与动态实行相计议, 是大约进步罅隙检测准确率的灵验方法. 刻下, 基于中间默示的检测方法大多是静态分析, 繁重使用动态实行进行考证.因此, 这既是中间默示法目下边临的关键挑战, 亦然改日研究攻关的主要宗旨.
(5) 加强深度学习可解释性, 交融大众端正
现存的基于深度学习的智能合约罅隙检测方法大多是黑盒的检测过程, 它们通过西席罅隙检测模子来给出最终的罅隙检测放胆. 由于深度学习模子固有的“黑箱性”, 其里面的具体责任现象和处理过程是不透明的, 因此繁重对罅隙检测放胆的合知道释(如标注可能存在罅隙真的切代码位置或代码行), 从而使得检测放胆无王法东谈主坚信. 因此, 深度学习模子应该有筹商在输露马脚检测放胆的同期进一步给出其合理的可解释性说明. 另外值得提倡的是: 传统检测器具中界说的大众端正亦然分析合约罅隙的利器, 改日的深度学习模子应当有筹商交融传统检测方法中罅隙关连的大众端正, 从而更好地进步罅隙检测的准确率.
4 归来与预计智能合约四肢区块链最获胜的应用之一, 极地面延长了区块链的应用场景和现实真理真理, 在区块链生态环境中起着至关曲折的作用. 跟着区块链时间日益闇练以及智能合约发展与泛泛应用, 智能合约的安全性和可靠性还是成为了新的研究焦点. 本文归来了以太坊智能合约中常见的安全罅隙类型, 并还原了智能合约安全罅隙历史上的典型案例. 目下, 研究者们还是提倡了一系列的智能合约罅隙检测方法来检测智能安全罅隙, 本文将现存的智能合约罅隙检测方法归纳归来为体式化考证法、记号实行法、隐隐测试法、中间默示法、深度学习法这5种, 并详实先容和分析了种种方法的旨趣和特征, 对比评估了具有代表性的智能合约自动化检测器具的可检测罅隙类型以及检测性能, 计议分析了现存的智能合约罅隙检测方法的局限性和改造念念路.
智能合约自动化检测方法大约较为准确地、一键式地应酬区块链蚁集中层见叠出的智能合约罅隙类型, 减少了东谈主工核验和大众分析可能变成的误报和罅隙情况, 因此, 领受准确且高效的智能合约自动化检测器具来措置智能合约的罅隙挖掘与检测问题是有曲折真理真理的责任和研究. 本文分析了现存的研究方法, 发目下智能合约安全罅隙检测鸿沟中天然还是取得了打破性进展和令东谈主饱读励的遵循, 但是现阶段的检测方法仍然不够完善, 面对着以下待措置的关键问题.
● 罅隙检测准确率低. 目下, 大多数智能合约检测器具仍然存在很高的误报率和漏报率, 以本文中测试的300个智能合约为例, 在3种智能合约罅隙的检测上, 除了VaaS和TMP的准确率能达到80%以上, 其他3种检测器具的准确率只是刚达到60%左右, 这远不可得志刻下智能合约罅隙类型多、合约数目大的应用场景. 因此, 进步智能合约罅隙检测器具的准确率是刻下边临的关键挑战;
● 罅隙类型秘籍率低. 由于智能合约罅隙类型稠密且复杂, 大多数检测器具无法涵盖整个的罅隙类型. 以本文统计的25种检测器具和15种罅隙类型为例, 其中救援罅隙类型最多的器具是Securify, 大约检测12种安全罅隙类型. 然而大多数检测器具检测类型单一, 且只可考证初级别的安全罅隙, 繁重对合约整个实行过程中的监测和推断, 难以发现跨合约的罅隙问题. 因此, 完善检测器具对智能合约罅隙类型更全面的检测, 亦然亟待措置的关键问题;
● 罅隙审计时候较长. 智能合约罅隙的实时审计亦然保证合约安全的关键要素, 刻下的检测器具罅隙挖掘遵循低, 扼制了智能合约的征战和使用. 举例, Mythril的平均检测时候为225.6 s, VaaS大致为159.4 s, 而ContractFuzzer大致需要352.2 s. 面对着突飞猛进的合约数目, 保证智能合约罅隙检测器具的罅隙审计遵循, 亦然需要措置的难题;
● 罅隙检测统统自动化. 智能合约器具统统自动化是保证罅隙检测遵循的曲折一环. 现存的检测器具还不可作念到统统自动化, 举例体式化考证方法F*和KEVM framework. 此外, 有些“一键式”的检测器具无法明确输出合约是否存在罅隙, 而要对检测出来的疑似罅隙进行手动分类, 举例Securify和Smartcheck, 这极地面增多了智能合约检测过程中的责任量, 裁汰了检测遵循. 因此, 怎样达成更全面的自动化检测过程和有盘算推算, 需要进一步研究;
● 智能合约言语种种性. 现实寰球中的编程言语类型稠密且更替速即, 目下, 救援编写智能合约的言语就有几十种(如Solidity, Go, C, Java), 不同的言语有不同的语法和语义端正. 怎样使智能合约罅隙检测器具大约适配大多数编程言语, 也存在一定的挑战和难度.
天然智能合约罅隙检测现阶段的发展仍然存在许多挑战, 但是也恰逢新的机遇. 跟着深度学习时间的发展, 近几年, 研究东谈主员脱手利用深度学习模子进行智能合约罅隙的检测, 而况取得了可以的进展. 底下计议深度学习和智能合约罅隙检测时间对改日的研究宗旨进行预计, 以供研究探讨.
● 构建统一且表率的智能合约罅隙数据集. 起首, 基于深度学习的智能合约罅隙检测方法大约取得打破性的进展必定依赖于统一且全面的智能合约罅隙数据集. 目下, 恰是因为数据集吃力且不表率, 已有的深度学习方法(如ReChecker, TMP)只可救援少数的合约罅隙检测. 因此, 唯有基于统一表率的、涵盖罅隙类型全的罅隙数据集, 才能让深度学习模子阐明更好的效应, 更好地鼓动该鸿沟的研究;
● 构建基于深度学习的动静态分析综合模子. 现阶段, 基于深度学习的智能合约安全罅隙检测器具刚刚起步(如SaferSC, ReChecker, TMP), 它们在静态的源代码或字节码层面进行分析. 然而, 这种静态的分析方法会遗漏可能存在的实行旅途; 同期, 由于吃力与外部合约动态的交互过程, 不息会导致出现漏报或误报的情况. 因此, 为了应酬大范围应用场景的需求, 可以在构建深度学习模子的时候有筹商计议动态实行和静态分析;
● 构建统一且可延长的深度学习模子. 跟着智能合约数目的爆炸式增长, 相应的安全罅隙类型也越来越复杂且无法预想. 目下, 基于深度学习的智能合约罅隙检测方法仍然在已发掘的罅隙类型构建模子, 其是否大约快速安妥新的罅隙类型还亟待研究. 本文以为: 应充分利用开源生态中丰富的智能合约安全罅隙来构建统一且可延长的深度学习罅隙检测模子, 以应酬层见叠出的智能合约罅隙;
● 构建基于深度学习的可解释性罅隙检测模子. 天然基于深度学习的智能合约罅隙检测模子灵验地进步了罅隙检测的准确率, 但它们仍然存在可解释性差的关键问题, 而况繁重交融大众界说的经典罅隙端正. 因此, 为了使深度学习模子的检测放胆更有劝服力, 本文以为: 深度学习法一方面要进一步交融经典的大众端正, 另一方面要准确地给露马脚检测的可解释性说明;
● 构建统一的罅隙检测器具性能评估体系. 左证还是出现的智能合约安全事件以及关连的合约罅隙审计告诫, 综合有筹商罅隙检测的漏报率、误报率、检测时候、可检测罅隙类型等身分, 最终构建统一的罅隙检测器具性能评价体系, 对已有的关连器具进行对比分析, 以考证其灵验性, 并为新的智能合约罅隙检测器具的研发和改造提供参考与带领.
区块链时间的快速发展, 给智能合约提供了可靠的实行环境. 跟着智能合约普及到种种各样的去中心化应用中新金瓶梅3d, 智能合约的安全问题也变得愈发曲折. 本文梳理了刻下智能合约面对的主要安全罅隙类型, 针对现阶段研究责任中存在的问题给出了建议, 预计了智能合约安全罅隙检测的研究宗旨, 以期大约启发改日的研究责任.