一文详解以太坊虚拟机EVM的数据存储机制
以太坊存储机制
在EVM中允许执行智能合约代码。合约状态或内存存储在智能合约地址中。可以将这种存储视为位于智能合约地址的无限长度的数据结构数组。存储机制确保存储位置没有冲突,并遵循一组规则。使用这些规则,我们可以解码任何合约的状态。解码存储在映射中的数据需要知道所使用的密钥。合约数据的解码使用RPC调用eth_getStorageAt进行。
插槽位置
变量在智能合约的存储阵列中的位置由代码中出现的顺序以及变量的大小决定。此位置称为插槽。如果一个变量小于256位,则EVM会尝试在空间中容纳一个以上的变量,因此一个以上的变量可能会占用存储阵列中单个插槽的空间。映射或数组将始终占据一个插槽。数组和映射元素的位置遵循一组特殊的哈希规则,本文将对此进行介绍,这些规则在以太坊文档中也有描述。下表(表1)提供了EVM遵循的分配规则的摘要。我们将看两个智能合约的示例,并使用表1中提供的规则对其进行解码
256位变量的简单示例
首先让我们看一个简单示例,所有变量都是256bit(32字节长)。这样做使我们无需考虑可变变量即可查看分配。请注意,当对数字应用keccack哈希时,数字必须是0填充的64位值。所有解码都是使用以太坊RPC调用eth_getStorageAt执行的,在本文中将其表示为GetStorageAt。可以使用任何语言打包程序(例如nethereum或web3j)来调用此RPC api。下图(图1)显示了如何对智能合约的地址和传递给它的位置值进行GetStorageAt调用。图1左侧的数字是变量的位置。对于基类型(uint、string等),可以将此位置传递到GetStorageAt以获取变量值。对于数组,位置将返回数组的长度。通过将Keccack哈希传递给索引为0的GetStorageAt来解码数组索引。数组的每个后续索引位于与位置求和的哈希值处。可以认为这是访问数组的指针并增加其位置以查找每个元素,类似于C或C ++。传递给每个键的GetStoragetAt的位置值是键的keccack哈希值和映射声明的位置。对于多维映射,将密钥和变量位置递归调用Keccack哈希值。参见图1中的示例进行说明。
接下来,我们来看一个发生变量打包的示例。打包要记住的是:
1. 它仅按出现顺序适用于基本变量类型(uint128,string,int等)。EVM将按照代码中列出的顺序在256位空间中打包尽可能多的变量。
2. 每个映射和数组变量将占用一个新的插槽。
3. 数组变量映射将遵循打包规则。也就是说,如果一个元素小于256位,则阵列的多个索引将占用存储阵列中的单个插槽。
图2显示并提供了发生的打包的说明。当类型的长度小于256位时,EVM尝试将其他变量打包到插槽中。EVM按列出的顺序选择要打包的变量。映射和数组始终出现在新位置。但是打包规则仍适用于解码数组索引,打包规则仍适用于存储在映射中的结构。有关这种情况下如何存储变量的说明,请参见图2。
继 承
关于继承的说明。当智能合约继承其他智能合约时,基本智能合约的存储变量将按继承顺序占据存储阵列的第一个插槽。子类的存储变量将随后出现。
结 论
如前所述,我们在本文介绍的规则来解码以太坊智能合约的存储机制。在接下来的,第2部分将描述的智能合约规则编写的工具。
你可能感兴趣的文章
-
【推荐】一文详解以太坊虚拟机(EVM)的数据存储机制
-
【推荐】一文详解以太坊虚拟机(EVM)的数据存储机制
以太坊存储机制在EVM中允许执行智能合约代码。合约状态或内存存储在智能合约地址中。可以将这种存储视为位于智能合约地址的无限长度的数据结构数组。存储机制确保存储位...
2024-11-14
【推荐】区块链Polygon接口对接流程及注意事项
-
【推荐】区块链Polygon接口对接流程及注意事项
Polygon(原Matic Network)作为以太坊的Layer 2扩展解决方案,为开发者提供了高吞吐量、低费用和快速的交易确认。对接Polygon接口,可...
2024-11-14
Foresight Ventures:氮气加速ZK协处理器如何打破智能合约数据壁垒
-
Foresight Ventures:氮气加速ZK协处理器如何打破智能合约数据壁垒
一、概念介绍关于协处理器这个概念,一个很浅显易懂的例子就是电脑和显卡的关系,CPU可以完成大部分任务,但是一旦遇到特定任务,就需要显卡的帮助,因为CPU算力不够...
2024-11-14
【推荐】数字宠物虚拟现实博彩以太坊的几种经典 应用
-
【推荐】数字宠物虚拟现实博彩以太坊的几种经典 应用
熟悉区块链的朋友都知道,以太坊(Ethereum)被誉为“下一代智能合约和去中心化应用平台”,即一个开源的、有智能合约功能的公共区块链技术平台。目前,以太坊牢牢...
2024-11-14
以太坊(Ethereum)外包开发流程
-
以太坊(Ethereum)外包开发流程
以太坊外包开发是指将以太坊区块链相关的开发任务委托给专业的第三方团队或个人。这些任务可能包括智能合约开发、DApp前端开发、区块链节点部署、测试等。通过外包,企...
2024-11-13
智能合约中的并发性和并行性:以太坊为何如此缓慢?
-
智能合约中的并发性和并行性:以太坊为何如此缓慢?
以太坊很慢——极其缓慢。最近做一个简单的 USDC 审批交易,大概花了 3 个小时进行验证。这里有一个更有启发性的统计数据:以太坊平均每 10~20 秒发布一个...
2024-11-13
【推荐】简述以太坊智能钱包发展历程及主流产品特性
-
【推荐】简述以太坊智能钱包发展历程及主流产品特性
智能钱包是密码学货币通往主流人群的一种途径。智能钱包以智能合约作为账户与区块链进行交互,代替原生的私钥-地址的账户体系,让普通用户更容易使用 DeFi 和区块链...
2024-11-12
区块链Polygon接口对接流程及注意事项
-
区块链Polygon接口对接流程及注意事项
Polygon(原Matic Network)作为以太坊的Layer 2扩展解决方案,为开发者提供了高吞吐量、低费用和快速的交易确认。对接Polygon接口,可...
2024-11-12
7年,看以太坊的4个阶段
-
7年,看以太坊的4个阶段
以太坊致力于成为去中心化的“世界计算机”,就如互联网的发展一路坎坷,经历了几十年才走向成熟, 区块链也不可能一蹴而就。自从2014年初,V神发表了以太坊白皮书以...
2024-11-11
一文详解以太坊虚拟机EVM的数据存储机制
-
一文详解以太坊虚拟机EVM的数据存储机制
以太坊存储机制在EVM中允许执行智能合约代码。合约状态或内存存储在智能合约地址中。可以将这种存储视为位于智能合约地址的无限长度的数据结构数组。存储机制确保存储位...
2024-11-11