以太坊存储和执行
在过去的几个轨道上,我们一直在编写智能合约,并简要地提到,以太坊智能合约在这个叫做以太坊虚拟机(EVM)的东西中运行。
我们还顺便简单地提到,EVM 能够运行某些 OPCODES,并处理堆栈或堆中存在的数据。如果你有正式的计算机科学背景,这对你来说可能是有意义的,但对其他人来说,这实际上意味着什么?
在这一层面,我们将深入挖掘 EVM 执行引擎,以及数据在整个事务过程中是如何存储、操作和运行的。
总结
在继续前进之前,让我们回顾一下我们在先前的轨道中所教授的一些东西。
回顾一下 Ethereum 作为一个基于交易的状态机工作。从某个状态 s1 开始,一个交易操作某些数据,将世界状态转移到某个状态 s2。
为了把事情组合在一起,交易被打包成块。一般来说,每个区块都会将世界状态从状态 s1 改变到 s2,而转换是根据区块内每个事务的状态变化来计算的。
当我们想到这些状态变化时,以太坊可以被认为是一个状态链。
但是,这个世界的状态是什么?
世界状态
以 太坊的世界状态是地址和账户状态之间的映射。以太坊的每个地址都有它自己的状态,这可能是一个用户账户(EOA)或一个智能合约。
每个区块基本上都会操纵多个账户状态,从而操纵以太坊的整体世界状态。
帐户状态
好吧,那么世界状态是由各种账户状态组成的。什么是账户状态?
帐户状态包含一些常见的东西,如 nonce 和余额(以 ETH 为单位)。此外,智能合约还包含一个存储哈希和一个代码哈希。这两个哈希值作为独立状态树的引用,分别存储状态变量和智能合约的字节码。
回顾一下,在 Ethereum 有两种类型的账户。外部拥有的账户(如 Coinbase 钱包,Metamask 钱包等)和智能合约账户。
EOA 的由私钥控制,没有任何 EVM 代码。另一方面,合约账户包含 EVM 代码,由代码本身控制,没有与之相关的私钥。
交易的类型
在以太坊上主要有两种类型的交易。一种是创建新合约,另一种是发送消息。
发送消息在这里意味着进行交易,要么转移 ETH,要么调用智能合约上的功能。它们只是 EOA 可以发送的不同类型的信息。
当合约创建交易完成后,一个新的账户被添加到世界状态中。该交易带有要创建的合约的字节码和初始化代码(即构造函数调用)。
另一方面,对于所有其他交易,即消息调用,现有账户的状态在交易后被修改。