详解以太坊虚拟机(EVM)的数据存储机制_ORA:比特币

来源:区块链研究实验室

以太坊存储机制

在EVM中允许执行智能合约代码。合约状态或内存存储在智能合约地址中。可以将这种存储视为位于智能合约地址的无限长度的数据结构数组。存储机制确保存储位置没有冲突,并遵循一组规则。使用这些规则,我们可以解码任何合约的状态。解码存储在映射中的数据需要知道所使用的密钥。合约数据的解码使用RPC调用eth_getStorageAt进行。

插槽位置

变量在智能合约的存储阵列中的位置由代码中出现的顺序以及变量的大小决定。此位置称为插槽。如果一个变量小于256位,则EVM会尝试在空间中容纳一个以上的变量,因此一个以上的变量可能会占用存储阵列中单个插槽的空间。映射或数组将始终占据一个插槽。数组和映射元素的位置遵循一组特殊的哈希规则,本文将对此进行介绍,这些规则在以太坊文档中也有描述。

萨尔瓦多正在为其比特币城建设机场:6月23日消息,萨尔瓦多正在为其比特币城(Bitcoin City)项目建设机场。该机场将被称为Pacífico机场,同时也将被称为比特币城机场。据Criptonoticias和国内媒体报道,机场建设将“与比特币城的建设齐头并进”。在城市建设项目中,萨尔瓦多将在火山脚下建立一个站点,地热发电将用于为城市供电和比特币挖矿。萨尔瓦多政府于2021年底首次公布了该计划,称比特币城将允许其居民在这个比特币具有法定货币地位的国家开展免税业务。[2023/6/23 21:55:54]

下表提供了EVM遵循的分配规则的摘要。我们将看两个智能合约的示例,并使用表1中提供的规则对其进行解码

FTX提出动议从Modulo Capital冲基金中收回4.6亿美元:金色财经报道,FTX提出动议,要求达成和解协议,为利益相关者追回 4.6 亿美元的资产。Alameda Research 于 2022 年向 Modulo Capital 投资了 4 亿美元。根据备案文件,追回的 4.6 亿美元资产占 Modulo 剩余资产的 99% 以上,其中包括 4.04 亿美元现金。Modulo 还将放弃对 FTX.com 和 FTX.US 账户中持有的 5600 万美元资产的任何索赔。由于和解,Alameda 也将失去对其在 Modulo 的股份的任何索赔。

该协议仍必须得到美国破产法官约翰多尔西的批准,他已安排在 4 月 12 日举行动议听证会。[2023/3/23 13:22:09]

以太坊基金会发文总结2022年各团队的研究与发展:12月29日消息,以太坊基金会发文总结2022年各团队的研究与发展,其中提到共识研发团队今年将以太坊主网共识机制切换为权益证明 (PoS) ,此外一直在解决MEV领域的紧急问题,明年将致力于提款功能、继续完善EIP-4844共识层规范以及其他合并后研究主题。密码学团队为由NIST(美国国家标准与技术研究院)标准化的后量子签名方案做出了贡献,未来,可能会通过更好的聚合技术或不同的硬度假设来提高可扩展性。此外,还包含Fe-lang、Formal Verification、Geth、Javascript 团队、Ipsilon、Portal、隐私和扩展探索、Protocol Support等团队的更新。[2022/12/29 22:15:06]

256位变量的简单示例

NFT欺诈检测公司Yakoa完成480万美元种子轮融资:金色财经报道,NFT欺诈检测初创公司Yakoa完成480万美元种子轮融资,Brevan Howard Digital、Volt Capital和Collab+Currency领投,Uniswap Labs Ventures、Alliance DAO、Orange DAO、Time Zero Capital、Sunset Venture等参投。(The Block)[2022/11/16 13:09:23]

首先让我们看一个简单示例,所有变量都是256bit。这样做使我们无需考虑可变变量即可查看分配。

请注意,当对数字应用keccack哈希时,数字必须是0填充的64位值。

所有解码都是使用以太坊RPC调用eth_getStorageAt执行的,在本文中将其表示为GetStorageAt。可以使用任何语言打包程序来调用此RPCapi。

下图显示了如何对智能合约的地址和传递给它的位置值进行GetStorageAt调用。图1左侧的数字是变量的位置。对于基类型,可以将此位置传递到GetStorageAt以获取变量值。对于数组,位置将返回数组的长度。

通过将Keccack哈希传递给索引为0的GetStorageAt来解码数组索引。数组的每个后续索引位于与位置求和的哈希值处。可以认为这是访问数组的指针并增加其位置以查找每个元素,类似于C或C++。

传递给每个键的GetStoragetAt的位置值是键的keccack哈希值和映射声明的位置。对于多维映射,将密钥和变量位置递归调用Keccack哈希值。参见图1中的示例进行说明。

接下来,我们来看一个发生变量打包的示例。打包要记住的是:

1.它仅按出现顺序适用于基本变量类型。EVM将按照代码中列出的顺序在256位空间中打包尽可能多的变量。

2.每个映射和数组变量将占用一个新的插槽。

3.数组变量映射将遵循打包规则。也就是说,如果一个元素小于256位,则阵列的多个索引将占用存储阵列中的单个插槽。

图2显示并提供了发生的打包的说明。当类型的长度小于256位时,EVM尝试将其他变量打包到插槽中。EVM按列出的顺序选择要打包的变量。映射和数组始终出现在新位置。但是打包规则仍适用于解码数组索引,打包规则仍适用于存储在映射中的结构。

有关这种情况下如何存储变量的说明,请参见图2。

继承

关于继承的说明。当智能合约继承其他智能合约时,基本智能合约的存储变量将按继承顺序占据存储阵列的第一个插槽。子类的存储变量将随后出现。

结论

如前所述,我们在本文介绍的规则来解码以太坊智能合约的存储机制。在接下来的,第2部分将描述的智能合约规则编写的工具。

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

金智博客

[0:15ms0-8:172ms