CN117688564B - 一种用于智能合约事件日志的检测方法、装置和存储介质 - Google Patents
一种用于智能合约事件日志的检测方法、装置和存储介质 Download PDFInfo
- Publication number
- CN117688564B CN117688564B CN202410138372.4A CN202410138372A CN117688564B CN 117688564 B CN117688564 B CN 117688564B CN 202410138372 A CN202410138372 A CN 202410138372A CN 117688564 B CN117688564 B CN 117688564B
- Authority
- CN
- China
- Prior art keywords
- event
- solidity
- codes
- code
- determining
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000003860 storage Methods 0.000 title claims abstract description 28
- 238000001514 detection method Methods 0.000 title claims abstract description 19
- 238000000034 method Methods 0.000 claims abstract description 49
- 238000005457 optimization Methods 0.000 claims abstract description 9
- 230000006870 function Effects 0.000 claims description 39
- 238000007781 pre-processing Methods 0.000 claims description 14
- 230000008569 process Effects 0.000 claims description 13
- 230000011218 segmentation Effects 0.000 claims description 11
- 238000004458 analytical method Methods 0.000 claims description 10
- 230000003068 static effect Effects 0.000 claims description 4
- 238000010586 diagram Methods 0.000 description 13
- 238000004891 communication Methods 0.000 description 6
- 238000012545 processing Methods 0.000 description 4
- 230000008878 coupling Effects 0.000 description 3
- 238000010168 coupling process Methods 0.000 description 3
- 238000005859 coupling reaction Methods 0.000 description 3
- 238000002372 labelling Methods 0.000 description 3
- 238000012360 testing method Methods 0.000 description 3
- 239000002699 waste material Substances 0.000 description 3
- 230000009286 beneficial effect Effects 0.000 description 2
- 230000008859 change Effects 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 238000013507 mapping Methods 0.000 description 2
- 239000000523 sample Substances 0.000 description 2
- 238000013475 authorization Methods 0.000 description 1
- 238000004590 computer program Methods 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 230000002708 enhancing effect Effects 0.000 description 1
- 230000003993 interaction Effects 0.000 description 1
- 238000005339 levitation Methods 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000002688 persistence Effects 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
- 230000003245 working effect Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/55—Detecting local intrusion or implementing counter-measures
- G06F21/56—Computer malware detection or handling, e.g. anti-virus arrangements
- G06F21/566—Dynamic detection, i.e. detection performed at run-time, e.g. emulation, suspicious activities
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/55—Detecting local intrusion or implementing counter-measures
- G06F21/56—Computer malware detection or handling, e.g. anti-virus arrangements
- G06F21/562—Static detection
- G06F21/563—Static detection by source code analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06Q—INFORMATION AND COMMUNICATION TECHNOLOGY [ICT] SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES; SYSTEMS OR METHODS SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES, NOT OTHERWISE PROVIDED FOR
- G06Q20/00—Payment architectures, schemes or protocols
- G06Q20/38—Payment protocols; Details thereof
- G06Q20/40—Authorisation, e.g. identification of payer or payee, verification of customer or shop credentials; Review and approval of payers, e.g. check credit lines or negative lists
- G06Q20/401—Transaction verification
- G06Q20/4016—Transaction verification involving fraud or risk level assessment in transaction processing
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Computer Hardware Design (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Business, Economics & Management (AREA)
- Health & Medical Sciences (AREA)
- Accounting & Taxation (AREA)
- General Health & Medical Sciences (AREA)
- Virology (AREA)
- General Business, Economics & Management (AREA)
- Strategic Management (AREA)
- Finance (AREA)
- Debugging And Monitoring (AREA)
Abstract
本申请涉及计算机技术领域,公开一种用于智能合约事件日志的检测方法、装置和存储介质,该方法包括:获取目标合约;目标合约采用Solidity语言编译;对目标合约的Solidity代码进行分析,确定Solidity代码的事件问题状态;事件问题状态包括Solidity代码中存在需要优化变量的事件、Solidity代码的事件使用频率大于使用频率阈值、Solidity代码中存在参数信息错误的事件、Solidity代码中存在冗余事件、Solidity代码中存在已使用的调试事件,以及Solidity代码中存在调用位置错误的事件中的至少一种;基于事件问题状态,输出提醒信息。这样可使开发人员及时发现事件的问题。
Description
技术领域
本申请涉及计算机技术领域,例如涉及一种用于智能合约事件日志的检测方法、装置和存储介质。
背景技术
智能合约,是一种图灵完备程序,在以太坊虚拟机(Ethereum Virtual Machine,EVM)中以EVM字节码的形式运行。具体来说,智能合约可以采用Solidity语言(一种编程语言)进行编程,该种语言的智能合约先被编译成EVM字节码,再由EVM在区块链上执行。
进一步地,在Solidity的编程过程中,可以通过事件功能来实现日志的记录。但是,当前的Solidity代码中的事件在使用时存在问题,若开发人员没有及时避免,则会导致gas费用(一种在以太坊区块链上执行特定操作时需要支付的成本)的浪费,甚至会增加合约账户的财产损失风险。
在实现本公开实施例的过程中,发现相关技术中至少存在如下问题:
当前的Solidity代码中的事件在使用时存在问题,若开发人员没有及时避免,则会导致gas费用的浪费,甚至会增加合约账户的财产损失风险。
需要说明的是,在上述背景技术部分公开的信息仅用于加强对本申请的背景的理解,因此可以包括不构成对本领域普通技术人员已知的现有技术的信息。
发明内容
为了对披露的实施例的一些方面有基本的理解,下面给出了简单的概括。所述概括不是泛泛评述,也不是要确定关键/重要组成元素或描绘这些实施例的保护范围,而是作为后面的详细说明的序言。
本公开实施例提供了一种用于智能合约事件日志的检测方法、装置和存储介质,以检测当前的Solidity代码中的事件在使用时存在的问题并及时提醒,避免gas费用的浪费,降低合约账户的财产损失风险。
在一些实施例中,所述用于智能合约事件日志的检测方法包括:
获取目标合约;所述目标合约采用Solidity语言编译;
对所述目标合约的Solidity代码进行分析,确定所述Solidity代码的事件问题状态;所述事件问题状态包括所述Solidity代码中存在需要优化变量的事件、所述Solidity代码的事件使用频率大于使用频率阈值、所述Solidity代码中存在参数信息错误的事件、所述Solidity代码中存在冗余事件、所述Solidity代码中存在已使用的调试事件,以及所述Solidity代码中存在调用位置错误的事件中的至少一种;
基于所述事件问题状态,输出提醒信息。
在一些实施例中,所述用于智能合约事件日志的检测装置,包括处理器和存储有程序指令的存储器,所述处理器被配置为在运行所述程序指令时,执行上述的用于智能合约事件日志的检测方法。
在一些实施例中,所述存储介质,存储有程序指令,所述程序指令在运行时,执行上述的用于智能合约事件日志的检测方法。
本公开实施例提供的一种用于智能合约事件日志的检测方法、装置和存储介质,可以实现以下技术效果:
获取采用Solidity语言编译的目标合约之后,可以对目标合约的Solidity代码进行分析,确定Solidity代码的事件问题状态。其中,事件问题状态可以包括Solidity代码中存在需要优化变量的事件、Solidity代码的事件使用频率大于使用频率阈值、Solidity代码中存在参数信息错误的事件、Solidity代码中存在冗余事件、Solidity代码中存在已使用的调试事件,以及Solidity代码中存在调用位置错误的事件中的至少一种。而后,可以基于事件问题状态,输出提醒信息。如此一来,即可从上述六种事件问题状态的角度对Solidity代码进行分析,以对Solidity代码中的事件进行检测,及时发现其中存在的问题,并通过输出提醒消息的方式及时告知开发人员,从而尽可能地避免gas费用的浪费,降低合约账户的财产损失风险。
以上的总体描述和下文中的描述仅是示例性和解释性的,不用于限制本申请。
附图说明
一个或多个实施例通过与之对应的附图进行示例性说明,这些示例性说明和附图并不构成对实施例的限定,附图中具有相同参考数字标号的元件示为类似的元件,附图不构成比例限制,并且其中:
图1是本公开实施例提供的一个用于智能合约事件日志的检测方法的示意图;
图2是本公开实施例提供的一个用于确定Solidity代码的事件问题状态的方法的示意图;
图3是本公开实施例提供的另一个用于确定Solidity代码的事件问题状态的方法的示意图;
图4是本公开实施例提供的另一个用于确定Solidity代码的事件问题状态的方法的示意图;
图5是本公开实施例提供的另一个用于确定Solidity代码的事件问题状态的方法的示意图;
图6是本公开实施例提供的另一个用于确定Solidity代码的事件问题状态的方法的示意图;
图7是本公开实施例提供的另一个用于确定Solidity代码的事件问题状态的方法的示意图;
图8是本公开实施例提供的一个用于智能合约事件日志的检测装置的示意图。
具体实施方式
为了能够更加详尽地了解本公开实施例的特点与技术内容,下面结合附图对本公开实施例的实现进行详细阐述,所附附图仅供参考说明之用,并非用来限定本公开实施例。在以下的技术描述中,为方便解释起见,通过多个细节以提供对所披露实施例的充分理解。然而,在没有这些细节的情况下,一个或多个实施例仍然可以实施。在其他情况下,为简化附图,熟知的结构和装置可以简化展示。
本公开实施例的说明书和权利要求书及上述附图中的术语“第一”“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本公开实施例的实施例。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含。
除非另有说明,术语“多个”表示两个或两个以上。
本公开实施例中,字符“/”表示前后对象是一种“或”的关系。例如,A/B表示:A或B。
术语“和/或”是一种描述对象的关联关系,表示可以存在三种关系。例如,A和/或B,表示:A或B,或,A和B这三种关系。
术语“对应”可以指的是一种关联关系或绑定关系,A与B相对应指的是A与B之间是一种关联关系或绑定关系。
本公开实施例不限定该用于智能合约事件日志的检测方法的执行主体,例如,本公开实施例的用于智能合约事件日志的检测方法可以应用于终端设备或服务器等数据处理设备。其中,终端设备是指具有无线连接功能的电子设备,在一些实施例中,终端设备例如为移动设备、电脑,或悬浮车中内置的车载设备等,或其任意组合。移动设备例如可以包括手机、智能家居设备、可穿戴设备、智能移动设备、虚拟现实设备等,或其任意组合,其中,可穿戴设备例如包括:智能手表、智能手环、计步器等。
结合图1所示,本公开实施例提供一种用于智能合约事件日志的检测方法,包括:
S101,获取目标合约。
其中,目标合约采用Solidity语言编译。
S102,对目标合约的Solidity代码进行分析,确定Solidity代码的事件问题状态。
在本公开实施例中,事件问题状态包括Solidity代码中存在需要优化变量的事件、Solidity代码的事件使用频率大于使用频率阈值、Solidity代码中存在参数信息错误的事件、Solidity代码中存在冗余事件、Solidity代码中存在已使用的调试事件,以及Solidity代码中存在调用位置错误的事件中的至少一种。
S103,基于事件问题状态,输出提醒信息。
在本公开实施例中,为了便于理解,可以分别结合附图对上述六种事件问题状态的确定过程及提醒信息的输出,进行示例性地说明。
具体来说,结合图2所示,针对Solidity代码中存在需要优化变量的事件这一事件问题状态的确定过程,也就是步骤S102,其具体可以包括步骤21A-步骤24A:
步骤21A:对Solidity代码进行分词,得到分词代码。
在实际应用中,可以以空格、换行符作为分隔符对Solidity代码进行分词,并对Solidity代码中的标点进行过滤,得到分词代码。
步骤22A:对分词代码进行词性标注,得到分词标注结果。
具体来说,在本公开实施例中,可以预先设置建立语料库,并由语料库存储Solidity代码的词性类型。例如,词性类型可以包括关键字、状态变量、局部变量、事件名、函数名及类名。如此,即可依据词性类型对上述分词代码进行词性标注,得到分词标注结果。
步骤23A:基于分词标注结果,从Solidity代码中确定第一事件。
第一事件包括状态变量;状态变量以storage类型存储。在实际应用中,由于storage类型的变量消耗的gas多于memory类型的局部变量,因此,可以基于上述分词标注结果,识别Solidity代码中涉及storage类型的状态变量的事件作为第一事件,以便于后续针对该消耗gas高的第一事件进行处理。
步骤24A:若第一事件所在的第一函数包括局部变量,且状态变量和局部变量的值相同,则确定事件问题状态为Solidity代码中存在需要优化变量的事件。
这里,局部变量以memory类型存储。由于memory类型的局部变量消耗的gas低于storage类型的状态变量,因此,当第一函数包括局部变量,且状态变量和局部变量的值相同时,则可以确定Solidity代码中存在需要优化变量的事件,也就是第一事件中的状态变量需要被优化。
基于上述步骤21A-步骤24A,在本公开实施例中,基于事件问题状态输出的提醒信息,具体可以包括:用于指示可进行变量优化的警告信息、识别出的第一事件的状态变量的信息,以及可替换该状态变量的局部变量的信息。
进一步地,在输出提醒消息之后,该用于智能合约事件日志的检测方法还可以包括:将第一事件中以storage类型存储的状态变量替换为以memory类型存储的局部变量。前面提到,memory类型存储的局部变量消耗的gas低于storage类型存储的状态变量,并且,由于状态变量和局部变量的值相同,因此以局部变量替换状态变量不会改变状态变量的定义和取值,也不会影响状态变量在区块链上的持久性。因此,通过变量替换可以节省数据资源。
结合图3所示,针对Solidity代码的事件使用量大于使用量阈值这一事件问题状态的确定过程,也就是步骤S102,其具体可以包括步骤21B-步骤23B:
步骤21B:对Solidity代码进行预处理,得到预处理代码。
在实际应用中,预处理用于去除Solidity代码中的停用部分,停用部分包括Solidity代码中的注释和/或空行。
步骤22B:对预处理代码进行词频分析,得到预处理代码中的事件使用量。
具体来说,在本公开实施例中,可以先计算预处理代码的总行数,再对预处理代码进行分词,并对分词后的预处理代码进行词频分析,得到事件被调用的次数。接着,基于事件被调用的次数和预处理代码的总行数,可以确定事件在每行预处理代码中的平均出现次数,作为事件使用频率。其中,由于在Solidity代码中,“emit”关键字后跟随的是事件名,因此,可以通过统计关键字“emit”的出现次数确定事件的被调用次数。另外,事件使用频率,可以通过事件的出现次数除以预处理代码的总行数得到。
步骤23B:若事件使用频率大于使用频率阈值,则确定事件问题状态为Solidity代码的事件使用频率大于使用频率阈值。
在本公开实施例中,发明人经过创造性地研究发现,事件使用频率的平均值为0.022,因此,在实际应用中,使用频率阈值的取值范围可以为0.03~0.06,优选为0.05。
基于上述步骤21B-步骤23B,在本公开实施例中,基于事件问题状态输出的提醒信息,具体可以包括:用于指示事件过度使用的警告信息。尽管事件是与其它***交互的有效实现方式,但同时它也使用了大量资源,并对合约的工作效果产生较大影响,因此,在本公开实施例中通过事件过度警告的方式,可以及时告知开发人员谨慎使用事件,从而避免资源浪费。
结合图4所示,针对Solidity代码中存在传入的参数信息存在错误的事件这一事件问题状态的确定过程,也就是步骤S102,其具体可以包括步骤21C-步骤24C:
步骤21C:对Solidity代码进行静态代码分析,得到目标合约的抽象语法树。
在实际应用中,对Solidity代码进行静态代码分析的实现过程可以采用现有的或者未来可能出现的任一种静态代码分析算法,此处不做具体限定。
步骤22C:根据抽象语法树中的函数声明,确定参数数量大于或等于数量阈值的第二事件,并获取第二事件传入的参数信息。
这里,数量阈值可以为3,从而避免参数数量较少导致的偶然性概率。参数信息可以包括参数名和参数值。
步骤23C:从抽象语法树中的函数中,获取与第二事件被调用时的参数数量相同的第二函数。
步骤24C:若第二事件被调用时的任一参数的参数信息和第二函数的参数信息不同,且除任一参数之外的其他参数的参数信息和第二函数的参数信息相同,则确定事件问题状态为Solidity代码中存在参数信息错误的事件。
如此,通过确定出参数数量大于或等于3的第二事件,并获取第二事件传入的参数名和参数值,有助于后续尽可能地定位到具体的函数。当第二事件和第二函数的参数信息不同时,说明存在参数错误。
基于上述步骤21C-步骤24C,在本公开实施例中,基于事件问题状态输出的提醒信息,具体可以包括:用于指示参数信息错误的警告信息,以及第二事件和第二函数的相关信息。在调用事件时,传入的错误参数如果与定义时的参数类型一致,编译器无法发现参数信息的错误。而在智能合约部署后错误很难更改,因此,通过检测传入参数错误并警告的方式,可以及时告知开发人员,从而有助于尽可能地降低合约漏洞的风险。
结合图5所示,针对Solidity代码中存在冗余事件这一事件问题状态的确定过程,也就是步骤S102,其具体可以包括步骤21D-步骤22D:
步骤21D:针对Solidity代码中被调用的第三事件,从Solidity代码包括的除第三事件之外的被调用事件中,确定包含第三事件所有参数的第***。
具体来说,第***的数量可以为1个也可以为多个。第***包含第三事件所有参数,可以指二者的参数相同,或,第***的参数包含第三事件的参数。基于此,在本公开实施例中,针对第三事件,可以在Solidity代码中查询是否存在其他被调用事件的参数包括该第三事件的参数,若存在,即可将该事件确定为第***。此外,由于别名分析算法是一种用于识别程序变量名称集的技术,这些名称集在程序执行期间可能会引起相同的内存位置,而内存位置相同的参数也可以视为相同参数,因此,在本公开实施例中,还可以进一步通过别名分析算法对第三事件的参数进行分析,确定内存位置相同的参数,并进一步基于内存位置相同的参数确定对应的第***。
步骤22D:当第三事件的参数值和第***中对应的参数值相同,确定事件问题状态为Solidity代码中存在冗余事件。
前面提到,第***包含第三事件,因此,当第三事件的参数值和第***的参数值也相同时,可以说明对于第***而言,第三事件为冗余事件。
基于上述步骤21D-步骤22D,在本公开实施例中,基于事件问题状态输出的提醒信息,具体可以包括:用于指示存在冗余事件的警告信息,以及第三事件和第***的相关信息。由于第三事件为冗余事件,其被第***所包含,且参数值也相同,因此,通过检测冗余事件并警告的方式,可以及时告知开发人员,从而有助于尽快取消冗余事件的调用,以减少数据资源的消耗。
结合图6所示,针对Solidity代码中存在已使用的调试事件这一事件问题状态的确定过程,也就是步骤S102,其具体可以包括步骤21E-步骤22E:
步骤21E:对Solidity代码进行分析,确定Solidity代码中是否存在第五事件、第六事件和第七事件中的至少一个。
其中,第五事件为空事件;第六事件为在不同位置被调用且记录相同变量的事件;第七事件为包括字符串参数的事件,且字符串参数包括预设关键词。在实际应用中,开发人员可以采用事件来进行调试,调试事件的形式,可以体现为空事件、在不同位置被调用且记录相同变量的事件,或者,包括字符串参数的事件,且字符串参数包括预设关键词,也就是第五事件、第六事件和第七事件中的至少一个。在实际应用中,预设关键词可以体现为“debugging”、“test”和“help”中的至少一个。
步骤22E:若Solidity代码中存在第五事件、第六事件和第七事件中的至少一个,则确定事件问题状态为Solidity代码中存在已使用的调试事件。
基于上述内容可知,当Solidity代码中存在第五事件、第六事件和第七事件中的至少一个,可以说明开发人员在调试Solidity代码后未删除已使用的调试事件。
基于上述步骤21E-步骤22E,在本公开实施例中,基于事件问题状态输出的提醒信息,具体可以包括:用于指示Solidity代码中已使用的调试事件的警告信息。开发人员在使用事件进行代码调试后,若不及时删除不再需要的调试事件,则会对代码的可读性产生负面影响,并导致多余的数据资源消耗,因此,通过检测Solidity代码中已使用的调试事件并警告的方式,可以及时告知开发人员,从而有助于开发人员尽快删除已使用的调试事件,以减少数据资源的消耗。
结合图7所示,针对Solidity代码中存在调用位置错误的事件这一事件问题状态的确定过程,也就是步骤S102,其具体可以包括步骤21F-24F:
步骤21F:在Solidity代码的运行过程中,获取Solidity代码的执行路径和操作码。
在本公开实施例中,为了使Solidity代码运行,可以先使用Anvil(一种区块链运行工具)构建本地区块链的网络测试环境,并在网络测试环境中部署该目标合约。接着,可以为目标合约的函数随机生成有效的输入。具体来说,可以先编译该目标合约,生成其应用二进制接口(Application Binary Interface,ABI)对应的JSON格式文件,再通过解析该ABI文件,得到其中的函数描述和参数的数据类型,而后根据Solidity官方文档确定各数据类型的参数的输入域。
举例来说,针对固定长度的数据类型的参数,例如是int、uint、bytes和固定数组类型的参数,可以在其有效的输入域内随机生成输入。
对于非固定长度的数据类型的参数,例如是string类型的参数,可以先随机生成有效范围内的正整数作为长度,再随机生成该长度的字符串作为输入。
对于address类型的参数,则需要进行ABI函数特征分析,也就是提取ABI中声明的所有函数签名,再计算每个函数签名的函数选择器,即函数签名的前四字节的Keccak哈希(SHA-3),以确定每个公共ABI函数所使用的函数选择器。接下来,可以构建并存储一个映射,该映射以函数选择器作为键,具有相同函数选择器的所有智能合约的地址作为值。通过此映射,对于每个函数选择器,可以以搜索映射的方式找到支持该函数选择器的所有智能合约地址,并由此为智能合约的每个ABI函数的address数据类型的参数生成随机输入。
步骤22F:在Solidity代码中的第八事件被调用后,通过执行路径和操作码,检测第八事件传入的变量是否被重新赋值。
这里,第八事件即为Solidity代码中的任一事件。在本公开实施例中,可以采用程序打桩技术,使用分支覆盖探针和条件覆盖探针来获取执行路径,并监测该目标合约在EVM上执行时的操作码,以在第八事件被调用后,检测第八事件传入的变量是否被重新赋值。
步骤23F:若第八事件传入的变量被重新赋值,则检测Solidity代码中是否存在用于记录第八事件的重新赋值结果的第九事件。
在实际应用中,事件通常是在完成某项操作之后被调用,例如是用来记录交易、赋值或授权等信息。基于此,通过检测第九事件,也就是用于记录被重新赋值的变量的事件,可以判断出事件是否在对应操作被执行之后再次调用。
步骤24F:若Solidity代码中不存在第九事件,则确定事件问题状态为Solidity代码中存在调用位置错误的事件。
若不存在第九事件,则可以说明第八事件在被调用后,虽然被重新赋值但未被再次调用,也就是其调用位置错误。
基于上述步骤21F-步骤24F,在本公开实施例中,基于事件问题状态输出的提醒信息,具体可以包括:用于指示Solidity代码中存在调用位置错误的警告信息。如此,通过检测事件的调用位置错误并警告的方式,可以及时告知开发人员,从而有助于尽可能地降低合约漏洞的风险。
采用本公开实施例提供的一种用于智能合约事件日志的检测方法,获取采用Solidity语言编译的目标合约之后,可以对目标合约的Solidity代码进行分析,确定Solidity代码的事件问题状态。其中,事件问题状态可以包括Solidity代码中存在需要优化变量的事件、Solidity代码的事件使用频率大于使用频率阈值、Solidity代码中存在参数信息错误的事件、Solidity代码中存在冗余事件、Solidity代码中存在已使用的调试事件,以及Solidity代码中存在调用位置错误的事件中的至少一种。而后,可以基于事件问题状态,输出提醒信息。如此一来,即可从上述六种事件问题状态的角度对Solidity代码进行分析,以对Solidity代码中的事件进行检测,及时发现其中存在的问题,并通过输出提醒消息的方式及时告知开发人员,从而尽可能地避免数据资源的浪费,降低合约账户的财产损失风险。
结合图8所示,本公开实施例提供一种用于智能合约事件日志的检测装置300,包括处理器(processor)304和存储器(memory)301。可选地,该装置还可以包括通信接口(Communication Interface)302和总线303。其中,处理器304、通信接口302、存储器301可以通过总线303完成相互间的通信。通信接口302可以用于信息传输。处理器304可以调用存储器301中的逻辑指令,以执行上述实施例的用于智能合约事件日志的检测方法。
此外,上述的存储器301中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。
存储器301作为一种计算机可读存储介质,可用于存储软件程序、计算机可执行程序,如本公开实施例中的方法对应的程序指令/模块。处理器304通过运行存储在存储器301中的程序指令/模块,从而执行功能应用以及数据处理,即实现上述实施例中用于智能合约事件日志的检测方法。
存储器301可包括存储程序区和存储数据区,其中,存储程序区可存储操作***、至少一个功能所需的应用程序;存储数据区可存储根据终端设备的使用所创建的数据等。此外,存储器301可以包括高速随机存取存储器,还可以包括非易失性存储器。
本公开实施例提供了一种计算机可读存储介质,存储有计算机可执行指令,所述计算机可执行指令设置为执行上述用于智能合约事件日志的检测方法。
上述的计算机可读存储介质可以是暂态计算机可读存储介质,也可以是非暂态计算机可读存储介质。
本公开实施例的技术方案可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括一个或多个指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本公开实施例所述方法的全部或部分步骤。而前述的存储介质可以是非暂态存储介质,包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等多种可以存储程序代码的介质,也可以是暂态存储介质。
以上描述和附图充分地示出了本公开的实施例,以使本领域的技术人员能够实践它们。其他实施例可以包括结构的、逻辑的、电气的、过程的以及其他的改变。实施例仅代表可能的变化。除非明确要求,否则单独的部件和功能是可选的,并且操作的顺序可以变化。一些实施例的部分和特征可以被包括在或替换其他实施例的部分和特征。而且,本申请中使用的用词仅用于描述实施例并且不用于限制权利要求。如在实施例以及权利要求的描述中使用的,除非上下文清楚地表明,否则单数形式的“一个”(a)、“一个”(an)和“所述”(the)旨在同样包括复数形式。类似地,如在本申请中所使用的术语“和/或”是指包含一个或一个以上相关联的列出的任何以及所有可能的组合。另外,当用于本申请中时,术语“包括”(comprise)及其变型“包括”(comprises)和/或包括(comprising)等指陈述的特征、整体、步骤、操作、元素,和/或组件的存在,但不排除一个或一个以上其他特征、整体、步骤、操作、元素、组件和/或这些的分组的存在或添加。在没有更多限制的情况下,由语句“包括一个…”限定的要素,并不排除在包括所述要素的过程、方法或者设备中还存在另外的相同要素。本文中,每个实施例重点说明的可以是与其他实施例的不同之处,各个实施例之间相同相似部分可以互相参见。对于实施例公开的方法、产品等而言,如果其与实施例公开的方法部分相对应,那么相关之处可以参见方法部分的描述。
本领域技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件,或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,可以取决于技术方案的特定应用和设计约束条件。所述技术人员可以对每个特定的应用来使用不同方法以实现所描述的功能,但是这种实现不应认为超出本公开实施例的范围。所述技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的***、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
本文所披露的实施例中,所揭露的方法、产品(包括但不限于装置、设备等),可以通过其他的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,可以仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个***,或一些特征可以忽略,或不执行。另外,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其他的形式。所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例。另外,在本公开实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
附图中的流程图和框图显示了根据本公开实施例的***、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这可以依所涉及的功能而定。在附图中的流程图和框图所对应的描述中,不同的方框所对应的操作或步骤也可以以不同于描述中所披露的顺序发生,有时不同的操作或步骤之间不存在特定的顺序。例如,两个连续的操作或步骤实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这可以依所涉及的功能而定。框图和/或流程图中的每个方框,以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的***来实现,或者可以用专用硬件与计算机指令的组合来实现。
Claims (9)
1.一种用于智能合约事件日志的检测方法,其特征在于,包括:
获取目标合约;所述目标合约采用Solidity语言编译;
对所述目标合约的Solidity代码进行分析,确定所述Solidity代码的事件问题状态;所述事件问题状态包括所述Solidity代码中存在需要优化变量的事件、所述Solidity代码的事件使用频率大于使用频率阈值、所述Solidity代码中存在参数信息错误的事件、所述Solidity代码中存在冗余事件、所述Solidity代码中存在已使用的调试事件,以及所述Solidity代码中存在调用位置错误的事件中的至少一种;
基于所述事件问题状态,输出提醒信息;
其中,所述对所述目标合约的Solidity代码进行分析,确定所述Solidity代码的事件问题状态,包括:
对所述Solidity代码进行分词,得到分词代码;
对所述分词代码进行词性标注,得到分词标注结果;
基于所述分词标注结果,从所述Solidity代码中确定第一事件;所述第一事件被调用时的参数包括状态变量;所述状态变量以storage类型存储;
若所述第一事件所在的第一函数包括局部变量,且所述状态变量和所述局部变量的值相同,则确定所述事件问题状态为所述Solidity代码中存在需要优化变量的事件;所述局部变量以memory类型存储。
2.根据权利要求1所述的检测方法,其特征在于,所述对所述目标合约的Solidity代码进行分析,确定所述Solidity代码的事件问题状态,还包括:
对所述Solidity代码进行预处理,得到预处理代码;所述预处理用于去除所述Solidity代码中的停用部分,所述停用部分包括所述Solidity代码中的注释和/或空行;
对所述预处理代码进行词频分析,得到所述预处理代码中的事件使用频率;
若所述事件使用频率大于使用频率阈值,则确定所述事件问题状态为所述Solidity代码的事件使用频率大于使用频率阈值。
3.根据权利要求1所述的检测方法,其特征在于,所述对所述目标合约的Solidity代码进行分析,确定所述Solidity代码的事件问题状态,还包括:
对所述Solidity代码进行静态代码分析,得到所述目标合约的抽象语法树;
根据所述抽象语法树中的函数声明,确定参数数量大于或等于数量阈值的第二事件,并获取所述第二事件传入的参数信息;
基于所述抽象语法树,确定Solidity代码中与所述第二事件被调用时的参数数量相同的第二函数;
若所述第二事件被调用时的任一参数的参数信息和所述第二函数的参数信息不同,且除所述任一参数之外的其他参数的参数信息和所述第二函数的参数信息相同,则确定所述事件问题状态为所述Solidity代码中存在参数信息错误的事件。
4.根据权利要求1所述的检测方法,其特征在于,所述对所述目标合约的Solidity代码进行分析,确定所述Solidity代码的事件问题状态,还包括:
针对Solidity代码中被调用的第三事件,从所述Solidity代码包括的除所述第三事件之外的被调用事件中,确定包含所述第三事件所有参数的第***;
当所述第三事件的参数值和所述第***中对应参数值相同,确定所述事件问题状态为所述Solidity代码中存在冗余事件。
5.根据权利要求1所述的检测方法,其特征在于,所述对所述目标合约的Solidity代码进行分析,确定所述Solidity代码的事件问题状态,还包括:
对所述Solidity代码进行分析,确定所述Solidity代码中是否存在第五事件、第六事件和第七事件中的至少一个;所述第五事件为空事件;所述第六事件为在不同位置被调用且记录相同变量的事件;所述第七事件为包括字符串参数的事件,且所述字符串参数包括预设关键词;
若所述Solidity代码中存在第五事件、第六事件和第七事件中的至少一个,则确定所述事件问题状态为所述Solidity代码中存在所述已使用的调试事件。
6.根据权利要求1所述的检测方法,其特征在于,所述对所述目标合约的Solidity代码进行分析,确定所述Solidity代码的事件问题状态,还包括:
在所述Solidity代码的运行过程中,获取所述Solidity代码的执行路径和操作码;
在所述Solidity代码中的第八事件被调用后,通过所述执行路径和所述操作码,检测所述第八事件传入的变量是否被重新赋值;
若所述第八事件传入的变量被重新赋值,则检测所述Solidity代码中是否存在用于记录所述第八事件的重新赋值结果的第九事件;
若所述Solidity代码中不存在所述第九事件,则确定所述事件问题状态为所述Solidity代码中存在调用位置错误的事件。
7.根据权利要求1所述的检测方法,其特征在于,所述基于所述事件问题状态,输出提醒信息之后,所述方法还包括:
将所述第一事件中以storage类型存储的状态变量替换为以memory类型存储的局部变量。
8.一种用于智能合约事件日志的检测装置,包括处理器和存储有程序指令的存储器,其特征在于,所述处理器被配置为在运行所述程序指令时,执行如权利要求1至7任一项所述的用于智能合约事件日志的检测方法。
9.一种存储介质,存储有程序指令,其特征在于,所述程序指令在运行时,执行如权利要求1至7任一项所述的用于智能合约事件日志的检测方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202410138372.4A CN117688564B (zh) | 2024-02-01 | 2024-02-01 | 一种用于智能合约事件日志的检测方法、装置和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202410138372.4A CN117688564B (zh) | 2024-02-01 | 2024-02-01 | 一种用于智能合约事件日志的检测方法、装置和存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN117688564A CN117688564A (zh) | 2024-03-12 |
CN117688564B true CN117688564B (zh) | 2024-05-03 |
Family
ID=90135646
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202410138372.4A Active CN117688564B (zh) | 2024-02-01 | 2024-02-01 | 一种用于智能合约事件日志的检测方法、装置和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117688564B (zh) |
Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102012991A (zh) * | 2010-11-09 | 2011-04-13 | 北京神舟航天软件技术有限公司 | 基于静态分析的c语言安全规则检查方法 |
CN102831004A (zh) * | 2012-07-13 | 2012-12-19 | 天津国芯科技有限公司 | 一种基于C*core处理器的优化编译方法及编译器 |
CN109684838A (zh) * | 2018-11-23 | 2019-04-26 | 电子科技大学 | 一种针对以太坊智能合约的静态代码审计***及方法 |
CN110096338A (zh) * | 2019-05-10 | 2019-08-06 | 百度在线网络技术(北京)有限公司 | 智能合约执行方法、装置、设备及介质 |
KR20200094618A (ko) * | 2019-01-30 | 2020-08-07 | 주식회사 린아레나 | 스마트 컨트랙트 유사도 분석을 이용한 소스 코드 감사 방법 및 그 장치 |
CN115022026A (zh) * | 2022-05-31 | 2022-09-06 | 电子科技大学 | 一种区块链智能合约威胁检测装置及方法 |
CN115794103A (zh) * | 2022-10-25 | 2023-03-14 | 网易(杭州)网络有限公司 | 变量编译方法、装置、电子设备及可读存储介质 |
CN116028495A (zh) * | 2022-12-28 | 2023-04-28 | 山石网科通信技术股份有限公司 | 智能合约的检测方法及装置 |
CN116166747A (zh) * | 2023-01-10 | 2023-05-26 | 杭州溪塔科技有限公司 | 一种区块链智能合约数据处理方法和装置 |
CN116185805A (zh) * | 2021-11-26 | 2023-05-30 | 北京有竹居网络技术有限公司 | 代码检测方法、装置、设备及存储介质 |
CN116841906A (zh) * | 2023-07-26 | 2023-10-03 | 山石网科通信技术股份有限公司 | 智能合约的检测方法、装置及电子设备 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9612937B2 (en) * | 2012-09-05 | 2017-04-04 | Microsoft Technology Licensing, Llc | Determining relevant events in source code analysis |
-
2024
- 2024-02-01 CN CN202410138372.4A patent/CN117688564B/zh active Active
Patent Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102012991A (zh) * | 2010-11-09 | 2011-04-13 | 北京神舟航天软件技术有限公司 | 基于静态分析的c语言安全规则检查方法 |
CN102831004A (zh) * | 2012-07-13 | 2012-12-19 | 天津国芯科技有限公司 | 一种基于C*core处理器的优化编译方法及编译器 |
CN109684838A (zh) * | 2018-11-23 | 2019-04-26 | 电子科技大学 | 一种针对以太坊智能合约的静态代码审计***及方法 |
KR20200094618A (ko) * | 2019-01-30 | 2020-08-07 | 주식회사 린아레나 | 스마트 컨트랙트 유사도 분석을 이용한 소스 코드 감사 방법 및 그 장치 |
CN110096338A (zh) * | 2019-05-10 | 2019-08-06 | 百度在线网络技术(北京)有限公司 | 智能合约执行方法、装置、设备及介质 |
CN116185805A (zh) * | 2021-11-26 | 2023-05-30 | 北京有竹居网络技术有限公司 | 代码检测方法、装置、设备及存储介质 |
CN115022026A (zh) * | 2022-05-31 | 2022-09-06 | 电子科技大学 | 一种区块链智能合约威胁检测装置及方法 |
CN115794103A (zh) * | 2022-10-25 | 2023-03-14 | 网易(杭州)网络有限公司 | 变量编译方法、装置、电子设备及可读存储介质 |
CN116028495A (zh) * | 2022-12-28 | 2023-04-28 | 山石网科通信技术股份有限公司 | 智能合约的检测方法及装置 |
CN116166747A (zh) * | 2023-01-10 | 2023-05-26 | 杭州溪塔科技有限公司 | 一种区块链智能合约数据处理方法和装置 |
CN116841906A (zh) * | 2023-07-26 | 2023-10-03 | 山石网科通信技术股份有限公司 | 智能合约的检测方法、装置及电子设备 |
Non-Patent Citations (1)
Title |
---|
郑忠斌 ; 王朝栋 ; 蔡佳浩 ; .智能合约的安全研究现状与检测方法分析综述.信息安全与通信保密.2020,(第07期),全文. * |
Also Published As
Publication number | Publication date |
---|---|
CN117688564A (zh) | 2024-03-12 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Kim et al. | Shared execution for efficiently testing product lines | |
CN109783346B (zh) | 基于关键字驱动的自动化测试方法、装置及终端设备 | |
CN101853200B (zh) | 一种高效动态软件漏洞挖掘方法 | |
CN102054149A (zh) | 一种恶意代码行为特征提取方法 | |
US20130145347A1 (en) | Automatic modularization of source code | |
CN110474900B (zh) | 一种游戏协议测试方法及装置 | |
CN112181430B (zh) | 代码变更统计方法、装置、电子设备及存储介质 | |
CN110716866A (zh) | 代码质量扫描方法、装置、计算机设备及存储介质 | |
CN105630656A (zh) | 基于日志模型的***健壮性分析方法及装置 | |
CN110287700B (zh) | 一种iOS应用安全分析方法及装置 | |
CN111240772A (zh) | 一种基于区块链的数据处理方法、装置及存储介质 | |
CN114238980A (zh) | 一种工控设备漏洞挖掘方法、***、设备及存储介质 | |
CN112948400B (zh) | 一种数据库管理方法、数据库管理装置及终端设备 | |
CN117688564B (zh) | 一种用于智能合约事件日志的检测方法、装置和存储介质 | |
CN116841906A (zh) | 智能合约的检测方法、装置及电子设备 | |
CN114826793B (zh) | 一种rop链的检测方法、装置及介质 | |
CN115840707A (zh) | 一种刷写测试方法、装置及介质 | |
CN113703753B (zh) | 用于产品开发的方法、装置和产品开发*** | |
CN114462381A (zh) | 数据处理方法、装置、设备及存储介质 | |
CN113407989A (zh) | 数据脱敏的方法、装置、电子设备及存储介质 | |
CN113467815A (zh) | 热更新的应用修复方法、装置、终端设备及存储介质 | |
CN109710538B (zh) | 一种用于大规模***中状态相关缺陷的静态检测方法 | |
CN113742208A (zh) | 一种软件检测方法、装置、设备及计算机可读存储介质 | |
CN113742116A (zh) | 一种异常定位方法及装置、设备、存储介质 | |
Imtiaz et al. | Predicting vulnerability for requirements |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |