区块链:深入理解 EVM 存储机制及安全问题

前言

EVM是一个轻量级的虚拟机,其设计初衷就是提供一种可以忽略硬件、操作系统等兼容性的虚拟的执行环境供以太坊网络运行智能合约。

简单来说EVM是一个完全独立的沙盒,在EVM中运行的代码是无法访问网络、文件系统和其他进程的,以此来避免错误的代码能让智能合约毁灭或者影响外部环境。

在此基础上,知道创宇区块链安全实验室带大家一起深入理解EVM的存储机制和安全问题。

EVM存储结构

可以看到EVM存储数据分为两类:

存储在code和storage里的数据是non-volatile(不容易丢失的)

火币区块链研究院李慧:未来银行会更加深入布局区块链技术:4月7日消息,火币区块链研究院副院长李慧表示,未来银行业对区块链技术布局会否更加深入的答案是肯定的。她认为,“通过区块链技术的嵌入,银行实现原有业务基础上的降本提效,并且吸纳更多客户,达到双赢局面。上面所提到的区块链在银行各业务的布局以B2B业务居多,随着区块链技术的普及与发展,银行会逐渐将区块链布局到更多的toC业务领域,如信用卡积分管理等。”(证券日报)[2020/4/7]

存储在stack,args,memory里数据是volatile(容易丢失的)

各个存储位置的含义

Code

声音 | 东华软件:未来将持续推动区块链在医疗健康领域的深入应用:金色财经报道,东华软件股份公司在其关于投资者交流会召开情况的公告中表示,公司医疗行业未来发展方向之一为,持续推动区块链技术在医疗健康领域的深入应用,帮助用户建立全生命周期的健康档案,实现健康数据的记录和安全共享。[2020/2/12]

code部署合约时储存data字段也就是合约内容的空间,即专门存储智能合约的二进制源码的空间

Storage

Storage是一个可以读写修改的持久存储的空间,也是每个合约持久化存储数据的地方。Storage是一个巨大的map,一共2^256个插槽(slot),每个插糟有32byte,合约中的“状态变量”会根据其具体类型分别保存到这些插槽中。

声音 | 王天宇:打造银企协同平台 深入拓展人工智能、区块链等的应用:据证券日报消息,10月19日,2019第四届中国物流与供应链金融峰会暨第三届中国商贸物流银行联盟峰会在郑州举行。中国商贸物流银行联盟主席王天宇表示:“我们联盟有银行、有电商平台,有行业的龙头,汇聚了金融商贸的领军企业,今后共同打造银企的协同平台,免费为联盟平台提供金融服务科技,深入拓展人工智能、区块链、大数据、物联网等的应用,加速金融科技赋能,创新商业模式和业态,发挥联盟成员互补优势,加快信息流、商流、物流、资金流的四流合一,融合发展互利共赢。”[2019/10/20]

Stack

stack即所谓的“运行栈",用来保存EVM指令的输入和输出数据。可以免费使用,没有gas消耗,用来保存函数的局部变量,数量被限制在16个。stack的最大深度为1024,其中每个单元是32byte。

动态 | 未来区块链等金融科技在农村金融领域的应用将会持续深入推广:据中国金融新闻网消息,日前,央行等五部委联合发布《关于金融服务乡村振兴的指导意见》(以下简称《指导意见》),其中,在强化金融产品和服务方式创新方面,鼓励推动新技术的运用。业内人士认为,未来金融科技在农村金融领域的应用将继续深入推广。正如上述《指导意见》提出,积极运用大数据、区块链等技术,提高涉农信贷风险的识别、监控、预警和处置水平;鼓励开发针对农村电商的专属贷款产品和小额支付结算功能,打通农村电商资金链条等。[2019/2/16]

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的健值数据库,存储的数据可以通过校验和来确保一致。但是其也是和智能合约语言进行交互的,当其中一些规则发生冲突很可能就被别有用心的人用来作恶,所以规范的使用智能合约语言是避开漏洞的必要条件。

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

地球链

DOGEKEX:BKEX Global 关于下架PMON/USDT交易对的公告

尊敬的用户:? 本着保护用户的宗旨,BKEXGlobal为保证交易币种的高标准,将定期对平台内的代币进行综合性审查;如项目方出现对投资者不利因素,我们将采取对应措施,并下架对应项目.

[0:0ms0-0:796ms