[发明专利]一种基于状态锁的智能合约的安全函数的设计方法及系统有效
申请号: | 201910077219.4 | 申请日: | 2019-01-28 |
公开(公告)号: | CN109801166B | 公开(公告)日: | 2023-04-18 |
发明(设计)人: | 陈中育;赵相福;林飞龙;郑忠龙;骆宾逸 | 申请(专利权)人: | 浙江师范大学 |
主分类号: | G06Q40/04 | 分类号: | G06Q40/04;G06Q20/06;G06F8/30;G06F9/52 |
代理公司: | 北京金智普华知识产权代理有限公司 11401 | 代理人: | 杨采良 |
地址: | 321004 *** | 国省代码: | 浙江;33 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 基于 状态 智能 合约 安全 函数 设计 方法 系统 | ||
本发明属于区块链安全技术领域,公开了一种基于状态锁的智能合约的安全函数的设计方法及系统,当EVM执行到call函数时,以太坊其余执行路径将被封锁;当call整体执行完毕后,其余路径被打开;当以太坊其余执行路径被封锁时,withdraw被再次请求,EVM将直接拒绝;EVM回到初始状态,完成攻击防御。本发明利用状态锁控制call函数有效解决重入漏洞;在本发明中,攻击过后账户b余额中,攻击者仅仅取出了自己在DAO中存储的5个以太币,并没有成功夺取DAO中剩余的50个以太币,因此,可以看出本发明的库函数成功阻止了重入攻击。
技术领域
本发明属于区块链安全技术领域,尤其涉及一种基于状态锁的智能合约的安全函数的设计方法。
背景技术
目前,业内常用的现有技术是这样的:
重入漏洞:每一个以太坊智能合约都有且仅有一个没有名字的函数,该函数称为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函数之前,把锁n关闭,当攻击者再次调用withdraw进入_call()时,锁n还处于真状态,断言无法通过,直接退回到原状态,交易失败;当_call完整运行完毕,锁n被打开。
进一步,基于状态锁的智能合约的安全函数的设计方法进一步包括:
步骤一:编写安全库函数如图2所示;
步骤二:编译图2所示的安全函数库;
步骤三:其他智能合约函数通过调用安全函数库实现call功能。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于浙江师范大学,未经浙江师范大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201910077219.4/2.html,转载请声明来源钻瓜专利网。