前言
EVM是一个轻量级的虚拟机,其设计初衷就是提供一种可以忽略硬件、操作系统等兼容性的虚拟的执行环境供以太坊网络运行智能合约。
简单来说EVM是一个完全独立的沙盒,在EVM中运行的代码是无法访问网络、文件系统和其他进程的,以此来避免错误的代码能让智能合约毁灭或者影响外部环境。
在此基础上,知道创宇区块链安全实验室带大家一起深入理解EVM的存储机制和安全问题。
EVM存储结构
可以看到EVM存储数据分为两类:
存储在code和storage里的数据是non-volatile(不容易丢失的)
多链DeFi平台Rubic正在深入研究允许RBC被用作税收资产:官方消息,多链DeFi平台Rubic宣布,作为一个额外的用例,正在深入研究允许RBC被用作税收资产。此外,Rubic表示,在新UI的工作接近完成后,BSC Polygon桥等将在不久后启动。[2021/6/24 0:02:35]
存储在stack,args,memory里数据是volatile(容易丢失的)
各个存储位置的含义
Code
code部署合约时储存data字段也就是合约内容的空间,即专门存储智能合约的二进制源码的空间
国家外汇管理局山西省分局:深入推进跨境金融区块链服务平台应用:从国家外汇管理局山西省分局了解到,今年以来,山西省外汇局系统指导银行积极挖掘市场潜力,提升跨境贸易投融资便利化水平,为中小微外贸企业跨境结算与融资扩渠道、增便利。一季度,已为16家企业办理融资业务116笔,累计放款7.67亿美元。 该局提出11条措施精准帮扶中小微外贸企业。建立了覆盖163家企业的重点中小微外贸企业库,用足用准山西省155亿元再贷款再贴现专用额度。深入推进跨境金融区块链服务平台应用,已有17家银行加入平台,为16家企业办理融资业务。指导银行机构精准对接中小微外贸企业融资需求,提供“一企一策”服务,缓解资金压力。在提升外汇质效方面,畅通外汇业务办理“绿色通道”,截至4月15日,全省借助“绿色通道”为35家疫情防疫相关企业快速办理外汇业务64笔766.19万美元。(潇湘晨报)[2020/5/16]
Storage
声音 | 立陶宛银行:央行“父母控制”已过时 应更深入了解加密资产领域:在12月10日发布的有关中央银行数字货币(CBDC)的分析中,立陶宛银行表示,在加密资产方面,中央银行的“父母控制”已经过时,因此不应阻止中央银行进入该领域以了解它。银行应参与数字资产领域,以获取此快速发展资产类别的经验。(Cointelegraph)[2019/12/11]
Storage是一个可以读写修改的持久存储的空间,也是每个合约持久化存储数据的地方。Storage是一个巨大的map,一共2^256个插槽(slot),每个插糟有32byte,合约中的“状态变量”会根据其具体类型分别保存到这些插槽中。
声音 | 中国互金协会副秘书长:我国区块链在金融领域应用总体处于早期尝试向深入探索转变的过渡阶段:金色财经报道,11月20日,“金融进化论:2019新京报金融科技论坛”上,中国互金协会副秘书长杨农表示,当前,我国区块链在金融领域应用,已在供应链金融、金融数据共享和金融信息存证等场景中形成了一些落地案例,总体处于早期尝试向深入探索转变的过渡阶段,且呈现出探索性应用数量较多、参与主体较为多元、底层技术原创有待加强等特点。同时,区块链在我国金融领域的应用探索也面临着如下几个方面的挑战:技术层面仍难以兼顾部分金融应用场景对安全、功能和性能的要求;研发层面自主创新有待加强,对国外开源程序的广泛应用可能导致技术依赖风险;业务层面部分金融应用环节尚存在模糊地带,部分机构在开展区块链应用创新时缺少权威的第三方评估意见作为参考;治理层面存在法律规制困难,如链上资产和智能合约等方面的法律有效性界定不清晰。[2019/11/22]
Stack
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的健值数据库,存储的数据可以通过校验和来确保一致。但是其也是和智能合约语言进行交互的,当其中一些规则发生冲突很可能就被别有用心的人用来作恶,所以规范的使用智能合约语言是避开漏洞的必要条件。
尊敬的用户:?????? ??? BKEXGlobal即将上线HCT,并上线HCT/USDT聚合交易对.
金色财经报道,跨境支付巨头速汇金正在与Stellar区块链网络合作,使用Circle的USDC稳定币创建即时汇款.
一、项目介绍 StackOS是一个去中心化的云盘,社区成员可以在其中贡献节点,开发人员可以在几分钟内以匿名、更安全、更低成本的方式部署任何全栈应用程序、去中心化应用程序、区块链私有网络和主网节点.
尊敬的用户: 为响应监管政策要求,BiKi平台已于2021年9月26日停止了地区新用户的注册和KYC.
9月27日,ChiaGlobalHackathon@Asia在DoraHacks开发者平台HackerLink圆满落幕.
第10次波卡插槽拍卖已于2021年9月29日20:00正式开始,正在火热进行中。目前Genshiro以15,780.2004KSM的质押量排名靠前,截至2021年10月5日14:00,Gate.