主页 > imtoken知乎 > 以太坊学习——以太坊虚拟机(二)

以太坊学习——以太坊虚拟机(二)

imtoken知乎 2023-07-29 05:21:14

EVM介绍

以太坊虚拟机 (EVM) 是智能合约的运行环境

参与网络的每个节点都将 EVM 作为块验证协议的一部分运行。它们查看正在验证的块中列出的事务并运行由 EVM 中的事务触发的代码

EVM不仅是一个沙箱,而且是完全隔离的,这意味着运行在EVM中的代码无法访问网络、文件系统等进程,甚至智能合约之间的访问也受到限制

合约以字节格式存储在区块链上; 合约通常用高级语言编写,由EVM编译器编译成字节码,最后通过客户端上传部署到区块链网络

EVM 和交易

交易可以看作是从一个账户发送到另一个账户的消息,它可以包含二进制数据和以太币

以太坊官网以太坊_以太坊联盟和以太坊的关系_以太坊虚拟机源代码

如果目标账户有代码,代码将在 EVM 中执行,并以 payload 作为输入参数

如果目标账户为零账户,本次交易将创建一个新合约以太坊虚拟机源代码,用于创建合约的交易payload将转换为EVM,执行的输出将作为合约代码永久保存

EVM 和气体

合约由交易触发和调用,指令会在全网的每一个节点上执行:这需要消耗算力;

一旦创建,每笔交易都会预付一定数量的gas,以限制执行交易所需的工作量并支付交易费用

以太坊联盟和以太坊的关系_以太坊官网以太坊_以太坊虚拟机源代码

EVM执行交易,gas按照特定规则逐步消耗

gas价格是交易发送方设定的一个值,作为发送方预付交易手续费的单价。交易执行后如有剩余,gas将按原路返还

EVM数据存储Storage

每个账户都有一个持久化存储空间,将256位词映射到256位词的key-value存储区,相当于合约数据库

永久保存在区块链中,由于合约状态变量永久保存,读写gas的开销非常大

以太坊联盟和以太坊的关系_以太坊虚拟机源代码_以太坊官网以太坊

记忆

每调用一次消息,合约都会临时获得一块干净的内存空间

生命周期只是在整个方法执行期间,函数调用后才被回收。 因为只保存临时变量,读写的gas开销比较小

EVM不是基于寄存器的,而是基于栈的,所以所有的计算都存在于Stack上

以太坊虚拟机源代码_以太坊联盟和以太坊的关系_以太坊官网以太坊

存储一些布局值类型变量以太坊虚拟机源代码,几乎空闲内存,数量有限

EVM指令集

所有指令都对“256 位字”的基本数据类型进行操作。

具有常用的算术、位、逻辑和比较运算,还可以进行条件跳转和无条件跳转

合约可以访问当前区块的相关属性,例如区块高度和时间戳

以太坊官网以太坊_以太坊联盟和以太坊的关系_以太坊虚拟机源代码

代表电话

一种特殊类型的消息调用

目标地址的代码将在调用合约的上下文中执行,msg.sender 和 msg.value 保持不变

“库”可以这样实现:可以将可重用的代码放在一个合约的存储上,通过委托调用引入相应的代码

合约创建和自我毁灭

合约可以通过调用带有特殊消息的 create 调用来创建其他合约

合约代码从区块链中移除的唯一方式是合约对合约地址进行自毁操作; 合约账户中剩余的以太币被发送到指定的目标,然后其存储和代码从状态中移除