如何使用以太坊app,以太坊的密钥怎么安装

  

  免责声明:本文旨在传递更多市场信息,不构成任何投资建议。文章仅代表作者观点,不代表火星财经官方立场。   

  

  边肖:记得要集中注意力。   

  

  来源:区块链研究实验室   

  

  以太坊存储机制   

  

  EVM允许执行智能合同代码。合同状态或记忆存储在智能合同地址中。这种存储可以被视为位于智能合约地址的数据结构的无限阵列。存储机制确保存储位置没有冲突,并遵循一组规则。使用这些规则,我们可以解码任何合同的状态。解码存储在地图中的数据需要知道所使用的密钥。协定数据的解码是通过用RPC调用eth_getStorageAt来执行的。   

  

  插槽位置   

  

  智能合约的存储数组中变量的位置由它们在代码中出现的顺序和变量的大小决定。这个位置称为插槽。如果变量少于256位,EVM将尝试在空间中容纳多个变量,因此多个变量可能会占用存储阵列中单个插槽的空间。否则数组将总是占用一个槽。数组映射元素的位置遵循一组特殊的哈希规则,本文将介绍这些规则。以太坊文档中也描述了这些规则。下表(表1)汇总了EVM遵循的分配规则。我们将查看两个智能合约的示例,并使用表1中提供的规则对它们进行解码。   

  

  256位变量的简单示例   

  

  首先,我们来看一个简单的例子。所有变量都是256位(32字节长)。这允许我们在不考虑可变变量的情况下查看分配。请注意,当将keccack哈希应用于一个数字时,该数字必须是用0填充的64位值。所有解码都是通过使用Ethereum RPC调用eth _ getStorageAt来执行的,在本文中表示为getstoraget。您可以使用任何语言打包程序来调用这个RPC api,比如nethereum或web3j。下图(图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部分将描述智能合同规则编写的工具。   

相关文章