Ethereum_evm
以太坊虚拟机规定了从一个区块到另一个区块计算新的有效状态的规则. 以太坊的状态是一个大型的数据结构,它不仅保存所有账户和余额.而且还保存一个机器状态,它可以根据预定义的一组规则在不同的区块之间进行更改,并且可以执行任意的机器代码.
1. 以太坊的基本概念
外部用户对ETH的访问: 可以发送创建合约的交易,消息调用的交易或者查询世界状态的值.

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

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

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

包含有Solidity source、Viper source以及LLL source相关.
2.1 以太坊虚拟机的组成:
分为两个部分虚拟机状态以及存储状态.
-
虚拟机状态: 程序计数器(PC),内存,堆栈,可用燃料.
-
存储状态: 以太坊虚拟机代码,账户存储.

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位.

-
栈:每个操作只能对在栈顶的的16个大小为256位的元素操作. 具体的方式:
-
对栈的访问只限于其顶端的16个元素(16*256bits).限制方式:允许拷贝最顶端的16个元素中的一个到栈顶,或者是交换栈顶元

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

最低0.47元/天 解锁文章
982

被折叠的 条评论
为什么被折叠?



