Solidity编程基础三
概要
本章将进行太坊虚拟机EVM的介绍、Solidity的三种数据存储位置的 区别以及不同情况下跨区域数据赋值的gas成本分析与利用等内容。
在前文讲变量、函数时,我们讲过EVM提供了四种数据结构来存储数据:Storage、Calldata、Stack、Memory。
以太坊虚拟机 EVM
EVM是以太坊用于提供Solidity合约运行的轻量级操作系统,其运行在以太坊的每个节点上。EVM的架构基于栈机器模型,这意味着 其指令集是基于栈而非寄存器来运作的,所以在开始探讨Solidity的数据存储之前,我想先介绍下以太坊虚拟机 的一些相关内容,以便更容易理解后续的部分。
EVM的内部结构大致如下图所示:
在EVM中指令的执行流程如下:当一个交易触发智能合约代码的执行时, 就会实例化一个EVM,EVM的ROM载入了要调用的合约代码。程序计数器 被清零,存储从合约账号对应的部分载入,内存清零,设置区块和环境 变量,然后代码开始执行。
数据位置
Storage、Calldata、Stack、Memory。
storage/存储
- 存储中的数据是永久存在的
- 存储是一个key/value库 存储中的数据写入区块链,因此会修改状态,这也是存储使用成本高的原因
- 当清零一个存储槽时,会返还一定数量的gas