一种基于状态锁的智能合约的安全函数的设计方法及系统与流程

文档序号:17744013发布日期:2019-05-24 20:29阅读:462来源:国知局
一种基于状态锁的智能合约的安全函数的设计方法及系统与流程

本发明属于区块链安全技术领域,尤其涉及一种基于状态锁的智能合约的安全函数的设计方法。



背景技术:

目前,业内常用的现有技术是这样的:

重入漏洞:每一个以太坊智能合约都有且仅有一个没有名字的函数,该函数称为fallback函数,当合约接收到以太币时,这个函数会被执行,用于向以太坊表明收到了以太币,攻击者利用这一机制,在fallback函数中,写入攻击的代码,当被攻击合约向恶意合约传送以太币时,以太坊虚拟机evm就会直接执行攻击者合约的fallback函数,来获取以太币。

具体来说攻击者调用withdraw函数取回合约中的以太币,在call将以太币发送给接收方,此时接收方的fallback被evm调用,fallback里则再次调用dao的withdraw,但是dao的余额更新代码一直未被执行(该行代码用于减去调用方在该函数中的余额),也就是说这里就形成了一个循环,withdraw将一直被重复调用,直到dao的以太币被盗取完为止。

综上所述,现有技术存在的问题是:

现有技术中,不能有效解决重入漏洞问题。

技术人员运用transfer等指令代替call从而避免fallback函数被重复调用,然而从evm上来说,transfer函数需要消耗更多gas,且不如call函数灵活,所以call函数并不能被完全代替。

如果不考虑使用transfer,技术人员只能通过自身经验,在状态量改变后调用call函数,仍然很难预防重入攻击。

解决上述技术问题的难度和意义:

该技术问题难度:主要在于锁的创建必须在本地建立的library中用结构体存放锁。

本发明的意义:在于在开发过程中,call函数又能重新被运用,发挥本来的作用,不用担心遭遇重入攻击。



技术实现要素:

针对现有技术存在的问题,本发明提供了一种基于状态锁的智能合约的安全函数的设计方法,

本发明是这样实现的,一种基于状态锁的智能合约的安全函数的设计方法包括:

步骤一:当evm执行到call函数时,以太坊其余执行路径将被封锁;

步骤二:当call整体执行完毕后,其余路径被打开;

步骤三:当以太坊其余执行路径被封锁时,withdraw被再次请求,evm将直接拒绝;evm回到初始状态,完成攻击防御。

进一步,在evm进入call函数之前,把锁关闭,当攻击者再次调用withdraw进入_call()时,锁n还处于真状态,断言无法通过,直接退回到原状态,交易失败;当_call完整运行完毕,锁n被打开。

进一步,基于状态锁的智能合约的安全函数的设计方法进一步包括:

步骤一:编写安全库函数如图2所示;

步骤二:编译图2所示的安全函数库;

步骤三:其他智能合约函数通过调用安全函数库实现call功能。

本发明的另一目的在于提供一种实施所述基于状态锁的智能合约的安全函数的设计方法的基于状态锁的智能合约的安全函数的控制系统。

本发明的另一目的在于提供一种搭载所述基于状态锁的智能合约的安全函数的控制系统的基于状态锁的智能合约的安全函数的安全网络平台。

本发明的另一目的在于提供一种实现所述基于状态锁的智能合约的安全函数的设计方法的计算机程序。

本发明的另一目的在于提供一种终端,所述终端实现所述基于状态锁的智能合约的安全函数的设计方法的控制器。

本发明的另一目的在于提供一种计算机可读存储介质,包括指令,当其在计算机上运行时,使得计算机执行所述的基于状态锁的智能合约的安全函数的设计方法。

进一步,本发明的所述基于状态锁的智能合约的安全函数包括:

在evm进入call函数之前,把锁关闭,当攻击者再次调用withdraw进入_call()时,第49行的锁n还处于真状态,所以49行断言无法通过,直接退回到原状态,交易失败,预防了攻击,只有当一个_call完整运行完毕,n才会被第52行的代码打开,避免进入重复取币的困境。

综上所述,本发明的优点及积极效果为:

在现有的技术中,技术人员利用transfer代替call来避免被重入攻击,本发明从evm字节码的角度审视transfer函数相对于call函数的弊端:

call函数的字节码:

jumpdest

dup2

pushffffffffffffffffffffffffffffffffffffffff

and

dup2

push40

mload

push0

push40

mload

dup1

dup4

sub

dup2

dup6

dup8

gas

call

swap3

pop

pop

pop

pop

pop

pop

jump[out]

transfer函数的字节码

jumpdest

dup2

pushffffffffffffffffffffffffffffffffffffffff

and

push8fc

dup3

swap1

dup2

iszero

mul

swap1

push40

mload

push0

push40

mload

dup1

dup4

sub

dup2

dup6

dup9

dup9

call

swap4

pop

pop

pop

pop

iszero

iszero

push[tag]21

jumpi

push0

dup1

revert

tag21

jumpdest

pop

pop

jump[out]

.data0

从消耗gas的角度上来讲,transfer函数比call函数消耗更多的gas,所运用的指令更多。其次call仅仅是从头执行到尾,而transfer却有可能执行tag21这一代码块,若这一代码块被执行将消耗更多gas。

从字节码可以看出这两个函数是很大不同的函数,实际执行也很不相同,所以用transfer来代替call并不完全合适。

本发明利用状态锁控制call函数有效解决重入漏洞。

在本发明中,攻击过后账户b余额中,攻击者仅仅取出了自己在dao中存储的5个以太币,并没有成功夺取dao中剩余的50个以太币,因此,可以看出本发明的库函数成功阻止了重入攻击;

在调用_call()函数时,需要创建锁及调用开关锁函数,提高了安全性;性价比较高。

如果不用该项技术,直接使用call函数,则极容易被盗取以太币,其效果如图7、图8所示。成功盗取了50个以太币。

附图说明

图1是本发明实施例提供的基于状态锁的智能合约的安全函数流程图。

图2是本发明实施例提供的状态锁代码图。

图3是本发明实施例提供的被状态锁控制的call函数代码图。

图4是本发明实施例提供的改进的dao合约。

图5是本发明实施例提供的dao合约与attack合约的部署情况。

图6是本发明实施例提供的被状态锁控制的账户b进行重入攻击后的余额状况图。

图7是未运用本发明dao合约与attack合约的部署情况。

图8是未运用本发明实施例账户b进行重入攻击后的余额状况图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

现有技术中,不能有效解决重入漏洞问题。

为解决上述问题,下面结合具体方案对本发明的应用原理作详细描述。

如图1所示,本发明实施例提供的基于状态锁的智能合约的安全函数的设计方法包括:

s101:当evm执行到call函数时,以太坊其余执行路径将被封锁。

s102:当call整体执行完毕后,其余路径被打开。

s103:当以太坊其余执行路径被封锁时,withdraw被再次请求,evm将直接拒绝;evm回到初始状态,完成攻击防御。

在本发明实施例中,基于状态锁的智能合约的安全函数的设计方法进一步包括:

步骤一:编写安全库函数如图2所示。

步骤二:编译图2所示的安全函数库。

步骤三:其他智能合约函数通过调用安全函数库实现call功能。

如图2-图3所示,本发明实施例提供的基于状态锁的安全函数包括:

在evm进入call函数之前,把锁关闭,当攻击者再次调用withdraw进入_call()时,第49行的锁n还处于真状态,所以49行断言无法通过,直接退回到原状态,交易失败,预防了攻击,只有当一个_call完整运行完毕,n才会被第52行的代码打开,避免进入重复取币的困境。

下面结合具体测试对本发明的应用原理作进一步描述。

如图4至图6所示,本发明在remix的ide中进行测试,该测试环境模拟了以太坊多节点的分布式特征,在网页中完整集成了evm环境:

(1)实验设置:

账户a:0xca35b7d915458ef540ade6068dfe2f44e8fa733c创建dao合约,并在dao合约中存储50个以太币;

账户b:0x14723a09acff6d2a60dcdf7aa4aff308fddc160c创建第三节的attack合约;

attack合约在0xbbf289d846208c16edc8474705c748aff07732db(账户a创建的dao合约地址)存储了5个以太币,并以此向dao合约进行重入攻击;

(2)实验结果:

攻击过后账户b余额中,攻击者仅仅取出了自己在dao中存储的5个以太币,并没有成功夺取dao中剩余的50个以太币,因此,可以看出本发明的库函数成功阻止了重入攻击;

在调用_call()函数时,需要创建锁及调用开关锁函数,提高了安全性;性价比较高。

在本发明实施例中,图7是未运用本发明dao合约与attack合约的部署情况。图8是未运用本发明实施例账户b进行重入攻击后的余额状况图。

在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用全部或部分地以计算机程序产品的形式实现,所述计算机程序产品包括一个或多个计算机指令。在计算机上加载或执行所述计算机程序指令时,全部或部分地产生按照本发明实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(dsl)或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输)。所述计算机可读取存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,dvd)、或者半导体介质(例如固态硬盘solidstatedisk(ssd))等。

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1