主页 > imtoken官网地址是什么 > Web3 进阶系列教程之二:以太坊存储与执行

Web3 进阶系列教程之二:以太坊存储与执行

imtoken官网地址是什么 2023-01-27 06:54:38

在过去的几个教程中,我们一直在编写智能合约,并简要提到了以太坊智能合约在称为以太坊虚拟机 (EVM) 的东西中运行。

我们还顺便提到了 EVM 能够运行某些 OPCODES 并处理存在于堆栈或堆上的数据。 如果你有正式的计算机科学背景,这对你来说可能很有意义,但它对其他人究竟意味着什么?

在这个层面上以太坊私钥怎么用,我们将深入研究 EVM 执行引擎以及数据在整个交易过程中是如何存储、操作和运行的。

审查

在我们继续之前,让我们回顾一下我们在之前课程中教授的一些内容。

回顾一下,以太坊是一个基于交易的状态机。 从某个状态 s1 开始,事务处理一些数据以将世界状态转换为某个状态 s2。

以太坊为什么叫以太坊_以太坊联盟和以太坊的关系_以太坊私钥怎么用

为了对事物进行分组,交易被打包成块。 通常,每个块都会将世界状态从状态 s1 更改为 s2,并且根据块内每个事务所做的状态更改来计算转换。

当我们考虑这些状态变化时,以太坊可以被认为是一条状态链。

以太坊为什么叫以太坊_以太坊私钥怎么用_以太坊联盟和以太坊的关系

但是世界的状态是什么?

世界状况

以太坊的世界状态是地址和账户状态之间的映射。 以太坊上的每个地址都有自己的状态,可以是用户帐户 (EOA) 或智能合约。

以太坊为什么叫以太坊_以太坊私钥怎么用_以太坊联盟和以太坊的关系

每个区块本质上操纵多个账户状态,从而操纵以太坊的整体世界状态。

帐户状态

以太坊为什么叫以太坊_以太坊私钥怎么用_以太坊联盟和以太坊的关系

那么world state就是由各种account state组成的。 什么是账户状态?

以太坊联盟和以太坊的关系_以太坊私钥怎么用_以太坊为什么叫以太坊

账户状态包含一些常见的东西,比如 nonce 和余额(在 ETH 中)。 此外,智能合约包含存储哈希和代码哈希。 这两个哈希值作为独立状态树的引用,分别存储智能合约的状态变量和字节码。

以太坊为什么叫以太坊_以太坊私钥怎么用_以太坊联盟和以太坊的关系

回顾一下,以太坊上有两种类型的账户。 外部拥有账户(如 Coinbase 钱包、Metamask 钱包等)和智能合约账户。

EOA 由私钥控制,没有任何 EVM 代码。 另一方面,合约账户包含 EVM 代码,由代码本身控制,没有与之关联的私钥。

交易类型

以太坊上主要有两种类型的交易。 一个是创建新合约,另一个是发送消息。

在这里发送消息意味着进行交易,或者转移 ETH,或者调用智能合约的函数。 它们只是 EOA 可以发送的不同类型的消息。

以太坊为什么叫以太坊_以太坊联盟和以太坊的关系_以太坊私钥怎么用

当执行合约创建交易时,一个新帐户将添加到世界状态。 交易携带要创建的合约的字节码和初始化代码(即构造函数调用)。

以太坊为什么叫以太坊_以太坊联盟和以太坊的关系_以太坊私钥怎么用

另一方面,对于所有其他交易,即消息调用,现有账户的账户状态在交易后被修改。

以太坊联盟和以太坊的关系_以太坊为什么叫以太坊_以太坊私钥怎么用

以太坊联盟和以太坊的关系_以太坊为什么叫以太坊_以太坊私钥怎么用

信息

以太坊消息在两个账户之间传递。 它们主要由两件事组成——数据和价值。

data 是一组字节,表示需要进行的交易类型(转移 ETH、铸造 NFT、在 DAO 中投票等),value 是随交易转移的以太币的价值。

EOA 进行的交易会向收款人帐户发送一条消息。 合约账户也可以通过EVM代码向账户发送信息。

以太坊联盟和以太坊的关系_以太坊为什么叫以太坊_以太坊私钥怎么用

以太坊虚拟机

现在让我们谈谈EVM问题。

就像Java的JVM一样,Javascript和Python也有自己的运行环境,以太坊智能合约的运行环境就是EVM。

EVM 具有基于堆栈的架构。 对现代 CPU 架构进行了大量简化。

以太坊为什么叫以太坊_以太坊联盟和以太坊的关系_以太坊私钥怎么用

智能合约代码或 EVM 代码存在于 EVM 内的一个不可变存储位置。

对于运行时计算,例如局部变量,EVM 可以访问两个存储位置——堆栈和内存(即堆)。

EVM也可以访问持久化的世界状态以太坊私钥怎么用,即账户状态的读写,比如改变合约中的状态变量。

以太坊私钥怎么用_以太坊为什么叫以太坊_以太坊联盟和以太坊的关系

以太坊私钥怎么用_以太坊为什么叫以太坊_以太坊联盟和以太坊的关系

栈是一个简单的栈,支持PUSH/POP操作,每个栈元素为256位(32字节),最大深度为1024个元素。

内存(或堆)是一种线性内存结构,可以在运行时存储动态大小的数据,即字符串和动态数组。

账户存储是世界状态的一部分,是一个持久存储,即使在交易执行后,所做的任何更改都将继续保留在这里。

堆栈

以太坊联盟和以太坊的关系_以太坊私钥怎么用_以太坊为什么叫以太坊

堆栈是用于保存临时值的后进先出数据结构。 把它想象成一堆盘子。 您叠放在上面的盘子将首先被移除。 堆栈在整个计算机科学中用于对固定大小的数据执行快速操作,EVM 也不例外。

以太坊私钥怎么用_以太坊联盟和以太坊的关系_以太坊为什么叫以太坊

EVM 的所有操作都在堆栈上运行。 EVM 堆栈支持对堆栈的前 16 个元素进行操作,但不支持更深的元素。 其他 1008 个堆栈元素可用于存储操作数据,例如要运行的 OPCODES 等。

有趣的事实:在 Solidity 中,如果您编写的函数声明了超过 16 个局部变量,您将遇到编译错误。 由于堆栈无法处理超过前 16 个元素的数据,因此拥有超过 16 个变量意味着其中一些无法在 EVM 中进行操作。

记忆

EVM 内存是一种可线性寻址的内存,可以在字节级别进行寻址。 一次可以在内存中存储8位(1字节)或256位(32字节),但只能以256位(32字节)为单位从内存中读取。 内存用于存储实体中的动态值,例如可变长度数组、字符串等。

最初,所有内存位置的值为零。 然而,在交易执行过程中,这些值是可以被更新和修改的。

以太坊为什么叫以太坊_以太坊联盟和以太坊的关系_以太坊私钥怎么用

帐户存储

以太坊联盟和以太坊的关系_以太坊私钥怎么用_以太坊为什么叫以太坊

持久帐户存储是从 256 位密钥到 256 位值的映射。 持久存储中的所有位置最初也被定义为零(因此 Solidity 中的整数初始值为 0,布尔运算为假,字符串为空等)。

以太坊私钥怎么用_以太坊联盟和以太坊的关系_以太坊为什么叫以太坊

这些映射中的键通常称为槽。 智能合约中的每个状态变量都按照它们定义的顺序分配给帐户存储中的一个槽。

所以对于一个看起来像这样的合同:

contract Sample {
    uint256 first;
    uint256 second;
    address third;
}

第一个的插槽号为 0,第二个的插槽号为 1,第三个的插槽号为 2。

当我们在本主题后面开始学习 Solidity 中的 DELEGATECALL (.delegatecall()) 时,槽的概念将变得非常重要。

执行方式

让我们看看 EVM 中的高级执行模型。 此图起初可能有点令人困惑,但在阅读本节之后,您就会明白发生了什么。

以太坊联盟和以太坊的关系_以太坊为什么叫以太坊_以太坊私钥怎么用

以太坊私钥怎么用_以太坊联盟和以太坊的关系_以太坊为什么叫以太坊

EVM 包含一个程序计数器 (PC)。 PC,有时也称为指令指针,是一个数值,指向计算机在代码执行中的位置。

如果把 EVM 代码看成是要执行的指令列表,那么 PC 就会指向需要执行的指令。 最初,PC 指向零,这是第一条指令。 当执行该指令时,PC 将更新以指向下一条指令,依此类推。

PC 指向的指令对给定的数据执行一些操作。 这些操作发生在栈上,栈可以从内存和账户存储中读取/写入值。

我以前用过这个类比,我会再次使用它——把内存想象成你的 RAM,把账户存储想象成你的硬盘。 堆栈(指令处理器)可以从RAM和硬盘读取/写入数据,但只有对硬盘数据的修改会在代码运行后持久化,内存会被清空。

到目前为止,这与实际的 CPU 架构非常相似。 对于那些拥有正式计算机科学背景的人来说,如果你在大学里上过硬件或计算机处理器的课程,你一定学过类似的关于实际处理器如何工作的知识。 EVM 的行为也非常相似。

但是,这里有一件特别的事情。 EVM 还存储了一个计数器,表示有多少 gas 可用。 EVM 执行的每个操作都会消耗一定数量的 gas,只要有足够的 gas 运行该操作,EVM 就会继续执行操作。 如果可用 gas 低于继续运行所需的量,则整个执行将停止,交易将失败。 正如我们之前所说,这样做是为了避免 EVM 中的无限循环,这会使以太坊网络陷入停顿。 因此,对于复杂的交易,你需​​要支付更高的gas来支付执行成本。

执行期间的气体

以太坊联盟和以太坊的关系_以太坊为什么叫以太坊_以太坊私钥怎么用

突出以上几点,可以看到EOA在发送消息时,向合约账户转移了一定数量的gas。 EVM 代码运行并消耗一些 gas。 如果有任何剩余的气体,它将被退还给 EOA。

但是,如果 EVM 的代码用完了 gas,即没有提供足够的 gas,执行就会失败,交易也会失败。 在这种情况下,没有 gas 被退还,因为 EVM 仍然必须做所有这些来弄清楚 gas 供应量是多少,所以 gas 是为完成的工作收费的。

总结

以太坊是一个复杂的软件。 如果你能做到这一点,我会给你竖起大拇指。 我希望这一层有助于消除关于以太坊存储如何工作以及 EVM 如何在运行时处理数据和执行交易的一些困惑。

我们可以更深入地研究运行在 EVM 中的程序集和 OPCODES,但这值得单独写一篇文章(或更多),因为它是一个很大的话题。

参考

以太坊私钥怎么用_以太坊联盟和以太坊的关系_以太坊为什么叫以太坊

引用链接

[1] EVM 图解: