Solidity存储关键词memory含义?

简介: 在以太坊Solidity中关键词memory的含义或者说作用(purpose)是什么? 在查看智能合约时,有时数组arrays用memory来声明,有时不是。

在以太坊Solidity中关键词memory的含义或者说作用(purpose)是什么?
在查看智能合约时,有时数组arrays用memory来声明,有时不是。有什么区别不同吗?

以太坊开发语言solidity中的memory

没有memory这个关键字,solidity在存储storage中声明变量。

领导Solidity开发的chriseth这么说:”你可以把存储storage看作是一个大的数组,它有一个虚拟结构,一个在运行时不能改变的结构——它是由你的智能合约中的状态变量决定的”。

也就是说,在基于智能合约级别的变量声明在智能合约创建时,存储结构是在stone中设置的,并且不能被将来的方法调用和更改。但是,存储的内容可以用state variables调用来改变。这样的调用改变了state,这就是为什么合约级变量被称为状态变量。因此,在合约级别声明的变量uint8存储变量可以更改为uint8(0~255)的任何有效值,但是uint8类型的值的slot槽位将始终存在。

如果在没有memory关键字的函数中声明变量,那么solidity将尝试使用当前已经编译好的存储结构,但会产生意想不到的结果。memory告诉solidity,以便在方法运行时为变量创建一块空间,保证其大小和结构,这样将来就可以在该方法中使用。

memory不能在合约级别使用。只有方法中使用。

以太坊虚拟机存储

以太坊虚拟机有三个可以用来存储的区域:

  • 1.第一个是storage存储,所有的智能合约状态变量都驻留在其中。每个合约都有自己的存储,它在函数调用之间是持久的,但使用起来相当昂贵。
  • 2.第二个是memory内存,这是用来保存临时值的。它在(外部)函数调用后被清除,使用起来更便宜。
  • 3.第三个是stack栈,用来保存小的局部变量。它几乎是免费使用的,但只能维护有限数量的值。

对于几乎所有类型,都不能指定它们存储的位置,因为它们每次使用时都会被复制。

所谓存储位置重要的类型是结构和数组。如果你在函数调用中传递这些变量,那么如果它们可以留在memory内存中或留在storage存储中,它们的数据就不会被复制。这意味着你可以通过调用函数中修改它们的内容,这些修改对调用方仍然可见。

存储位置的默认值取决于它关注的变量类型:

  • 状态变量总是存储在storage中。
  • 函数参数总是存储在memory中。
  • 结构struct、数组array或映射mapping类型的局部变量默认引用存储在storage
  • 在堆栈中只是存储值类型的局部变量(即,既不是array数组,也不是struct结构也不是mapping映射)。

原文:http://cw.hubwiz.com/card/c/ethereum-FAQ/1/1/2/

另外推荐一些之前的教程:

  • python以太坊,主要是针对python围绕web3.py进行区块链以太坊应用开发的讲解。
  • web3j,主要是针对java和android程序员围绕web3j库进行区块链以太坊开发的讲解。
  • php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和事件等内容。
  • 以太坊开发,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
  • 以太坊教程,主要介绍智能合约与dapp应用开发,适合入门。
相关文章
|
4月前
|
存储
18.(C进阶)数据在内存中的存储
18.(C进阶)数据在内存中的存储
|
XML Web App开发 API
关于 SAP UI5 参数 $$updateGroupId 前面两个 $ 符号的含义
关于 SAP UI5 参数 $$updateGroupId 前面两个 $ 符号的含义
|
存储 Rust JavaScript
Rust:为什么不能在同一个结构体中存储一个值和对该值的引用?(修改版)
基本把下面问题这个搞明白,就能彻底明白 Rust 语言的生命周期是怎么回事了。简而言之,生命周期不会改变你的代码,是你的生命控制生命周期,而不是生命周期在控制你的代码。换言之,生命周期是描述性的,而不是规定性的。
169 0
|
Oracle 关系型数据库
oracle按code编码长度查询代码展现层级关系(给字段前加空格)
学习oracle按code编码长度查询代码展现层级关系(给字段前加空格)
148 0
oracle按code编码长度查询代码展现层级关系(给字段前加空格)
|
Rust 算法 安全
【算法学习】1773. 统计匹配检索规则的物品数量(java / c / c++ / python / go / rust)
给你一个数组 items ,其中 items[i] = [typei, colori, namei] ,描述第 i 件物品的类型、颜色以及名称。 另给你一条由两个字符串 ruleKey 和 ruleValue 表示的检索规则。 如果第 i 件物品能满足下述条件之一,则认为该物品与给定的检索规则 匹配 : ruleKey == "type" 且 ruleValue == typei 。 ruleKey == "color" 且 ruleValue == colori 。 ruleKey == "name" 且 ruleValue == namei 。 统计并返回 匹配检索规则的物品数量
【算法学习】1773. 统计匹配检索规则的物品数量(java / c / c++ / python / go / rust)
|
Windows
【Windows 逆向】使用 CE 工具挖掘关键数据内存真实地址 ( 数据查找技巧 | 地址访问调试 | 指令选择技巧 | MOV 汇编指令含义 | 基址值搜索 ) ★
【Windows 逆向】使用 CE 工具挖掘关键数据内存真实地址 ( 数据查找技巧 | 地址访问调试 | 指令选择技巧 | MOV 汇编指令含义 | 基址值搜索 ) ★
628 0
【Windows 逆向】使用 CE 工具挖掘关键数据内存真实地址 ( 数据查找技巧 | 地址访问调试 | 指令选择技巧 | MOV 汇编指令含义 | 基址值搜索 ) ★
|
存储 Swift
Swift5.1—计算字符数量
Swift5.1—计算字符数量
297 0
Fiori应用note字段的长度截断问题分析
In AG3/001, we create a new task based on type Z003:
Fiori应用note字段的长度截断问题分析
使用ABAP memory inspector分析product 搜索内存占用
使用ABAP memory inspector分析product 搜索内存占用
178 0
使用ABAP memory inspector分析product 搜索内存占用
SAP修改标准程序MB52增加一个字段modification
在MB52的执行结果的alv的最末尾,增加一个列:供应商描述。这个修改不完全是增强,会用到点增强,但是这次修改更加深入:modification。也就是修改了SAP的标准程序的代码。为什么不完全是增强呢?因为增强的概念是:尽可能的without modify标准代码。
3429 0