前言
EVM是一个轻量级的虚拟机,其设计初衷就是提供一种可以忽略硬件、操作系统等兼容性的虚拟的执行环境供以太坊网络运行智能合约。
简单来说EVM是一个完全独立的沙盒,在EVM中运行的代码是无法访问网络、文件系统和其他进程的,以此来避免错误的代码能让智能合约毁灭或者影响外部环境。
在此基础上,知道创宇区块链安全实验室带大家一起深入理解EVM的存储机制和安全问题。
EVM存储结构
可以看到EVM存储数据分为两类:
存储在code和storage里的数据是non-volatile(不容易丢失的)
山西深入推进跨境金融区块链服务平台应用:国家外汇管理局山西省分局深入推进跨境金融区块链服务平台应用,为中小微外贸企业跨境结算与融资扩渠道、增便利。目前,山西省已有17家银行加入该平台,为16家企业办理融资业务116笔,累计放款7.67亿美元。(中国新闻网)[2020/5/3]
存储在stack,args,memory里数据是volatile(容易丢失的)
各个存储位置的含义
Code
code部署合约时储存data字段也就是合约内容的空间,即专门存储智能合约的二进制源码的空间
Storage
吉林省法院部署2020年工作:要深入推进区块链技术创新应用:2月28日,吉林省法院召开网络安全和信息化领导小组2020年第一次会议,听取2019年全省法院网络安全和信息化建设情况汇报,研究部署2020年工作。会议要求,要以重点任务为抓手,全面加快智慧法院建设工作。深入推进区块链技术创新应用,全面加快业务场景的创新应用研发。(新浪网)[2020/2/29]
Storage是一个可以读写修改的持久存储的空间,也是每个合约持久化存储数据的地方。Storage是一个巨大的map,一共2^256个插槽(slot),每个插糟有32byte,合约中的“状态变量”会根据其具体类型分别保存到这些插槽中。
声音 | 李东荣:依托区块链研究工作组等 就国内外金融科技热点重点问题开展深入研究:据人民网报道,中国互联网金融协会会长李东荣做客人民网视频访谈表示,从四方面加强金融科技发展,其中提到: 第一,依托移动金融专委会、网络与信息安全专委会、金融科技发展与研究工作组、区块链研究工作组等,牵头组织行业研究力量,就国内外金融科技热点重点问题开展深入研究,主要包括英美及部分新兴市场国家金融科技监管最新进展,网络借贷、股权众筹等金融科技业态国际比较,监管科技、监管沙箱发展情况,大数据、云计算、人工智能、区块链等技术在金融领域的应用情况等。其次是持续加强金融科技标准化建设,提升行业标准化规范化水平。三是履行社会组织对外交往职能,不断加强金融科技国际交流合作。 第四,协会综合运用自身掌握数据,以及司法系统、科技公司等第三方合作数据,针对互联网资管、网络借贷、ICO、互联网非法外汇交易、涉嫌违法违规宣传活动等重点领域持续开展监测。[2018/12/27]
Stack
动态 | 区块链等技术已经在平安银行多项业务中深入运用:据人民网消息,据统计,平安集团每年都拿出营收的1%来投入科研,基于这样的科技优势,目前,互联网、大数据、区块链、人工智能、物联网等前沿技术,在平安银行的现金管理、互联网支付结算、电子政务、贸易融资等产品和业务中都已有深入运用。此外,区块链的应用降低了银行的管理和运营成本和提高了风险控制能力。以平安银行的供应链应收账款服务平台“SAS”为例,该平台通过区块链技术确认交易的真实性,从而给核心企业上游的中小企业发放贷款。[2018/11/6]
stack即所谓的“运行栈",用来保存EVM指令的输入和输出数据。可以免费使用,没有gas消耗,用来保存函数的局部变量,数量被限制在16个。stack的最大深度为1024,其中每个单元是32byte。
Args
args也叫calldata,是一段只读的可寻址的保存函数调用参数的空间,与栈不同的地方的是,如果要使用calldata里面的数据,必须手动指定偏移量和读取的字节数。
Memory
Memory一个简单的字节数组,主要是在运行期间存储数据,将参数传递给内部函数。基于32byte进行寻址和扩展。
EVM数据存储概述
前面已经说过Storage是每个合约持久化存储数据的地方其储存数据的方式是通过插槽来实现的,现在就具体介绍它是怎么实现的:
状态变量
1.对于大小在32字节以内的变量(常量),以其定义的顺序作为它的索引值来存储。即第一个变量的索引为key(0),第二个变量的索引为key(1)...
2.对于连续较小的值,可能被优化存储在同一个位置,比如:合约中前四个状态变量都是uint64类型的,则四个状态变量的值会被打包成一个32字节的值存储在0位置。
未优化:
pragmasolidity^0
??functionm()?externalreturns(uint256,uint256){????Infostorageinfo;????info
??functiontest(bytes32_name,address?_mappedAddress)public{????Personperson;????person.name=_name;????person.mappedAddress=_mappedAddress;????require(unlocked);?}}
漏洞合约分析:
可以看到该合约在函数部分创建新的结构体时没有进行初始化,由此我们可以利用该函数进行对owner的修改。不过使用该函数我们还要通过require验证,不过这也不难因为状态变量unlocked也同样在我们可控的范围内。
具体操作:
调用test函数分别传入向_name传入:0x0000000000000000000000000000000000000000000000000000000000000001(真值)
_mappedAddress传入:0xfB89eCb0188cb83c220aADDa1468C1635208e821(个人地址)
传参前:
传参后:
可以看到已经成功更改了地址。
总结
可以看到EVM的存储器就是一个key=>value的健值数据库,存储的数据可以通过校验和来确保一致。但是其也是和智能合约语言进行交互的,当其中一些规则发生冲突很可能就被别有用心的人用来作恶,所以规范的使用智能合约语言是避开漏洞的必要条件。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。