主页 > 怎么安装imtoken > 以太坊虚拟机处理的事务包含 以太坊EVM简介

以太坊虚拟机处理的事务包含 以太坊EVM简介

怎么安装imtoken 2023-04-28 08:02:15

1 简介

首先,您需要了解以下基本概念:

1.1 什么是以太坊区块链?

以太坊可以看作是一个基于交易的状态机,一个交易代表了两个状态之间的一条有效弧线:

在这里插入图片描述

将多个交易组织打包成区块,区块是数据的封装:

在这里插入图片描述

从状态的角度来看,以太坊可以被认为是一个状态链:

在这里插入图片描述

从实现的角度来看以太坊虚拟机处理的事务包含,以太坊也可以看作是一个“BLOCKCHAIN”(区块链):

在这里插入图片描述

从账本的角度来看,以太坊也可以看作是一个“交易栈”:

在这里插入图片描述

1.2 世界的状态是什么?

世界状态(World state)是地址和账户状态的映射:

在这里插入图片描述

世界状态可以从几个角度来看:

在这里插入图片描述

1.3 什么是账户?

账户(Account)是世界状态的对象对象:

在这里插入图片描述

帐户状态可以包括 EVM 代码和帐户存储:

在这里插入图片描述

以太坊中有两种主要的账户状态:

在这里插入图片描述

在这里插入图片描述

购买以太坊挖矿机_以太坊虚拟机处理的事务包含_蚂蚁以太坊矿机e3

账户地址用160位代码表示:

在这里插入图片描述

1.4 什么是交易?

交易是经过加密签名的单一指令:

在这里插入图片描述

交易由外部参与者提交:

在这里插入图片描述

有两种有用的交易类型:

在这里插入图片描述

交易包含的字段有:

1.4.1 合约创建交易

合约创建交易如图所示:

在这里插入图片描述

1.4.2 消息调用交易

消息调用交易如图:

在这里插入图片描述

1.5 什么是消息?

消息的主要来源是:

在这里插入图片描述

消息之间的发送方和接收方可以分为以下四种场景:

在这里插入图片描述

1.6 什么是去中心化账本?

区块链不仅是一个全球共享的交易数据库:

在这里插入图片描述

区块链仍然是一个全球共享的、分散的、交易的数据库:

蚂蚁以太坊矿机e3_购买以太坊挖矿机_以太坊虚拟机处理的事务包含

以太坊 P2P 网络由去中心化节点组成:

在这里插入图片描述

外部参与者通过以太坊节点访问以太坊世界:

在这里插入图片描述

然而,实际的以太坊客户端是通过 Web3 API 访问以太坊网络的:

在这里插入图片描述

1.7 什么是原子性和顺序性?

事务的原子性是指:

在这里插入图片描述

交易顺序是指:

在这里插入图片描述

但是,交易的先后顺序并不是由交易发起时间决定的以太坊虚拟机处理的事务包含,无法保证交易的先后顺序。 由矿工决定区块中交易的顺序:

在这里插入图片描述

在这里插入图片描述

同时,区块之间的顺序由共识算法(如 PoW)决定:

在这里插入图片描述

2.虚拟机

以太坊虚拟机是一个基于堆栈的大端 VM,字长为 256 位,用于运行智能合约。 智能合约类似于普通账户,只是当收到一笔交易时,智能合约会运行EVM字节码来处理相应的计算和后续交易。

EVM 中有:

在这里插入图片描述

合约执行从字节码的开头开始。

每个操作码都被编码为一个字节,但操作码除外,它采用立即值。

所有操作码都从栈顶弹出它们的操作数并压入它们的结果。

交易的有效载荷可以是0或一定字节数的数据,用于定义与合约交互的类型,即其他附加信息:

2.1 以太坊虚拟机EVM(Ethereum Virtual Machine)

蚂蚁以太坊矿机e3_以太坊虚拟机处理的事务包含_购买以太坊挖矿机

go-ethereum 提供了 evm 命令行工具来编译和反汇编汇编代码,并执行 debug 汇编代码:

在这里插入图片描述

可以使用evm工具直接执行调试汇编代码:

在这里插入图片描述

在这里插入图片描述

对于消息调用交易,以太坊虚拟机的输入为:

相应的 EVM 输出将更新到合约账户的存储中。

在这里插入图片描述

EVM 是以太坊合约的运行环境:

在这里插入图片描述

EVM 使用简单的堆栈架构,其中:

在这里插入图片描述

EVM代码可以被各种高级语言用相应的编译器编译,例如:

EVM 代码有 2 种表示形式:

在这里插入图片描述

EVM的执行方式为:

在这里插入图片描述

EVM的机器空间没有寄存器,主要有以下三种资源:

在这里插入图片描述

2.1.1 EVM堆栈

栈中最多可以存放1024个元素,每个元素256bits。

所有的操作都是基于栈的,访问栈的指令是:

在这里插入图片描述

2.1.2 EVM中的内存

内存是线性的,可以按字节寻址。 访问内存的指令是:

购买以太坊挖矿机_以太坊虚拟机处理的事务包含_蚂蚁以太坊矿机e3

内存中的所有位置最初都定义为 0,这是明确定义的。

在这里插入图片描述

2.1.3 EVM中的(账户)存储

存储是一种键值存储,将 256 位字映射到 256 位字。

访问存储的说明是:

存储中的所有位置都初始化为 0,这是明确定义的。

2.2 消息调用

EVM可以向其他账户发送消息,消息调用深度限制不超过1024层。

在这里插入图片描述

消息调用由CALL指令触发,通过内存传递参数和返回值:

在这里插入图片描述

2.3 异常情况

EVM在执行EVM代码时会出现很多异常情况,比如:

在这里插入图片描述

2.4 Gas 和手续费

以太坊中的所有程序计算都需要付费(以gas表示):

在这里插入图片描述

例如,EVM 中的操作消耗 gas,消息调用需要更多的 gas,存储操作需要更多的 gas。

在这里插入图片描述

2.5 EVM的输入输出

外部数据通过消息调用输入EVM,EVM可以输出日志,返回值给Caller EVM。

在这里插入图片描述

输入数据的指令是:

在这里插入图片描述

2.6 字节顺序

以太坊虚拟机处理的事务包含_购买以太坊挖矿机_蚂蚁以太坊矿机e3

EVM 中的字节采用大端顺序(网络字节顺序)。

内存、输入数据、BYTE指令都使用big endian顺序,只是SIGNEXTEND指令不同。

2.6.1 内存的字节顺序

在这里插入图片描述

MSTORE8 指令是指将 LSB 字节存储到相应的位置:

在这里插入图片描述

2.6.2 输入数据的字节顺序

在这里插入图片描述

2.6.3 BYTE和SIGNEXTEND指令的字节顺序

在这里插入图片描述

2.6.4 PUSH指令的字节顺序

PUSH系列命令:PUSH1/PUSH4/PUSH32都是右对齐,大端顺序。

在这里插入图片描述

2.7 EVM指令集

EVM 指令集通常是 256 位操作。

合约创建和销毁的指令是:

哈希命令是:

换档命令是:

在EVM内部,有多个复制指令:

在这里插入图片描述

2.8 Solidity ABI(应用程序二进制接口)

在这里插入图片描述

参考

[1] 以太坊EVM图解,见github

[2] 以太坊虚拟机操作码

[3] 通过 EVM 谜题学习以太坊虚拟机操作码