一、在Ethereum虚拟机(EVM)中,有6种主要方式可以存储数据。这些数据存储方式具有不同的用途、特性和Gas成本。

  1. 存储(Storage):存储是EVM中永久保存数据的地方。合约的状态变量会存储在此处。对存储的读写操作相对较慢且昂贵,因为数据需要永久保存在区块链上。

storage类型的数据可以在智能合约中进行修改。storage是Ethereum区块链上永久存储数据的地方,用于保存合约的状态变量。与memorycalldata等临时存储区域不同,storage中的数据在合约的整个生命周期内保持持久化。

在Solidity智能合约中,可以通过对状态变量的赋值操作来修改storage中的数据。例如:

pragma solidity ^0.8.0;contract SimpleStorage {uint256 public storedData;function set(uint256 x) public {storedData = x;}
}

在上面的示例中,storedData是一个uint256类型的状态变量,存储在storage中。通过调用set函数并传入一个新的值,可以更新storedData的值,从而修改storage中的数据。

需要注意的是,对storage数据的修改会消耗Gas,因为这些修改需要在区块链上永久保存。因此,在编写智能合约时,务必注意优化对storage数据的操作以降低Gas成本。在某些情况下,可以考虑使用memory或其他临时存储区域来降低Gas成本,但请注意,这些临时存储区域的数据在函数执行结束后会被丢弃。

  1. 内存(Memory):内存是EVM中临时保存数据的地方。它用于在函数执行期间存储中间变量。内存的读写操作相对较快且便宜。但在函数执行完成后,内存中的数据会被丢弃,不会永久保存。
  2. 栈(Stack):栈是EVM中另一个用于临时保存数据的地方。它用于存储局部变量和操作数。栈是一种后进先出(LIFO)的数据结构,对其进行操作非常快速且便宜。但与内存一样,栈中的数据在函数执行完成后会被丢弃。
  3. 函数调用数据(Calldata):函数调用数据是传递给合约函数的输入参数。它是只读的临时存储区,类似于内存。在EVM中,访问calldata的成本较低,但不能对其进行修改。
  4. 代码(Code):代码是EVM中存储合约字节码的地方。合约代码在部署时写入区块链,随后不可更改。访问合约代码的成本较低,但只能以只读方式访问。
  5. 日志(Logs):日志是EVM中存储事件数据的地方。当合约发出事件时,相关数据会存储在日志中。日志数据在区块链上保存,但与存储不同,日志数据不能直接从合约中访问。日志主要用于在链下读取区块链事件和数据。

在编写智能合约时,了解这些数据存储方式以及它们的特性和Gas成本非常重要。选择合适的数据存储方式可以帮助优化合约性能、降低Gas成本,并提高合约的安全性。

二、其中memory、calldata、storage是我们常用到三种,其中memory、calldata是作为零时存储的,使用完可以随时丢弃掉,不会永久保存,经常在函数传参中使用,所以结构体、数组、映射被作为函数参数时必须使用到memory、calldata作为关键修饰词,否则会报错。

三、对于永久存储我们需要区别合约中的常量,常量初始化后是无法修改的,对于其他Storage存储的变量,我们多次赋值持久话,这里每次复值操作都会有gas费即发起一次交易。

在Solidity中可以定义常量。常量是在编译时确定的值,不能在运行时进行修改。在Solidity中,可以使用constantimmutable关键字来定义常量。

  1. constantconstant关键字用于定义编译时常量。这些常量的值必须是可以在编译时计算的常量表达式。constant常量可用于定义基本类型、数组和结构体的常量值。例如:
pragma solidity ^0.8.0;contract ConstantsExample {uint constant public MY_CONSTANT = 42;bytes32 constant public MY_HASH = keccak256("Hello, World!");
}

  1. immutableimmutable关键字用于定义部署时常量。这些常量的值可以在部署合约时设置,但在部署完成后不可更改。immutable常量只能用于定义基本类型(例如uintaddress等)的常量值。例如:
pragma solidity ^0.8.0;contract ImmutableExample {uint256 public immutable myImmutableValue;constructor(uint256 _value) {myImmutableValue = _value;}
}

在上面的示例中,myImmutableValue是一个immutable常量,它在合约部署时通过构造函数设置。在合约部署完成后,myImmutableValue的值将不可更改。

定义常量可以帮助提高代码的可读性和可维护性,同时减少不必要的状态修改。在适当的场景下使用常量可以提高合约的性能和安全性。

区块链学习(6)-EVM有6种方式可以存储数据相关推荐

  1. 福布斯:区块链可能改善房地产市场的五种方式

    点击上方"蓝色字"可关注我们! 暴走时评:科技进步给房地产交易带来更多可能性,区块链技术也可能改善房地产市场.具体的影响方式包括加速交易流程.增加透明性.保护在线数据存储.增加成本 ...

  2. android的数据存储方式有哪几种方式,android存储数据的几种方式比较

    机身内存读取主要用个两个类文件输入流(FileInputStream)和文件输出流(FileOutputStream):FileInputStream fileInput = this.openFil ...

  3. android的数据存储方式有哪几种方式,Android存储数据的5种方式

    第一种:SharedPreferences 1.使用键值对的方式存储数据 2.通常用于:保存用户的偏好设置.选择是否保存密码.记录文档阅读的位置等 3.实现方式(写入): a).获取SharedPre ...

  4. 区块链学习——原理入门

    刚开始学习区块链,由于刚入门,所以借鉴了一些大佬的总结,仅作个人学习使用. 刚开始了解区块链,应当对其概念有所了解,要分清链圈和币圈.首先要了解区块链的概念,原理,核心技术.随后要去读一些著作,比如& ...

  5. 月薪 100K?还不来看看区块链学习清单?字字都是 Money!

    点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! CSDN粉丝今日专属购书福利:全场书籍优惠,满100减50!仅限当日使用. 初春乍寒,又到了 ...

  6. 区块链学习笔记23——ETH反思

    区块链学习笔记23--ETH反思 学习视频:北京大学肖臻老师<区块链技术与应用> 笔记参考:北京大学肖臻老师<区块链技术与应用>公开课系列笔记--目录导航页 智能合约真的智能吗 ...

  7. 区块链学习笔记15——ETH状态树

    区块链学习笔记15--ETH状态树 学习视频:北京大学肖臻老师<区块链技术与应用> 笔记参考:北京大学肖臻老师<区块链技术与应用>公开课系列笔记--目录导航页 引入 要实现的功 ...

  8. 区块链学习路径,看这一篇就够了 | FISCO BCOS

    FISCO BCOS开源社区已沉淀过百篇文章,覆盖了区块链学习各个阶段.为了方便大家对应自身学习阶段找到合适的教程,我们按照区块链学习成长路径对社区文章进行整理排序,希望沿着这份路径规划,大家都能成为 ...

  9. 区块链学习一--初始比特币

    区块链学习–初始比特币 本文学习内容参考北京大学肖臻老师的区块链技术与应用 什么是区块链 有人说区块链是世界上最慢的数据库,其实这都是对区块链技术一种片面的理解. 一.比特币是什么? 比特币是基于区块 ...

最新文章

  1. 首先声明两者所要实现的功能是一致的(将多维数组降位一维)。这点从两个单词的意也可以看出来,ravel(散开,解开),flatten(变平)。两者的区别在于返回拷贝(copy)还是返回视图(view)
  2. hdu 3932Groundhog Build Home 【爬山算法】
  3. 参数等效模型可以用于_盘式永磁涡流驱动器的电磁温度耦合解析模型
  4. boost::math::quadrature::naive_monte_carlo用法的测试程序
  5. Effective Java之慎用重载(四十一)
  6. dell跳过开机硬件检测,关闭dell开机硬件自检 戴尔笔记本电脑每次开机自动硬件检查怎么取消?...
  7. Linux网络编程服务器模型选择之循环服务器
  8. html 点击选择变色,JS实现菜单点击后变色
  9. Java NIO问题总结
  10. 无界面和应用图标的应用程序
  11. Eclipse中最有用的快捷键组合
  12. Mysql触发器学习
  13. AutoCAD-图纸集使用方法
  14. idea类注释模板,方法注释模板。
  15. 微信群总是有人发广告?我用Python写个机器人消灭他!
  16. 项目管理软件推荐:项目计划变更管理太方便了
  17. JSON字符串如何转化成对象?
  18. HBase入门: 简介、特点、优缺点、数据结构、系统架构、入门操作、适用场景、注意事项与遇到的坑
  19. 国内镜像源使用时出现WARNING: The repository located at mirrors.aliyun.com is not a trusted or secure host and
  20. Windows XP 上网提示:您的时钟快了/慢了

热门文章

  1. explicit的作用
  2. FlatBuffer
  3. BeautifulSoup实战
  4. .odex文件的反编译
  5. 下载安装tushare
  6. ENVI遥感图像几何精校正
  7. SSL双向验证--keytool实现自签名证书
  8. The multi-part request contained parameter data (excluding uploaded files)
  9. Java毕业设计_基于SSM的美食食谱分享网站的设计与实现
  10. Idea在项目中新建项目