http://www.7klian.com

详解以太坊虚拟机(EVM)的数据存储机制

结论
2. 每个映射和数组变量将占用一个新的插槽。
下图(图1)显示了如何对智能合约的地点和通报给它的位置值举办GetStorageAt挪用。图1左侧的数字是变量的位置。对付基范例(uint、string等),可以将此位置通报到GetStorageAt以获取变量值。对付数组,位置将返回数组的长度。
请留意,当对数字应用keccack哈希时,数字必需是0填充的64位值。
通过将Keccack哈希通报给索引为0的GetStorageAt来解码数组索引。数组的每个后续索引位于与位置求和的哈希值处。可以认为这是会见数组的指针并增加其位置以查找每个元素,雷同于C或C ++。
如前所述,我们在本文先容的法则来解码以太坊智能合约的存储机制。在接下来的,第2部门将描写的智能合约法则编写的东西。

存储机制
所有解码都是利用以太坊RPC挪用eth_getStorageAt执行的,在本文中将其暗示为GetStorageAt。可以利用任何语言打包措施(譬喻nethereum或web3j)来挪用此RPC api。
有关这种环境下如何存储变量的说明,请拜见图2。

图2显示并提供了产生的打包的说明。当范例的长度小于256位时,EVM实验将其他变量打包到插槽中。EVM按列出的顺序选择要打包的变量。映射和数组始终呈此刻新位置。可是打包法则仍合用于解码数组索引,打包法则仍合用于存储在映射中的布局。
在EVM中答允执行智能合约代码。合约状态或内存存储在智能合约地点中。可以将这种存储视为位于智能合约地点的无限长度的数据布局数组。存储机制确生存储位置没有斗嘴,并遵循一组法则。利用这些法则,我们可以解码任何合约的状态。解码存储在映射中的数据需要知道所利用的密钥。合约数据的解码利用RPC挪用eth_getStorageAt举办。

256位变量的简朴示例

担任
变量在智能合约的存储阵列中的位置由代码中呈现的顺序以及变量的巨细抉择。此位置称为插槽。假如一个变量小于256位,,则EVM会实验在空间中容纳一个以上的变量,因此一个以上的变量大概会占用存储阵列中单个插槽的空间。映射或数组将始终占据一个插槽。数组和映射元素的位置遵循一组非凡的哈希法则,本文将对此举办先容,这些法则在以太坊文档中也有描写。

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

接下来,我们来看一个产生变量打包的示例。打包要记着的是:
1. 它仅按呈现顺序合用于根基变量范例(uint128,string,int等)。EVM将凭据代码中列出的顺序在256位空间中打包尽大概多的变量。

通报给每个键的GetStoragetAt的位置值是键的keccack哈希值和映射声明的位置。对付多维映射,将密钥和变量位置递归挪用Keccack哈希值。拜见图1中的示例举办说明。

下表(表1)提供了EVM遵循的分派法则的摘要。我们将看两个智能合约的示例,并利用表1中提供的法则对其举办解码

首先让我们看一个简朴示例,所有变量都是256bit(32字节长)。这样做使我们无需思量可变变量即可查察分派。
插槽位置
关于担任的说明。当智能合约担任其他智能合约时,根基智能合约的存储变量将按担任顺序占据存储阵列的第一个插槽。子类的存储变量将随后呈现。

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

相关文章阅读