风险提示:理性看待区块链,提高风险意识!
以太坊虚拟机(EVM)的数据存储机制详解
首页 > 币界资讯 > 币种知识 2020-11-16 10:02:22
摘要
在EVM中允许执行智能合约代码。合约状态或内存存储在智能合约地址中。可以将这种存储视为位于智能合约地址的无限长度的数据结构数组。存储机制确保存储位置没有冲突,并遵循一组规则。使用这些规则,我们可以解码任何合约的状态。解码存储在映射中的数据需要知道所使用的密钥。合约数据的解码使用RPC调用eth_getStorageAt进行 。
币界网报道:

以太坊存储机制

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

插槽位置

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

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

640.webp.jpg

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中的示例进行说明。

640.webp (1).jpg

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

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

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

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

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

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

640.webp (2).jpg

继承

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

结论

如前所述,我们在本文介绍的规则来解码以太坊智能合约的存储机制。

上一篇: 比特币的价值存储功能是什么?
下一篇: 以太坊发展历史是怎么走过的?
推荐专栏
Boss Wallet Web3 Econom Pass
专注币圈最新资讯
通俗浅显地聊透Web3大事小情
读懂区块链生态与未来,尽在币界网!
热门币种
更多
币种
美元价格
24H涨跌幅
BTC比特币
60,963.61 USDT
¥435,103.38
-2.72%
ETH以太坊
3,368.69 USDT
¥24,042.67
-0.3%
BNB币安币
570.68 USDT
¥4,073.00
-0.28%
USDT泰达币
1.02 USDT
¥7.25
-0.19%
SOL
135.96 USDT
¥970.36
+7.66%
USDC
1.00 USDT
¥7.15
-0.01%
TON
7.59 USDT
¥54.14
+4.55%
XRP瑞波币
0.47720 USDT
¥3.41
+0.48%
DOGE狗狗币
0.12210 USDT
¥0.87140
+2.43%
ADA艾达币
0.39050 USDT
¥2.79
+3.88%
热搜币种
更多
币种
美元价格
24H涨跌幅
Solana
181.08 USDT
¥1,313.10
-0.85%
比特币
66068.97 USDT
¥479,099.14
-0.69%
Curve
0.2556 USDT
¥1.85
-2.44%
Filecoin
4.3368 USDT
¥31.45
-3.08%
FTX Token
1.3826 USDT
¥10.03
-2.7%
比特币SV
51.0416 USDT
¥370.13
-3.46%
狗狗币
0.1251 USDT
¥0.91
-3.32%
柚子
0.5851 USDT
¥4.24
+2.27%
Yield Guild Games
0.4729 USDT
¥3.43
-3.82%
瑞波币
0.6491 USDT
¥4.71
+8.06%
奇亚
18.711 USDT
¥135.68
-1.57%
Conflux
0.1673 USDT
¥1.21
-1.65%
最新快讯
更多
Deribit上某大宗期权用户卖出10月底看涨和看跌以太坊期权,总计500枚ETH
2024-07-31 11:46:21
半小时前3800万枚XRP从Upbit转至r4186开头地址,价值约2482万美元
2024-07-31 11:45:58
Eclipse主网现已向开发者开放,首届黑客松奖金接近5万美元
2024-07-31 11:42:34
首尔法院命令GDAC归还780万WEMIX代币给WemadeCEO
2024-07-31 11:37:21
顶峰AscendEX将上线why(WHY)
2024-07-31 11:34:05
HashKeyGlobal即将上线WLD、ENS和BLUR
2024-07-31 11:28:00
去中心化跨链资产管理平台Mycel完成种子轮融资,CVLabs等参投
2024-07-31 11:26:01
下载币界网APP