主页 > imtoken苹果版国外 > 以太坊虚拟机处理的事务包含 以太坊EVM简介
以太坊虚拟机处理的事务包含 以太坊EVM简介
1 简介
首先,您需要了解以下基本概念:
1.1 什么是以太坊区块链?
以太坊可以看作是一个基于交易的状态机,一个交易代表了两个状态之间的一条有效弧线:
将多个交易组织打包成区块,区块是数据的封装:
从状态的角度来看,以太坊可以被认为是一个状态链:
从实现的角度来看以太坊虚拟机处理的事务包含,以太坊也可以看作是一个“BLOCKCHAIN”(区块链):
从账本的角度来看,以太坊也可以看作是一个“交易栈”:
1.2 世界的状态是什么?
世界状态(World state)是地址和账户状态的映射:
世界状态可以从几个角度来看:
1.3 什么是账户?
账户(Account)是世界状态的对象对象:
帐户状态可以包括 EVM 代码和帐户存储:
以太坊中有两种主要的账户状态:
账户地址用160位代码表示:
1.4 什么是交易?
交易是经过加密签名的单一指令:
交易由外部参与者提交:
有两种有用的交易类型:
交易包含的字段有:
1.4.1 合约创建交易
合约创建交易如图所示:
1.4.2 消息调用交易
消息调用交易如图:
1.5 什么是消息?
消息的主要来源是:
消息之间的发送方和接收方可以分为以下四种场景:
1.6 什么是去中心化账本?
区块链不仅是一个全球共享的交易数据库:
区块链仍然是一个全球共享的、分散的、交易的数据库:
以太坊 P2P 网络由去中心化节点组成:
外部参与者通过以太坊节点访问以太坊世界:
然而,实际的以太坊客户端是通过 Web3 API 访问以太坊网络的:
1.7 什么是原子性和顺序性?
事务的原子性是指:
交易顺序是指:
但是,交易的先后顺序并不是由交易发起时间决定的以太坊虚拟机处理的事务包含,无法保证交易的先后顺序。 由矿工决定区块中交易的顺序:
同时,区块之间的顺序由共识算法(如 PoW)决定:
2.虚拟机
以太坊虚拟机是一个基于堆栈的大端 VM,字长为 256 位,用于运行智能合约。 智能合约类似于普通账户,只是当收到一笔交易时,智能合约会运行EVM字节码来处理相应的计算和后续交易。
EVM 中有:
合约执行从字节码的开头开始。
每个操作码都被编码为一个字节,但操作码除外,它采用立即值。
所有操作码都从栈顶弹出它们的操作数并压入它们的结果。
交易的有效载荷可以是0或一定字节数的数据,用于定义与合约交互的类型,即其他附加信息:
2.1 以太坊虚拟机EVM(Ethereum Virtual Machine)
go-ethereum 提供了 evm 命令行工具来编译和反汇编汇编代码,并执行 debug 汇编代码:
可以使用evm工具直接执行调试汇编代码:
对于消息调用交易,以太坊虚拟机的输入为:
相应的 EVM 输出将更新到合约账户的存储中。
EVM 是以太坊合约的运行环境:
EVM 使用简单的堆栈架构,其中:
EVM代码可以被各种高级语言用相应的编译器编译,例如:
EVM 代码有 2 种表示形式:
EVM的执行方式为:
EVM的机器空间没有寄存器,主要有以下三种资源:
2.1.1 EVM堆栈
栈中最多可以存放1024个元素,每个元素256bits。
所有的操作都是基于栈的,访问栈的指令是:
2.1.2 EVM中的内存
内存是线性的,可以按字节寻址。 访问内存的指令是:
内存中的所有位置最初都定义为 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 字节顺序
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 谜题学习以太坊虚拟机操作码