EVM
基础概念
EVM,是ERC协议和运作的心脏。
简单的类比:EVM之于以太坊,正如Java虚拟机之于Java语言
我们写的java代码会被编译成字节码,但计算机无法识别字节码;java虚拟机把字节码编译成计算机系统可以识别的机器码指令,然后在计算机上运行。如下图所示:
EVM的存在是为了能让我们用Solidity编写的合约代码,运行在以太坊的环境中。这样类比的话,以太坊就相当于计算机环境,EVM把合约代码编译成以太坊能识别的机器码运行。如下图所示:
大致流程:
当智能合约被编译成二进制文件后,被部署到区块链上。用户通过调用智能合约的接口,来触发智能合约的执行操作。EVM执行智能合约的代码,修改当前区块链上的数据(状态)。被修改的数据,会被共识,确保一致性。
它实际上是完全隔离的,这意味着在EVM上运行的代码无法访问网络、文件系统和其他进程。智能合约对其他的智能合约的访问权也有限,在区块链网络上单独运作。
编写智能合约有三个主要步骤:
技术细节
EVM的存储模型
EVM是一个基于堆栈的虚拟机,具有临时内存字节数组和持久键值存储(持久存储在Storage中)。
Stack:EVM是基于栈(stack)的虚拟机,stack用来保存指令的输入输出数据,最大深度为1024个字,其中每个单元就是一个字。
临时存储Memory:内存,一个简单的内存数组,用于临时存储EVM代码运行中需要存取的各种数据,基于字进行寻址和扩展
永久存储Storage:用来保存所有合约“状态”的永久存储,由以太坊客户端独立维护,每个账户的存储区域被以“字”为单位划分为若干个“槽”(solt),合约中的状态变量会根据其具体类型分别保存到这些槽中。例如在合约创建时由EVM根据合约定义的状态变量进行初始化,将他们保存进以“字”为单位划分的“存储槽(solt storage)”中。
Storage也是作为是世界状态的一部分存在的,客户端会用一个MPT来维护其数据。
ROM:用来保存所有EVM程序代码的只读存储,由以太坊客户端独立维护。
交易在EVM的执行
输入一笔交易,内部会转换成一个Message 对象,传入EVM执行。
普通转账交易
如果是一笔普通转账交易,那么直接修改StateDB中对应的账户余额即可。
智能合约的创建或者调用
如果是智能合约的创建或者调用,则通过EVM中的解释器加载和执行字节码,执行过程中可能会查询或者修改StateDB。
1.生成Contract对象
交易会被转换成一个Message对象传入EVM,而EVM则会根据Message生成一个Contract对象以便后续执行。
2.送入解释器执行
EVM是基于栈的虚拟机,解释器中需要操作四大组件
PC:类似于CPU中的PC寄存器,指向当前执行的指令
Stack:执行堆栈,位宽为256bits,最大深度为1024
Memory:内存空间
Gas:油费池,耗光油费则交易执行失败
EVM的每条指令称为一个OpCode,占用一个字节,所以指令集最多不超过256
EVM机器语言
EVM机器语言分为特定的指令集组,例如算术运算,逻辑和比较运算,控制流,系统调用,堆栈操作和储存器操作。除典型的Bytecode操作外,EVM还必须管理帐户资讯(即地址和余额),当前gas价格和区块资讯。
通用堆栈操作
POP // 项目出栈
PUSH // 项目入栈
MLOAD // 将项目加载到记忆体中
MSTORE // 在记忆体中储存项目
JUMP // 改变程式计数器的位置
PC // 程式计数器
MSIZE // 活动的记忆体大小
GAS // 交易可用的gas数量
DUP // 复制栈项目
SWAP // 交换栈项目
<< · Back Index ·>>
本文主要盤點的田徑項目是女子跳遠,主要從奧運會和世錦賽這兩個田徑的最高級別賽事的維度考量,奧運會從1972年慕尼黑奧運會...
obey me是2019年12月发布的,游戏语言有繁中,是养卡推关的玩法。没有姐妹会拒绝顶级的文案,天花板级别的剧情和人设的,会 ...
晴时防晒,雨来遮盖,无论春夏秋冬,我们可越来越离不开伞了。既然它在我们生活中使用率如此高,你不会还是随手在超市一挑就 ...