杭州电子科技大学徐向华获国家专利权
买专利卖专利找龙图腾,真高效! 查专利查商标用IPTOP,全免费!专利年费监控用IP管家,真方便!
龙图腾网获悉杭州电子科技大学申请的专利一种以太坊智能合约历史交易的漏洞检测方法获国家发明授权专利权,本发明授权专利权由国家知识产权局授予,授权公告号为:CN117911030B 。
龙图腾网通过国家知识产权局官网在2025-08-12发布的发明授权授权公告中获悉:该发明授权的专利申请号/专利号为:202311795616.8,技术领域涉及:G06Q20/40;该发明授权一种以太坊智能合约历史交易的漏洞检测方法是由徐向华;宋家豪设计研发完成,并于2023-12-25向国家知识产权局提交的专利申请。
本一种以太坊智能合约历史交易的漏洞检测方法在说明书摘要公布了:本发明公开了一种以太坊智能合约历史交易的漏洞检测方法。本发明主要包括以下阶段:1.交易序列处理阶段,此阶段包括交易序列读取,将操作码序列初始化为操作码对象序列,操作码对象的调用次数、调用深度计算,控制流图及执行流图的构建等步骤。2.交易执行阶段,该阶段包括控制流图执行栈的选择,控制流图的执行等步骤。3.交易执行结果分析阶段,此阶段包括获取调用路径,分析各类交易漏洞等步骤。本发明适用于六类以太坊智能合约交易漏洞,根据漏洞检测结果总结出交易漏洞的表现形式。智能合约编写者能够通过交易漏洞攻击形式的反馈,降低智能合约漏洞编写的几率,提高了智能合约的安全性。本发明具有检测效率高,准确率高,可扩展性强等优点。
本发明授权一种以太坊智能合约历史交易的漏洞检测方法在权利要求书中公布了:1.一种以太坊智能合约历史交易的漏洞检测方法,其特征在于包括三个阶段:交易序列处理阶段、交易执行阶段、交易执行结果分析阶段,具体实现步骤如下:1将智能合约交易序列文件作为交易序列预处理阶段的输入,该阶段由两个部分组成:Ⅰ.根据从合约交易序列文件中读取的交易序列,将交易操作码序列初始化为操作码对象序列;Ⅱ.根据第一部分的操作码对象序列构建执行流图,并为执行流图的各个基本块构建对应的控制流图;2在该阶段生成的执行流图及对应的控制流图用于交易执行阶段复现合约历史交易,以及用于交易执行结果分析阶段的调用路径获取;在交易执行阶段,根据交易序列处理阶段所构建的执行流图和控制流图;首先为执行流图的各基本块选择对应的执行栈,以对应的执行栈作为执行环境,在EVM中执行执行流图基本块对应的控制流图;在控制流图执行的过程中保留执行栈中执行的中间状态,执行的中间状态用于交易执行结果分析阶段对交易的漏洞分析;3在交易执行结果分析阶段,首先根据交易序列处理阶段生成的执行流图及控制流图获取交易序列中合约间的调用路径;然后结合调用路径、交易执行阶段生成的执行中间状态以及预定义的漏洞检测规则检测交易潜在的漏洞,最后根据检测结果输出交易漏洞检测报告; 交易序列处理阶段具体实现如下: 1-1.获取交易序列; 从待测试交易序列文件中读取交易的操作码序列OC={oc1,…,oci,…,ocn},表示操作码序列OC有n个操作码;其中,操作码oci表示为三元组形式:pci;opcodei;valuei,三个元素分别代表操作码的pc值、操作码本身以及操作码的运行参数;在读取过程中将操作码oci初始化为操作码对象:[linei,pci,opcodei,valuei,call_depthi,call_numi],其中linei代表操作码oci在操作码序列OC中的行号,call_depthi、call_numi分别代表操作码对应的调用深度及调用次数,将所有操作码oci都初始化为操作码对象后,将操作码对象序列作为输入; 1-2.计算操作码调用深度及调用次数; 遍历步骤1-1中获取的操作码序列OC,遍历过程中操作码的下标定义为i,初始调用次数为0,当遇到操作码对象的pc值为0但当前遍历下标i不为0,调用次数加1;这说明当前交易执行流到了一个新的智能合约;并将对应的调用次数赋值给对应操作码对象的call_numi属性; 遍历过程中每当遇到操作码对象的pc值为0但当前遍历下标i不为0,调用深度加1;当遍历到与调用相关或者与创建相关的操作码本身时进行判断,若当前操作码对象与上一操作码对象的call_numi属性相等且上一操作码本身不为终止类型操作码时;说明当前被调用智能合约还未执行结束因此call_depthi不变,否则代表当前智能合约执行已结束并返回上一级智能合约则call_depthi减1;并将对应的调用深度赋值给对应操作码对象的call_depthi属性; 1-3.执行流图的构建; 执行流图代表交易中智能合约间的调用执行顺序,执行流图的结构为EFGblock={efgblock1,…,efgblocks,…,efgblockS},执行流图基本块的结构为efgblocks:startBlockPCs,endBlockPCs,instrLists,CFGBlockMaps, StackEventss,allCallPaths; 遍历步骤1-1中获取的操作码序列OC,在遍历过程中定义一个布尔值变量start,初始值为true,初始化第一个执行流图基本块后将start置为false; 当遇到与调用相关或者与终止相关的操作码本身时,若当前操作码对象的与上一操作码对象-1的call_num属性不相等且上一操作码对象-1为终止类型操作码时,说明智能合约执行已结束,需生成新的执行流图基本块,将start置为true并初始化一个新的执行流图基本块;初始化一个新的执行流图基本块后将start置为false; 遍历到与调用相关或者与终止相关之外的其他类型操作码时,将操作码对象加入当前执行流图基本块的instrLists属性中,执行流图基本块开始和结束位置的操作码对象的pc值赋值给执行流图基本块的startBlockPCs和endBlockPCs属性作为执行流图基本块的开始和结束位置; 1-4.控制流图的构建 一个执行流图基本块能够构建一个对应的控制流图,根据操作码将控制流图分为四个类型的块,分别为无条件跳转块、条件跳转块、终止块和普通块; 控制流图的结构为CFGblock={cfgblock1,…,cfgblockj,…,cfgblockJ},控制流图基本块的结构为cfgblockj:startBlockPCj,endBlockPcj,instrListj,conditionJumpPosj,conditionJumpExpressionj,unconditionJumpPosj, unconditionJumpExpressionj,jumpTypej,stackj; 按块遍历步骤1-3中获取的执行流图的基本块序列EFGblock,进而遍历各执行流图基本块的instrList,在遍历过程中定义一个布尔值变量start,初始值为true,初始化第一个控制流图基本块后将start置为false; 当遍历到JUMPI操作码时需生成新的控制流图基本块并将start置为true,并将控制流图基本块cfgblockj的jumpType置为1; 遍历到JUMP操作码时需生成新的控制流图基本块并将start置为true,并将控制流图基本块cfgblockij的jumpType置为2; 当遍历到与终止相关操作码时需生成新的控制流图基本块并将start置为true,将控制流图基本块cfgblockij的jumpType置为4; 其余控制流图基本块的jumpType置为3;当遍历到JUMPDEST操作码时说明到了基本块结束位置,将start置为false; 遍历到其他类型操作码时将操作码对象加入当前控制流图基本块的instrList属性中; 基本块开始位置和结束位置的操作码对象的pc值赋值给控制流图基本块的startBlockPCj和endBlockPCj属性;且生成的控制流图需存储至执行流图基本块的CFGBlockMap属性,CFGBlockMap:blockStartPoss,cfgblocks,CFGBlockMap的键为控制流图基本块的startBlockPC,值为控制流图基本块;直至所有执行流图基本块都构建了对应的控制流图; 交易执行阶段具体实现如下: 2-1.控制流图执行栈选择; 首先初始化一个执行栈列表Stack={stack1,…,stacks,…,stackS},用于保存智能合约执行结束的执行栈;执行栈对象的结构为stack:stack,preSrtack.call_depth,属性值分别为当前执行栈与上一执行栈的调用深度;执行栈的调用深度由控制流图基本块中的第一个操作码对象的调用深度赋值; 初始执行栈为一个空栈stack1;遍历执行流图基本块序列,若执行流图基本块的第一个操作码对象的pc值为0的话,意味着执行流到了一个新的被调用智能合约,因此要生成一个新执行栈stacks作为该基本块的执行环境; 继续遍历,若执行流图基本块第一个操作码对象为调用类或创建类操作码;说明上一调用已结束,返回上一个调用结束的执行栈stacks-1,判断stacks-1与当前执行流图基本块第一个操作码的call_depths是否相等,若相等则使用stacks-1作为当前基本块的执行栈;若不等则返回stacks-2作为当前被调用智能合约的执行栈; 选取执行栈后,进行步骤2-2控制流图执行,执行完毕后进行判断,若执行流图基本块的第一个操作码对象的pc值为0且最后一个操作码对象类型不为终止类型,将执行栈加入至执行栈列表Stack中,此情况对应了当前被调用的新智能合约还未执行结束; 若执行流图基本块的第一个操作码对象为创建类型且最后一个操作码对象类型不为终止类型,将执行栈加入至执行栈列表Stack中,此情况对应了早先被调用智能合约还未执行结束,因此执行栈都还需保留; 2-2.控制流图执行; 控制流图的执行顺序由基本块类型决定,其中条件跳转块的下一个执行基本块由该基本块的conditionJumpPos决定,下一个执行基本块为执行流图的CFGBlockMap中键为conditionJumpPos的基本块;无条件跳转块及终止块的执行顺序与条件跳转块同理,普通块则顺序执行下一控制流图基本块; 遍历执行流图,执行每个执行流图基本块在步骤1-4时构建的控制流图;主要执行部分为控制流图基本块中的instrList属性,instrList中包含了多个操作码对象,根据操作码本身的执行逻辑,在EVM中执行,根据操作码在执行栈的操作生成opcode_log,opcode_log代表了该操作码在执行栈内操作的执行状态; opcode_log的表达形式为pc:opcode→pc→value_pc,pc为操作码pc值、opcode表示操作码本身、value_pc表示操作码操作值; 所有opcode_log被保存至执行流图的StackEvents属性中作为交易执行分析阶段的漏洞检测依据,其中JUMPI操作码以及JUMP操作码相关的opcode_log分别作为conditionJumpExpression和unconditionJumpExpression,并赋值给控制流图基本块中的对应属性;conditionJumpExpression和 unconditionJumpExpression中包含的操作码代表该操作码与JUMPJUMPI操作码有依赖关系; 交易结果分析阶段具体实现如下: 3-1获取调用路径 根据构建的执行流图与控制流图获取调用路径;调用路径指包含CALL操作码的控制流图基本块执行路径,交易中有部分漏洞由CALL操作码触发,因此针对部分漏洞直接检测调用路径能够极大提高检测的效率; 控制流图的基本块拥有基本块类型属性,基本块类型决定了块之间的执行顺序,按照基本块的执行顺序遍历控制流图,若执行路径中的基本块的instrList属性中包含CALL操作码那么则将该条执行路径定义为调用路径,并将此调用路径赋值给对应执行流图基本块的allCallPath属性; 3-2交易漏洞检测 交易漏洞检测的检测部分为控制流图执行后生成的StackEvents以及获得的调用路径,然后通过检测规则检测合约执行的调用路径中依赖关系,检测发现漏洞。
如需购买、转让、实施、许可或投资类似专利技术,可联系本专利的申请人或专利权人杭州电子科技大学,其通讯地址为:310018 浙江省杭州市下沙高教园区2号大街;或者联系龙图腾网官方客服,联系龙图腾网可拨打电话0551-65771310或微信搜索“龙图腾网”。
1、本报告根据公开、合法渠道获得相关数据和信息,力求客观、公正,但并不保证数据的最终完整性和准确性。
2、报告中的分析和结论仅反映本公司于发布本报告当日的职业理解,仅供参考使用,不能作为本公司承担任何法律责任的依据或者凭证。