Ethereum 源码分析之EVM

本文详细解释了以太坊EVM的工作原理,包括状态转换函数、交易顺序、虚拟机组成(栈、内存、存储)、操作码、gas机制、消息调用以及异常处理。同时介绍了智能合约的创建与执行过程以及EVM的源码分析。
Ethereum_evm

以太坊虚拟机规定了从一个区块到另一个区块计算新的有效状态的规则. 以太坊的状态是一个大型的数据结构,它不仅保存所有账户和余额.而且还保存一个机器状态,它可以根据预定义的一组规则在不同的区块之间进行更改,并且可以执行任意的机器代码.

1. 以太坊的基本概念

外部用户对ETH的访问: 可以发送创建合约的交易,消息调用的交易或者查询世界状态的值.
在这里插入图片描述

交易的顺序:

交易必须要满足原子性(要么全部完成,要么就是部分完成). 且用户propose transactions存放到pending transaction pool中,然后miner通过某种方式获得记账权,决定了哪些交易被打包到区块中且区块中的交易执行顺序.然而区块之间的顺序(决定哪个区块先上链)是由共识算法决定的.

在这里插入图片描述

2. Ethereum虚拟机的基本概念
2.1. 以太坊虚拟机层:

在这里插入图片描述

以太坊虚拟机代码的生成方式:

在这里插入图片描述

包含有Solidity source、Viper source以及LLL source相关.

2.1 以太坊虚拟机的组成:

分为两个部分虚拟机状态以及存储状态.

  1. 虚拟机状态: 程序计数器(PC),内存,堆栈,可用燃料.

  2. 存储状态: 以太坊虚拟机代码,账户存储.

在这里插入图片描述

2.2 以太坊状态转换函数:

EVM的行为就像一个数学函数:在给定输入的情况,它会产生确定性的输出.因此,将以太坊更正式地描述为具有状态转换函数非常有帮助.

Y(S,T)=S'
给定一个旧的有效状态(S),和一组新的有效交易(T),以太坊状态转换函数Y(S,T),
产生新的有效输出状态S'
2.3 交易:

交易可以分为消息调用交易(sender:外部账户或者合约账户)和创建合约账户交易(sender:外部账户).

账户类型分为:外部账户(是由私钥控制的)和合约账户(保存有EVM代码和存储树).

外部账户的地址可以是由私钥生成公钥,然后对公钥求hash,然后生成160位的字节.

合约账户的地址可以是由创建合约的sender address+nonce进行RLP编码,然后kec求hash后取右边160位作为地址.
在这里插入图片描述

EVM说明:

EVM作为一个堆栈机运行,其栈的深度为1024个项。每个项目都是256位字.为了便于使用,使用256位加密技术(如Keccak-256哈希或secp256k1签名).

内存: 在执行期间,EVM会维护一个瞬态内存 (作为字可寻址的字节数组),该内存不会在交易之间持久存在.

2.4 EVM的操作码:

已经编译的智能合约字节码作为以EVM 操作码为单位执行标准的堆栈操作.如XOR,AND,ADD,SUB等等.

在这里插入图片描述

在以太坊中所有可编程计算都需要付费.单位是以gas为例. 上述可以知道gas的消耗来自:操作码的执行,从世界状态中读取数据到stack中以及消息调用(message call). Eth的操作是对栈直接操作的,不会访问状态树和存储树的.

EVM的操作码具体实现(go-ethereum\core\vm\contract.go): GetOp的实现实际上是读取Contract.Code[n],然后返回.那么Code中的每个字节都代表一个操作码.操作码的高四位表示操作码的类型,操作码的低四位表示操作码的该类型的具体操作.

在这里插入图片描述

2.5 Stack,Memory,Account Storage

栈是由1024个元素组成,每个元素是256位.

在这里插入图片描述

  1. :每个操作只能对在栈顶的的16个大小为256位的元素操作. 具体的方式:

  2. 对栈的访问只限于其顶端的16个元素(16*256bits).限制方式:允许拷贝最顶端的16个元素中的一个到栈顶,或者是交换栈顶元

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Blockchain410

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值