
Geth 源码系列:存储设计及实现
在区块链的世界中,状态存储是每一个节点的「记忆核心」 — — 它记录着亿万账户的余额、合约的代码、交易的痕迹,甚至决定着一笔交易能否被正确执行。作为以太坊生态的基石,Geth 客户端如何以精密的架构设计承载海量状态数据?其存储系统如何在性能、安全与可扩展性之间找到平衡? 这篇文章是 Geth 源码系列的第二篇,通过这个系列,我们将搭建一个研究 Geth 实现的框架,开发者可以根据这个框架深入自己感兴趣的部分研究。这个系列共有六篇文章,在这第二篇文章中,将系统讲解 Geth 的存储结构设计与相关源码,介绍其数据库层次划分并详细分析各个层次中相应模块的核心功能。 以太坊作为全球最大的区块链平台,其主流客户端 Geth(Go-Ethereum)承担了绝大部分节点运行与状态管理的职责。Geth 的状态存储系统,是理解以太坊运行机制、优化节点性能、以及推动未来客户端创新的基础。 本文作者: po Web3buidler.tech Core Contributor, EthStorage Engineer Geth 底层数据库总览 自 Geth v1.9.0 版本起,Geth 将其数据库分为...

以太坊单独质押实战教程:手把手教你完成部署
内容丨Ray 编辑 & 排版丨Yewlne、环环 以太坊的单独质押(Solo Staking)是保护网络安全和去中心化的黄金标准。通过运行自己的验证者节点,您可以直接参与网络共识,获得完整的质押奖励,并保持对资金的完全控制。本教程将为您提供详细的指导,帮助您在家中部署以太坊单独质押节点,确保安全性和稳定性。前提概要首先,我们需要有这样的一个基本概念:要处理来自执行层的传入验证器存款,您需要运行执行客户端以及共识客户端。这意味着我们至少需要部署两个客户端程序(在本教程中,为三个,共识客户端按照功能进行了拆分)。如果想了解更多执行客户端和共识客户端的差异及功能职责,可以点击阅读: https://ethereum.org/zh/developers/docs/networking-layer/一、选择执行客户端以太坊生态的客户端种类非常丰富,执行客户端和共识客户端都有多种不同语言的实现,如使用 Go 语言实现的 Geth, 使用 Rust 语言实现的 Reth 等。你可以根据自己喜好,选择不同的客户端,整体流程是类似的,只是不同客户端实现涉及的命令不同。在这里,我们不能对所有的客户端...

重磅 | LXDAO 中文名正式从“良心 DAO”改为“蓝翔 DAO”!
撰文 | Bruce 编辑&排版 | Connie 图片 | Ache、Connie、Cikey重磅消息! LXDAO 今日起中文名正式从“良心 DAO”改为“蓝翔 DAO”! 让我们抓紧看看到底怎么个事儿——Web3 技术哪家强?中国就找 LXDAO!LXDAO 创办于 2022 年 6 月,至今已有快 2 年的历史,是由几位喜欢开源的开发者联合发起的一所现代化、综合性的产学研一体的 DAO 组织,主要从事 Web3 公共物品相关的教育、研发和维护。 LXDAO 以创办历史不太悠久,但实训项目齐全、师资力量雄厚、培养模式先进而闻名全国。LXDAO 超过一半的同学为程序员,是现代化 Web3 技师、高级技工的摇篮。学院概况LXDAO 现有 0 个校区(正在筹备在清迈四海搭建第一个线下校区)。我们主要在 Internet 远程学习和工作交流。面向全球 13810 个城市招生,不限语言、地区和种族,能同时容纳上百万人。 LXDAO 拥有丰富的实训项目,涵盖了 Web3 的多种主题,包括但不限于教育、公共物品、全链游戏、开源、开发者关系维护、商务合作等。 我们也跟许多国际单位联合开展一...
LXDAO 是一个专注研发的 DAO 组织,致力于构建支持有价值的公共物品和开源项目的无限循环。 LXDAO is an R&D-focused DAO dedicated to building an Infinite Cycle that supports valuable


编译丨Wodeche
编辑 & 排版丨Soleil
设计丨Daisy
本期文章由 LXDAO 翻译小组成员:Wodeche 翻译,跳校对。本书是 Absolute Essentials of Ethereum,作者是 Paul Dylan-Ennis。我们鼓励您仅将本翻译内容用于学习交流,如有途径和资源,请支持原版书籍。
英语学习-翻译小组:由 Guider 精选优质 Web3 内容,通过翻译第一手原文资料快速了解 Web3 行业基础概念、第一原则与相关资讯,同时主动学习英语。欢迎加入我们一起同行与共建!
本书为 Absolute Essentials of Ethereum(以太坊指南),作者:Paul Dylan-Ennis,全书共分为八个章节。
本书目录:
赠言
前言与致谢
第一章 介绍以太坊
第二章 以太坊 · 执行层
第三章 以太坊 · 共识层
第四章 以太坊治理和文化
第五章 去中心化自治组织(DAO)
第六章 DeFi 去中心金融
第七章 非同质化代币(NFTs)
第八章 以太坊二层网络和路线图
收尾
术语
本期内容是该书籍的第二章内容:「以太坊 · 执行层」,约 7900 字,预计阅读时间需要 30 分钟。
前一章内容可见:以太坊新手快速入门:一本书教你从0到1构建好你的以太坊知识体系
以太坊是一个去中心化的世界计算机,它的目的是作为去中心化应用程序(dApps)的计算平台。以太坊独特之处在于它不受一个可信的第三方——即用户信任以提供某些服务的中介——控制,而是由一个全球性的用户网络控制,这些用户被称为全节点,它们合作改变计算机的状态。以太坊可以被视为一个云中的共享计算机,不是由谷歌或亚马逊运行,而是由成千上万的分布式志愿者运行。全节点是运行以太坊软件客户端的用户,这些客户端执行交易并保留计算机历史记录的副本,称为区块链。为了实现这一点,一个以太坊全节点需要运行两个软件,一个执行客户端和一个共识客户端。在本章中,我们关注的是在以太坊的执行层(EL)中的执行层客户端中发生的事情。执行层(EL)是以太坊协议中与执行交易和存储世界状态有关的部分。在本章中我们将扮演一个以太坊全节点,因为这能让我们最完整地了解以太坊。
想象一下,如果我们现在停止以太坊的世界计算机。我们在这一特定时间点的快照就是世界状态。世界状态是一个数据库,它将地址映射到用户账户和应用账户(见图 2.1)。更正式地说,以太坊的世界状态是一个数据库,将以太坊地址映射到外部账户(用户账户)和合约账户(应用账户)。每有新事物发生,世界状态都需要更新。如果一个外部账户向另一个外部账户发送以太币,这会改变以太坊的世界状态。如果一个外部账户与合约账户进行交互,这同样会导致世界状态的变化。根据用户发起的所有交易,世界状态每 12 秒变化一次。

外部账户(EOA)
外部账户(EOA)是用户账户,可以创建交易,并由私钥控制。一个 EOA 并不与你的真实世界身份关联。以太坊软件不使用你的实际身份,而是使用公钥密码学为你生成一个身份。公钥密码学用于在区块链实现中建立匿名身份。外部账户由包含私钥和公钥的密钥对管理,这两者之间存在密码学关系。私钥类似于密码,它们允许访你问你自己的以太坊账户,并执行操作,如发送交易或与应用程序交互。私钥绝对不应与任何人分享。与密码不同,你完全负责自己的私钥。如果私钥遗失、被删除或被盗,则没有任何补救措施。比特币社区有一句老话:”不是你的密钥,不是你的币。”
在更技术性的层面上,一个以太坊账户的私钥是一个 256 位的数字(介于 1 到 2^256 之间)。你可以将其视为一个数量范围,庞大到几乎不可能有两个人拥有相同的数字。对于你的电脑来说,一个 256 位的数字是一长串二进制的 0 和 1,但这个二进制数字会被转换成更易于管理的十六进制形式。十六进制是 16 进 1 的数字系统,使用 0-9 和 A-F 以压缩表示大的二进制数字。
下面是一个以十六进制表示的以太坊账户私钥:a37efb76efceae747a746f64ef25f9f8f622f57d754f397705425dbe28f901b4
大多数以太坊钱包会创建一个被称为助记词的东西,它可以用来导出多个账户的私钥。我知道这听起来有点复杂,这意味着你不会经常遇到原始的私钥,而是会遇到助记词。
下面是一个助记词的样子:
heart forest bird damp abandon soap bird holiday poverty expire grant keep
大多数以太坊钱包将使用助记词,从中你可以推导出许多个别账户。这意味着你可以拥有唯一的助记词,但却有多个生成的账户。
身份等式的另一方是公钥。正式地说,公钥(Public Key)是使用椭圆曲线加密法(ECC)从私钥生成的一组坐标。ECC 算法是单向的。我可以从一个私钥生成一个公钥并展示给你看,但你无法从公钥逆向工程回到私钥。
公钥密码学使我们能够建立一个数字签名方案。数字签名(Digital Signature)是使用私钥对交易进行加密签名的一种方式。公钥可以用来验证数字签名。
以下是数字签名方案的详细步骤:
i. 软件创建私钥。
ii. 软件从私钥派生出公钥。
iii. 用户用其私钥对交易进行数字签名。
iv. 网络使用公钥验证数字签名确实来自于私钥。
以太坊交易被发送到以太坊地址。非正式地讲,以太坊地址是账户的标识符。正式地讲,以太坊地址是从公钥的最后 20 字节派生出来的 42 个字符的十六进制标识符,以 0x 为前缀。
下面是一个地址示例:
0x5e16Fa36555B428823d3Ed32aa7CbB07a92F301B
在以太坊的路线图中,有计划过渡到一种更直观、更用户友好的账户体验,称为账户抽象(Account Abstraction)。在你阅读这篇文章的时候,它可能已经实现了。

外部账户(Externally-Owned Accounts, EOA)具有一个以太坊地址和一个相关联的账户状态 [2]。EOA 包含两个字段:Nonce 和 Balance。以太坊账户中的 Nonce 是一个递增的数字,显示账户进行了多少次交易以及创建了多少个合约。Nonce 用于确定同一时隙内交易的顺序。Balance 是账户持有的以太币(ETH)数量。我们可以推断,对世界状态的跟踪部分是为了跟踪当前的交易计数和 EOA 的余额(见图 2.2)。
合约账户
要理解合约账户,我们首先需要了解合约账户的用途,即智能合约。直观地说,智能合约是可以在以太坊上运行的程序。你可以将它们看作是设计时考虑到以太坊独特属性的计算机程序。在这个背景下,智能合约吸引人的地方在于我们知道智能合约的代码对每个人都会以相同的方式执行,这使它们是确定性的。确定性意味着同样的输入对一个用户将产生对另一个用户相同的结果。这就是协议或合约。不那么直观的说法是,智能合约是一组称为操作码的指令。操作码(Opcodes)是以太坊虚拟机(EVM)(稍后详细介绍)要处理的指令或命令。例如,前三个操作码是 STOP(停止执行)、ADD(加法操作)和 MUL(乘法)。智能合约是用以太坊专用的高级编程语言编写的,如 Solidity 和 Vyper。这些语言与你可能已经熟悉的编程语言如 JavaScript 或 Python 类似。Solidity 是最流行的,我将以它为例进行讲解。Solidity 合约代码在部署前会被编译成 EVM字节码。EVM 字节码是以太坊世界计算机可以读取和执行的低级编程语言。这听起来复杂,但实际上只意味着开发者用人类更好理解的高级语言如 Solidity 编写代码,而 EVM 则用低级的“计算机”语言 EVM 字节码来读取和执行。字节码中的“字节”部分指的是每个操作码指令是一个字节,一小块数据 [3]。

合约账户(Contract Accounts)是已经部署在以太坊上的智能合约,由它们自身的内部代码控制(图 2.3)。合约账户拥有一个以太坊地址和一个相关联的账户状态。合约账户的状态包含四个字段:Nonce、Balance、Code 和 Storage。Nonce 是一个递增的数字,显示这个合约账户创建了多少个合约 [4]。Balance 显示合约账户下所拥有的以太币数量。Code 是账户中包含的智能合约代码。当合约账户被创建时,智能合约的代码会被哈希处理并永久存储在区块链上,这意味着它是不可变的。每当一个外部账户触发合约账户时,以太坊虚拟机(EVM)会提取这段代码并基于交易中的输入运行它。最后,合约账户具有存储。存储(Storage)映射了合约账户的内容。当处理涉及合约账户的交易时,变更将被永久记录在合约的存储中。
在以太坊中,主要有两种类型的交易。第一种是消息调用(Message Call)。来自外部账户的消息调用传达了一个希望在以太坊世界状态中进行的改变。这两个改变字段是价值(Value)和输入数据(Input Data)。通过价值字段,一个 EOA 发送以太币给另一个 EOA 请求更新发送者自己和接收者(无论是 EOA 还是合约账户)在世界状态中的账户余额。输入数据字段是一个包含交易附加信息的十六进制字符串。根据交易类型,输入数据有两种类型。EOA 与 EOA 的交易可以在此字段中包含任意数据,可能是发送消息或标记一个交易。然而,在 EOA 与 EOA 的交易中,该字段通常留空。EOA 与合约,或合约与合约的交易使用该字段去容纳要调用的合约的代码以及对存储的任何建议更改。最后要注意的是,EOA 还可以使合约账户相互作用,但最初交易必须始终由 EOA 发起。
第二种类型的交易是合约创建(Contract Creation),它要求在以太坊的世界状态中添加一个新的合约账户。合约创建交易被发送到一个空地址,因为没有接收方。一旦初始化,被创建的合约的地址是交易发送方地址与其账户最新 Nonce 的组合。
以太币和交易费
以太坊区块链的货币称为以太,它的货币符号是 ETH(发音类似于 Teeth中的 -eth)。货币单位是 1 以太(ETH),它可以被细分为 wei,以太币的最小单位:
· wei 1
· ada 10^9
· babbage 10^6
· shannon / gwei 10^9
· szabo 10^12
· finney 10^15
· ether 10^18
在现实中,大多数人只会接触到 wei, gwei, 和 ether。Gwei 用于表示交易费用。
以太坊团队曾决定进行以太币的预售 [5]。预售持续了 42 天(2014 年 7 月22 日至 2014 年 9 月 2 日),投资者最初可以用 1 比特币购买 2000 个以太币,14 天后 1 个比特币可以购买 1337 个以太币。预售期间共有 6000 万个以太币供投资者购买,此外还有大约 1200 万个以太币被留给联合创始人、早期贡献者和以太坊基金会(一个致力于构建以太坊生态系统的非营利组织)。预售筹集了大约 1830 万美元。在撰写本文时,已发行约 1.2 亿个以太币。
以太币的实际用途是支付交易费。以下讨论涉及自 2021 年 8 月伦敦升级/EIP-1559 以来的以太坊交易费。我之所以强调这一点,是因为在网上你会经常看到一些对 2021 年之前的情况的解释。
为了理解交易费用,我们需要理解“燃料消耗(Gas Cost)"和“燃料费(Gas Fee)"之间的区别。在以太坊中,计算周期以“燃料”为单位。燃料单位与货币单位不同。燃料消耗只与需要的计算周期数量有关。交易中的每条计算指令(一个操作码)都有相应的燃料消耗。最常见的的是交易的消耗:21000 燃料。然而,与合约账户的互动将涉及更多的操作码指令和更多的燃料消耗。ADD(加法)消耗 3 燃料。DIV(除法)消耗 5 燃料。BALANCE(余额查询)消耗 700 燃料,等等。当用户发送交易时,他们会附加一个燃料上限(Gas Limit),燃料上限是用户愿意为计算单位支付的最大燃料数量。
每消耗一个单位的燃料,将产生一笔燃料费(Gas Fee)。燃料费用于支付燃料单位,并以小额的以太币计算,称为 gwei(十亿 wei 或0.0000000001 ETH)。燃料费有两种形式。基础费用(Base Fee)是指以太坊网络中 gwei 的算法动态成本。用户还可以决定支付优先费用(Priority Fee)。优先费用是用户可以支付的额外 gwei 金额,以使其交易被更快地接受。总的交易费用由燃料消耗 *(基础费用 + 优先费用)来计算。假设我想向另一个外部账户(EOA)发送 2 以太币。每个EOA 到 EOA 交易的燃料消耗是 21000。我需要 21000 个燃料单元以进行计算。每个燃料单元当前的基础费用是 15 gwei。我决定包括 2 gwei的优先费用。要找出总的交易费用,我们需要 21000 的燃料消耗 *(15 gwei 基础费用 + 2 gwei 优先费用)= 357000 gwei,即 0.000357 个以太币。我将总共发送 2.000357 个以太币。用户可以限制他们愿意支付的最大费用,如果交易成本较低,他们将得到退款 [6]。用户可以手动自定义费用,但大多数以太坊客户端和钱包软件会自动计算这些费用。
自伦敦升级/EIP-1559 以来的交易费用具有有趣的经济动态。基础费用被烧毁并从流通中移除。优先费用支付给我们将在下一章讨论的叫做验证者的用户。其原理是在最佳条件下,费用的燃烧率应超过支付给验证者的奖励。这应该会减少 ETH 的总供应量,使其变得更稀有,因此更有价值。这被称为“ultra sound money(双关语,可被理解为超声波货币或超稳健货币)”理论。
交易结构
综合以上信息,我们可以看到以太坊交易包含以下信息:
· 发送方(From)[7]:发送方地址。
· 接收方(To):接收方地址。
· 数字签名(Digital Signature):使用发送方的私钥产生的数字签名。
· Nonce:显示一个账户进行了多少次交易。
· 交易数量(Value):将要转移的ETH数量。
· 输入数据(Input Data):输入数据(消息调用);初始化(合约创建)。
· 燃料上限(Gas Limit):燃料上限。
· 最大优先费用(Max Priority Fee):你将支付的最大优先费用。
· 最大手续费(Max Fee):你将支付的最大总费用。
以太坊虚拟机(EVM)负责在以太坊上执行交易。虚拟机是操作系统(OS)的仿真。想象一下,我正在运行 Windows 操作系统,但也想在同一台计算机上运行 Linux 操作系统。一种方法是通过硬盘分区同时安装这两个系统。然而,也可以使用虚拟机软件在一个操作系统内模拟另一个操作系统。以太坊采用了这种虚拟机概念并对其进行了调整。以太坊客户端开发者创建执行软件客户端,如 Geth 或 Nethermind,它们遵循相同的广泛规范来执行交易。运行这些软件时,EVM 被模拟在用户自己的硬件上,就像 Linux 或 Windows 操作系统一样。EVM 的任务是处理最近的交易,以实现向新的世界状态的转换。世界状态需要每 12 秒更改一次。在每个 12 秒的时隙内,一个被称为 "区块提议者 "的用户会被选中,在一个被称为 "区块 "的数据结构中提议下一个状态。
以太坊虚拟机(EVM)是协调状态转换的中央处理器(CPU)(图2.4)。状态转换函数(State Transition Function)指的是将以太坊从一个世界状态移动到另一个世界状态的各种操作。简单的 EOA 对 EOA 的交易相对容易处理,只需要通过一系列有效性标准,如具有有效的签名、有效的 Nonce 和足够的燃料。然而,涉及合约账户的交易更为复杂,需要 EVM 全方位的功能。

现在我们来想象一下,我们有一笔从外部账户(EOA)到合约账户的消息调用(Message Call)交易。对于以太坊虚拟机(EVM)来说,最重要的字段是输入数据(Input Data),因为它包含了我们想要调用的函数和我们想要传递的参数。在 Solidity 中,输入数据字段遵循应用二进制接口(ABI)格式。ABI 一种标准,告诉智能合约如何解释输入数据字段。函数是智能合约可以执行的命令,在 ABI 规范中是通过引用 MethodID 来识别函数。参数是请求的更改,例如要发送到的特定地址或要发送的值。例如,这是一个输入数据字段在 ABI 格式 [8] 中的样子:

在这个合约的代码中,我们可以看到转账函数,它有自己的 MethodID,以及涉及的参数,这里的例子中包括一个接收者地址和一个数值。实参是我们希望改变的具体信息,其中 [0] 是接收者地址,[1] 是数值。
在字节码中,我们可以看到 MethodID 在前,然后是两个实参:

交易中输入数据字段的内容被称为调用数据(Call Data)。
以太坊虚拟机(EVM)使用以下方式解释和执行输入数据(Input Data)字段:· 虚拟只读存储器(Virtual Read-Only Memory, ROM):读取(但不覆写)涉及合约账户的代码。这是合约账户中包含的不可变代码,内含合约应如何操作的指令。
接下来是机器状态。这仅意为处理交易的临时状态。它包括:· 程序计数器(Program Counter):程序计数器跟踪合约代码中的哪些指令在下一步需要被处理。· 堆栈(The Stack):EVM 使用基于堆栈的模型执行代码。堆栈是后进先出(LIFO)的架构。操作码被推送到堆栈顶部,执行后弹出,然后被下一个替换。· EVM 内存(EVM Memory):在机器状态中使用的临时内存,用来跟踪变化,一旦交易处理完毕就会被丢弃。· 燃料计数器(Gas Counter):跟踪使用的燃料。如果没有更多燃料可用,将回退并撤销提议的状态变更。
临时机器状态的结果将使合约账户的存储(Storage)发生永久变化。· 存储:变更被永久记录,以反映由临时机器状态产生的新世界状态。
一旦交易被处理,EVM 将继续处理下一个交易,整个过程重新开始。EVM 将依次运行所有交易,直到没有剩余的交易。它生成一个执行有效载荷(Execution Payload)。执行有效载荷是 EVM 状态转换函数的输出摘要。
智能合约有多种形式,但我们可以通过两种常见的格式来说明它们:ERC-20 和 ERC-721。请记住,这并不意味着它们是唯一的合约类型。因为以太坊允许开发者自由地创建合约应用,所以要列出所有类型是不可能的。请注意,我的两个例子都以 ERC 开头。这代表以太坊意见征求稿(Ethereum Request for Comment),后面跟着一个独立的数字。ERC 是以太坊中的应用模板。它们有效地概述了一个基础的代码标准,用于构建其他人可以借鉴、调整或扩展的东西。拥有这些广泛的模板非常有用,因为几乎对 Solidity 有基本的了解(有时即使没有)的任何人都可以用这种格式作为基础,快速启动新项目。这里讨论的两个 ERC 是关于代币的,但 ERC 并不必须与代币相关。
ERC-20
ERC-20 代币标准创建了同质化的代币。同质化意味着这些代币将是“等同的(like-for-like)”。我创建的任何代币都将等同于其他任何代币。这与你口袋里的钱、卡上的钱或手机里的钱是一样的。我是否用某个特定的美元或欧元买牛奶,这并不重要。当智能合约开发者想要在 Solidity 中创建一个同质化代币时,他们可以借用 ERC-20 智能合约模板。代码将描述有关代币的重要细节(如名称、总供应量等),然后是外部账户(EOA)可以调用的功能(转移代币、查询余额、查询名称、查询供应量等)。一旦 ERC-20 智能合约被部署,这段代码就成为智能合约账户中的代码(The Code)。这是不可篡改的代码,当 EVM 需要知道合约应如何运行时,它会在其虚拟只读内存(ROM)中调用这个代码。ERC-20 中的存储(Storage)是一个数据库,在合约账户内部将 EOA 地址与 ERC-20 代币余额进行映射。每当 EOA 通过 Input Data 对合约账户进行消息调用时,比如转移代币,EVM 将调用所需的代码来相应地更改存储(Strorage)或者简单来说,来自用户的一笔交易导致应用中的代币余额发生变化。ERC-20 代币不仅仅被用作货币。在后续章节中,我们将看到它们被以巧妙的方式使用,包括作为区块链社区中的治理或投票代币。
ERC-721
ERC-721 代币标准与 ERC-20 标准相似,但核心区别在于 ERC-721 旨在创建非同质化代币(NFTs)。与 ERC-20 代币不同,ERC-721 代币都是独一无二的。每个 ERC-721 代币都将拥有一个独特的标识符,通常是作为整数的 TokenID。NFT 可能会有存储在链上的关联元数据,这些元数据使其具有进一步的独特性,但大多数 NFT 合约使用一个 TokenURI,它链接到与 NFT 相关联的元数据或外部存储的图像。这可能包括外部存储服务,如点对点(P2P)的星际文件系统(IPFS)存储协议或甚至亚马逊网络服务(AWS)。可以为单一物品创建合约,但通常,一个 NFT 智能合约会构建一个类型统一但彼此具有独特差异的物品集合(例如,10000 只企鹅,但每只企鹅都有略有不同的元数据特征和图像)。当智能合约开发者创建一个 NFT 项目时,他们将说明关于这个 NFT 的重要细节(系列名称、总供应量等)以及 EOA 钱包可以调用的功能(铸造代币、转移代币、查询余额、查询名称、查询供应量等)。当一个 NFT 项目正常启动时,通常会有一个铸造 NFT 的功能。在这之后,NFT 可以在用户之间出售和转移,合约的存储将映射这些信息。
去中心化应用程序
在以太坊的语境中,去中心化应用程序(Decentralised Applications,dApp)指的是智能合约以及为了增强用户体验而与之结合的非区块链技术。在 dApps 中,合约账户的体验以某种方式进行了中介处理。大多数智能合约协议都有用户友好的前端,通常是传统网站的形式。例如,Uniswap 的智能合约包含了代币置换的功能。但为了与智能合约进行交互,Uniswap 创建了一个网站,使得这个过程比直接与智能合约交互更简单。另一个例子是无聊猿游艇俱乐部(Bored Ape Yacht Club, BAYC)的智能合约。该智能合约包含了铸造和转移一种名为无聊猿(Bored Ape)的资产的功能,但无聊猿的图像并未存储在合约账户中,而是使用了一个外部的点对点(P2P)文件存储系统。由于在以太坊上存储可能非常昂贵,因此合理地扩展这个特定 dApp 的存储选项是有意义的。智能合约和 dApp 这两个术语通常被混用,但我认为理解这两者(以太坊原生智能合约和该合约与非区块链服务结合而成的扩展)之间的区别是有价值的。
[1] 不同的以太坊软件客户端以不同的方式存储“原始”数据库。例如,Geth 执行客户端以 LevelDB 数据库的形式存储。
[2] 以太坊使用递归长度前缀(Recursive Length Prefix,RLP)编码来序列化信息,如账户的状态。这种技术将每个字段所需的值放入一个二进制形式的序列中。例如,被序列化的外部账户(EOA)将包括一个 Nonce 值和一个 Balance 值。被序列化的合约将有 Nonce、Balance、Code 和Storage。以太坊还在其他地方(如交易)使用这种技术。共识层有自己的版本,称为简单序列化(SSZ)。
[3] 八个二进制位,它在十六进制中被表示为两个字符。
[4] 这里不需要过度思考,合约账户本身不能创建交易,必须通过 EOA 触发运行它们的代码。它们可以执行的类似交易的唯一事情是创建合约,但始终需要 EOA 作为发起交易的提示。
[5] 参见 Buterin V (2014) 启动以太销售。可在以下网址查看:https://blog.ethereum.org/2014/07/22/launching-the-ether-sale
[6] 具体来说,他们可以设置自己愿意支付的最大优先费用或总费用
[7] 从技术上讲它不被包括在交易中,但容易推断出来,也在大多数区块浏览器中被显示。
[8] 这笔交易是真实的,你可以自己查看。我随机抽取了它:https://etherscan.io/tx/0xa47c82ba29272d82e1de8eec0e287b4584db0c505846a36088e9832cf0b94ca3


编译丨Wodeche
编辑 & 排版丨Soleil
设计丨Daisy
本期文章由 LXDAO 翻译小组成员:Wodeche 翻译,跳校对。本书是 Absolute Essentials of Ethereum,作者是 Paul Dylan-Ennis。我们鼓励您仅将本翻译内容用于学习交流,如有途径和资源,请支持原版书籍。
英语学习-翻译小组:由 Guider 精选优质 Web3 内容,通过翻译第一手原文资料快速了解 Web3 行业基础概念、第一原则与相关资讯,同时主动学习英语。欢迎加入我们一起同行与共建!
本书为 Absolute Essentials of Ethereum(以太坊指南),作者:Paul Dylan-Ennis,全书共分为八个章节。
本书目录:
赠言
前言与致谢
第一章 介绍以太坊
第二章 以太坊 · 执行层
第三章 以太坊 · 共识层
第四章 以太坊治理和文化
第五章 去中心化自治组织(DAO)
第六章 DeFi 去中心金融
第七章 非同质化代币(NFTs)
第八章 以太坊二层网络和路线图
收尾
术语
本期内容是该书籍的第二章内容:「以太坊 · 执行层」,约 7900 字,预计阅读时间需要 30 分钟。
前一章内容可见:以太坊新手快速入门:一本书教你从0到1构建好你的以太坊知识体系
以太坊是一个去中心化的世界计算机,它的目的是作为去中心化应用程序(dApps)的计算平台。以太坊独特之处在于它不受一个可信的第三方——即用户信任以提供某些服务的中介——控制,而是由一个全球性的用户网络控制,这些用户被称为全节点,它们合作改变计算机的状态。以太坊可以被视为一个云中的共享计算机,不是由谷歌或亚马逊运行,而是由成千上万的分布式志愿者运行。全节点是运行以太坊软件客户端的用户,这些客户端执行交易并保留计算机历史记录的副本,称为区块链。为了实现这一点,一个以太坊全节点需要运行两个软件,一个执行客户端和一个共识客户端。在本章中,我们关注的是在以太坊的执行层(EL)中的执行层客户端中发生的事情。执行层(EL)是以太坊协议中与执行交易和存储世界状态有关的部分。在本章中我们将扮演一个以太坊全节点,因为这能让我们最完整地了解以太坊。
想象一下,如果我们现在停止以太坊的世界计算机。我们在这一特定时间点的快照就是世界状态。世界状态是一个数据库,它将地址映射到用户账户和应用账户(见图 2.1)。更正式地说,以太坊的世界状态是一个数据库,将以太坊地址映射到外部账户(用户账户)和合约账户(应用账户)。每有新事物发生,世界状态都需要更新。如果一个外部账户向另一个外部账户发送以太币,这会改变以太坊的世界状态。如果一个外部账户与合约账户进行交互,这同样会导致世界状态的变化。根据用户发起的所有交易,世界状态每 12 秒变化一次。

外部账户(EOA)
外部账户(EOA)是用户账户,可以创建交易,并由私钥控制。一个 EOA 并不与你的真实世界身份关联。以太坊软件不使用你的实际身份,而是使用公钥密码学为你生成一个身份。公钥密码学用于在区块链实现中建立匿名身份。外部账户由包含私钥和公钥的密钥对管理,这两者之间存在密码学关系。私钥类似于密码,它们允许访你问你自己的以太坊账户,并执行操作,如发送交易或与应用程序交互。私钥绝对不应与任何人分享。与密码不同,你完全负责自己的私钥。如果私钥遗失、被删除或被盗,则没有任何补救措施。比特币社区有一句老话:”不是你的密钥,不是你的币。”
在更技术性的层面上,一个以太坊账户的私钥是一个 256 位的数字(介于 1 到 2^256 之间)。你可以将其视为一个数量范围,庞大到几乎不可能有两个人拥有相同的数字。对于你的电脑来说,一个 256 位的数字是一长串二进制的 0 和 1,但这个二进制数字会被转换成更易于管理的十六进制形式。十六进制是 16 进 1 的数字系统,使用 0-9 和 A-F 以压缩表示大的二进制数字。
下面是一个以十六进制表示的以太坊账户私钥:a37efb76efceae747a746f64ef25f9f8f622f57d754f397705425dbe28f901b4
大多数以太坊钱包会创建一个被称为助记词的东西,它可以用来导出多个账户的私钥。我知道这听起来有点复杂,这意味着你不会经常遇到原始的私钥,而是会遇到助记词。
下面是一个助记词的样子:
heart forest bird damp abandon soap bird holiday poverty expire grant keep
大多数以太坊钱包将使用助记词,从中你可以推导出许多个别账户。这意味着你可以拥有唯一的助记词,但却有多个生成的账户。
身份等式的另一方是公钥。正式地说,公钥(Public Key)是使用椭圆曲线加密法(ECC)从私钥生成的一组坐标。ECC 算法是单向的。我可以从一个私钥生成一个公钥并展示给你看,但你无法从公钥逆向工程回到私钥。
公钥密码学使我们能够建立一个数字签名方案。数字签名(Digital Signature)是使用私钥对交易进行加密签名的一种方式。公钥可以用来验证数字签名。
以下是数字签名方案的详细步骤:
i. 软件创建私钥。
ii. 软件从私钥派生出公钥。
iii. 用户用其私钥对交易进行数字签名。
iv. 网络使用公钥验证数字签名确实来自于私钥。
以太坊交易被发送到以太坊地址。非正式地讲,以太坊地址是账户的标识符。正式地讲,以太坊地址是从公钥的最后 20 字节派生出来的 42 个字符的十六进制标识符,以 0x 为前缀。
下面是一个地址示例:
0x5e16Fa36555B428823d3Ed32aa7CbB07a92F301B
在以太坊的路线图中,有计划过渡到一种更直观、更用户友好的账户体验,称为账户抽象(Account Abstraction)。在你阅读这篇文章的时候,它可能已经实现了。

外部账户(Externally-Owned Accounts, EOA)具有一个以太坊地址和一个相关联的账户状态 [2]。EOA 包含两个字段:Nonce 和 Balance。以太坊账户中的 Nonce 是一个递增的数字,显示账户进行了多少次交易以及创建了多少个合约。Nonce 用于确定同一时隙内交易的顺序。Balance 是账户持有的以太币(ETH)数量。我们可以推断,对世界状态的跟踪部分是为了跟踪当前的交易计数和 EOA 的余额(见图 2.2)。
合约账户
要理解合约账户,我们首先需要了解合约账户的用途,即智能合约。直观地说,智能合约是可以在以太坊上运行的程序。你可以将它们看作是设计时考虑到以太坊独特属性的计算机程序。在这个背景下,智能合约吸引人的地方在于我们知道智能合约的代码对每个人都会以相同的方式执行,这使它们是确定性的。确定性意味着同样的输入对一个用户将产生对另一个用户相同的结果。这就是协议或合约。不那么直观的说法是,智能合约是一组称为操作码的指令。操作码(Opcodes)是以太坊虚拟机(EVM)(稍后详细介绍)要处理的指令或命令。例如,前三个操作码是 STOP(停止执行)、ADD(加法操作)和 MUL(乘法)。智能合约是用以太坊专用的高级编程语言编写的,如 Solidity 和 Vyper。这些语言与你可能已经熟悉的编程语言如 JavaScript 或 Python 类似。Solidity 是最流行的,我将以它为例进行讲解。Solidity 合约代码在部署前会被编译成 EVM字节码。EVM 字节码是以太坊世界计算机可以读取和执行的低级编程语言。这听起来复杂,但实际上只意味着开发者用人类更好理解的高级语言如 Solidity 编写代码,而 EVM 则用低级的“计算机”语言 EVM 字节码来读取和执行。字节码中的“字节”部分指的是每个操作码指令是一个字节,一小块数据 [3]。

合约账户(Contract Accounts)是已经部署在以太坊上的智能合约,由它们自身的内部代码控制(图 2.3)。合约账户拥有一个以太坊地址和一个相关联的账户状态。合约账户的状态包含四个字段:Nonce、Balance、Code 和 Storage。Nonce 是一个递增的数字,显示这个合约账户创建了多少个合约 [4]。Balance 显示合约账户下所拥有的以太币数量。Code 是账户中包含的智能合约代码。当合约账户被创建时,智能合约的代码会被哈希处理并永久存储在区块链上,这意味着它是不可变的。每当一个外部账户触发合约账户时,以太坊虚拟机(EVM)会提取这段代码并基于交易中的输入运行它。最后,合约账户具有存储。存储(Storage)映射了合约账户的内容。当处理涉及合约账户的交易时,变更将被永久记录在合约的存储中。
在以太坊中,主要有两种类型的交易。第一种是消息调用(Message Call)。来自外部账户的消息调用传达了一个希望在以太坊世界状态中进行的改变。这两个改变字段是价值(Value)和输入数据(Input Data)。通过价值字段,一个 EOA 发送以太币给另一个 EOA 请求更新发送者自己和接收者(无论是 EOA 还是合约账户)在世界状态中的账户余额。输入数据字段是一个包含交易附加信息的十六进制字符串。根据交易类型,输入数据有两种类型。EOA 与 EOA 的交易可以在此字段中包含任意数据,可能是发送消息或标记一个交易。然而,在 EOA 与 EOA 的交易中,该字段通常留空。EOA 与合约,或合约与合约的交易使用该字段去容纳要调用的合约的代码以及对存储的任何建议更改。最后要注意的是,EOA 还可以使合约账户相互作用,但最初交易必须始终由 EOA 发起。
第二种类型的交易是合约创建(Contract Creation),它要求在以太坊的世界状态中添加一个新的合约账户。合约创建交易被发送到一个空地址,因为没有接收方。一旦初始化,被创建的合约的地址是交易发送方地址与其账户最新 Nonce 的组合。
以太币和交易费
以太坊区块链的货币称为以太,它的货币符号是 ETH(发音类似于 Teeth中的 -eth)。货币单位是 1 以太(ETH),它可以被细分为 wei,以太币的最小单位:
· wei 1
· ada 10^9
· babbage 10^6
· shannon / gwei 10^9
· szabo 10^12
· finney 10^15
· ether 10^18
在现实中,大多数人只会接触到 wei, gwei, 和 ether。Gwei 用于表示交易费用。
以太坊团队曾决定进行以太币的预售 [5]。预售持续了 42 天(2014 年 7 月22 日至 2014 年 9 月 2 日),投资者最初可以用 1 比特币购买 2000 个以太币,14 天后 1 个比特币可以购买 1337 个以太币。预售期间共有 6000 万个以太币供投资者购买,此外还有大约 1200 万个以太币被留给联合创始人、早期贡献者和以太坊基金会(一个致力于构建以太坊生态系统的非营利组织)。预售筹集了大约 1830 万美元。在撰写本文时,已发行约 1.2 亿个以太币。
以太币的实际用途是支付交易费。以下讨论涉及自 2021 年 8 月伦敦升级/EIP-1559 以来的以太坊交易费。我之所以强调这一点,是因为在网上你会经常看到一些对 2021 年之前的情况的解释。
为了理解交易费用,我们需要理解“燃料消耗(Gas Cost)"和“燃料费(Gas Fee)"之间的区别。在以太坊中,计算周期以“燃料”为单位。燃料单位与货币单位不同。燃料消耗只与需要的计算周期数量有关。交易中的每条计算指令(一个操作码)都有相应的燃料消耗。最常见的的是交易的消耗:21000 燃料。然而,与合约账户的互动将涉及更多的操作码指令和更多的燃料消耗。ADD(加法)消耗 3 燃料。DIV(除法)消耗 5 燃料。BALANCE(余额查询)消耗 700 燃料,等等。当用户发送交易时,他们会附加一个燃料上限(Gas Limit),燃料上限是用户愿意为计算单位支付的最大燃料数量。
每消耗一个单位的燃料,将产生一笔燃料费(Gas Fee)。燃料费用于支付燃料单位,并以小额的以太币计算,称为 gwei(十亿 wei 或0.0000000001 ETH)。燃料费有两种形式。基础费用(Base Fee)是指以太坊网络中 gwei 的算法动态成本。用户还可以决定支付优先费用(Priority Fee)。优先费用是用户可以支付的额外 gwei 金额,以使其交易被更快地接受。总的交易费用由燃料消耗 *(基础费用 + 优先费用)来计算。假设我想向另一个外部账户(EOA)发送 2 以太币。每个EOA 到 EOA 交易的燃料消耗是 21000。我需要 21000 个燃料单元以进行计算。每个燃料单元当前的基础费用是 15 gwei。我决定包括 2 gwei的优先费用。要找出总的交易费用,我们需要 21000 的燃料消耗 *(15 gwei 基础费用 + 2 gwei 优先费用)= 357000 gwei,即 0.000357 个以太币。我将总共发送 2.000357 个以太币。用户可以限制他们愿意支付的最大费用,如果交易成本较低,他们将得到退款 [6]。用户可以手动自定义费用,但大多数以太坊客户端和钱包软件会自动计算这些费用。
自伦敦升级/EIP-1559 以来的交易费用具有有趣的经济动态。基础费用被烧毁并从流通中移除。优先费用支付给我们将在下一章讨论的叫做验证者的用户。其原理是在最佳条件下,费用的燃烧率应超过支付给验证者的奖励。这应该会减少 ETH 的总供应量,使其变得更稀有,因此更有价值。这被称为“ultra sound money(双关语,可被理解为超声波货币或超稳健货币)”理论。
交易结构
综合以上信息,我们可以看到以太坊交易包含以下信息:
· 发送方(From)[7]:发送方地址。
· 接收方(To):接收方地址。
· 数字签名(Digital Signature):使用发送方的私钥产生的数字签名。
· Nonce:显示一个账户进行了多少次交易。
· 交易数量(Value):将要转移的ETH数量。
· 输入数据(Input Data):输入数据(消息调用);初始化(合约创建)。
· 燃料上限(Gas Limit):燃料上限。
· 最大优先费用(Max Priority Fee):你将支付的最大优先费用。
· 最大手续费(Max Fee):你将支付的最大总费用。
以太坊虚拟机(EVM)负责在以太坊上执行交易。虚拟机是操作系统(OS)的仿真。想象一下,我正在运行 Windows 操作系统,但也想在同一台计算机上运行 Linux 操作系统。一种方法是通过硬盘分区同时安装这两个系统。然而,也可以使用虚拟机软件在一个操作系统内模拟另一个操作系统。以太坊采用了这种虚拟机概念并对其进行了调整。以太坊客户端开发者创建执行软件客户端,如 Geth 或 Nethermind,它们遵循相同的广泛规范来执行交易。运行这些软件时,EVM 被模拟在用户自己的硬件上,就像 Linux 或 Windows 操作系统一样。EVM 的任务是处理最近的交易,以实现向新的世界状态的转换。世界状态需要每 12 秒更改一次。在每个 12 秒的时隙内,一个被称为 "区块提议者 "的用户会被选中,在一个被称为 "区块 "的数据结构中提议下一个状态。
以太坊虚拟机(EVM)是协调状态转换的中央处理器(CPU)(图2.4)。状态转换函数(State Transition Function)指的是将以太坊从一个世界状态移动到另一个世界状态的各种操作。简单的 EOA 对 EOA 的交易相对容易处理,只需要通过一系列有效性标准,如具有有效的签名、有效的 Nonce 和足够的燃料。然而,涉及合约账户的交易更为复杂,需要 EVM 全方位的功能。

现在我们来想象一下,我们有一笔从外部账户(EOA)到合约账户的消息调用(Message Call)交易。对于以太坊虚拟机(EVM)来说,最重要的字段是输入数据(Input Data),因为它包含了我们想要调用的函数和我们想要传递的参数。在 Solidity 中,输入数据字段遵循应用二进制接口(ABI)格式。ABI 一种标准,告诉智能合约如何解释输入数据字段。函数是智能合约可以执行的命令,在 ABI 规范中是通过引用 MethodID 来识别函数。参数是请求的更改,例如要发送到的特定地址或要发送的值。例如,这是一个输入数据字段在 ABI 格式 [8] 中的样子:

在这个合约的代码中,我们可以看到转账函数,它有自己的 MethodID,以及涉及的参数,这里的例子中包括一个接收者地址和一个数值。实参是我们希望改变的具体信息,其中 [0] 是接收者地址,[1] 是数值。
在字节码中,我们可以看到 MethodID 在前,然后是两个实参:

交易中输入数据字段的内容被称为调用数据(Call Data)。
以太坊虚拟机(EVM)使用以下方式解释和执行输入数据(Input Data)字段:· 虚拟只读存储器(Virtual Read-Only Memory, ROM):读取(但不覆写)涉及合约账户的代码。这是合约账户中包含的不可变代码,内含合约应如何操作的指令。
接下来是机器状态。这仅意为处理交易的临时状态。它包括:· 程序计数器(Program Counter):程序计数器跟踪合约代码中的哪些指令在下一步需要被处理。· 堆栈(The Stack):EVM 使用基于堆栈的模型执行代码。堆栈是后进先出(LIFO)的架构。操作码被推送到堆栈顶部,执行后弹出,然后被下一个替换。· EVM 内存(EVM Memory):在机器状态中使用的临时内存,用来跟踪变化,一旦交易处理完毕就会被丢弃。· 燃料计数器(Gas Counter):跟踪使用的燃料。如果没有更多燃料可用,将回退并撤销提议的状态变更。
临时机器状态的结果将使合约账户的存储(Storage)发生永久变化。· 存储:变更被永久记录,以反映由临时机器状态产生的新世界状态。
一旦交易被处理,EVM 将继续处理下一个交易,整个过程重新开始。EVM 将依次运行所有交易,直到没有剩余的交易。它生成一个执行有效载荷(Execution Payload)。执行有效载荷是 EVM 状态转换函数的输出摘要。
智能合约有多种形式,但我们可以通过两种常见的格式来说明它们:ERC-20 和 ERC-721。请记住,这并不意味着它们是唯一的合约类型。因为以太坊允许开发者自由地创建合约应用,所以要列出所有类型是不可能的。请注意,我的两个例子都以 ERC 开头。这代表以太坊意见征求稿(Ethereum Request for Comment),后面跟着一个独立的数字。ERC 是以太坊中的应用模板。它们有效地概述了一个基础的代码标准,用于构建其他人可以借鉴、调整或扩展的东西。拥有这些广泛的模板非常有用,因为几乎对 Solidity 有基本的了解(有时即使没有)的任何人都可以用这种格式作为基础,快速启动新项目。这里讨论的两个 ERC 是关于代币的,但 ERC 并不必须与代币相关。
ERC-20
ERC-20 代币标准创建了同质化的代币。同质化意味着这些代币将是“等同的(like-for-like)”。我创建的任何代币都将等同于其他任何代币。这与你口袋里的钱、卡上的钱或手机里的钱是一样的。我是否用某个特定的美元或欧元买牛奶,这并不重要。当智能合约开发者想要在 Solidity 中创建一个同质化代币时,他们可以借用 ERC-20 智能合约模板。代码将描述有关代币的重要细节(如名称、总供应量等),然后是外部账户(EOA)可以调用的功能(转移代币、查询余额、查询名称、查询供应量等)。一旦 ERC-20 智能合约被部署,这段代码就成为智能合约账户中的代码(The Code)。这是不可篡改的代码,当 EVM 需要知道合约应如何运行时,它会在其虚拟只读内存(ROM)中调用这个代码。ERC-20 中的存储(Storage)是一个数据库,在合约账户内部将 EOA 地址与 ERC-20 代币余额进行映射。每当 EOA 通过 Input Data 对合约账户进行消息调用时,比如转移代币,EVM 将调用所需的代码来相应地更改存储(Strorage)或者简单来说,来自用户的一笔交易导致应用中的代币余额发生变化。ERC-20 代币不仅仅被用作货币。在后续章节中,我们将看到它们被以巧妙的方式使用,包括作为区块链社区中的治理或投票代币。
ERC-721
ERC-721 代币标准与 ERC-20 标准相似,但核心区别在于 ERC-721 旨在创建非同质化代币(NFTs)。与 ERC-20 代币不同,ERC-721 代币都是独一无二的。每个 ERC-721 代币都将拥有一个独特的标识符,通常是作为整数的 TokenID。NFT 可能会有存储在链上的关联元数据,这些元数据使其具有进一步的独特性,但大多数 NFT 合约使用一个 TokenURI,它链接到与 NFT 相关联的元数据或外部存储的图像。这可能包括外部存储服务,如点对点(P2P)的星际文件系统(IPFS)存储协议或甚至亚马逊网络服务(AWS)。可以为单一物品创建合约,但通常,一个 NFT 智能合约会构建一个类型统一但彼此具有独特差异的物品集合(例如,10000 只企鹅,但每只企鹅都有略有不同的元数据特征和图像)。当智能合约开发者创建一个 NFT 项目时,他们将说明关于这个 NFT 的重要细节(系列名称、总供应量等)以及 EOA 钱包可以调用的功能(铸造代币、转移代币、查询余额、查询名称、查询供应量等)。当一个 NFT 项目正常启动时,通常会有一个铸造 NFT 的功能。在这之后,NFT 可以在用户之间出售和转移,合约的存储将映射这些信息。
去中心化应用程序
在以太坊的语境中,去中心化应用程序(Decentralised Applications,dApp)指的是智能合约以及为了增强用户体验而与之结合的非区块链技术。在 dApps 中,合约账户的体验以某种方式进行了中介处理。大多数智能合约协议都有用户友好的前端,通常是传统网站的形式。例如,Uniswap 的智能合约包含了代币置换的功能。但为了与智能合约进行交互,Uniswap 创建了一个网站,使得这个过程比直接与智能合约交互更简单。另一个例子是无聊猿游艇俱乐部(Bored Ape Yacht Club, BAYC)的智能合约。该智能合约包含了铸造和转移一种名为无聊猿(Bored Ape)的资产的功能,但无聊猿的图像并未存储在合约账户中,而是使用了一个外部的点对点(P2P)文件存储系统。由于在以太坊上存储可能非常昂贵,因此合理地扩展这个特定 dApp 的存储选项是有意义的。智能合约和 dApp 这两个术语通常被混用,但我认为理解这两者(以太坊原生智能合约和该合约与非区块链服务结合而成的扩展)之间的区别是有价值的。
[1] 不同的以太坊软件客户端以不同的方式存储“原始”数据库。例如,Geth 执行客户端以 LevelDB 数据库的形式存储。
[2] 以太坊使用递归长度前缀(Recursive Length Prefix,RLP)编码来序列化信息,如账户的状态。这种技术将每个字段所需的值放入一个二进制形式的序列中。例如,被序列化的外部账户(EOA)将包括一个 Nonce 值和一个 Balance 值。被序列化的合约将有 Nonce、Balance、Code 和Storage。以太坊还在其他地方(如交易)使用这种技术。共识层有自己的版本,称为简单序列化(SSZ)。
[3] 八个二进制位,它在十六进制中被表示为两个字符。
[4] 这里不需要过度思考,合约账户本身不能创建交易,必须通过 EOA 触发运行它们的代码。它们可以执行的类似交易的唯一事情是创建合约,但始终需要 EOA 作为发起交易的提示。
[5] 参见 Buterin V (2014) 启动以太销售。可在以下网址查看:https://blog.ethereum.org/2014/07/22/launching-the-ether-sale
[6] 具体来说,他们可以设置自己愿意支付的最大优先费用或总费用
[7] 从技术上讲它不被包括在交易中,但容易推断出来,也在大多数区块浏览器中被显示。
[8] 这笔交易是真实的,你可以自己查看。我随机抽取了它:https://etherscan.io/tx/0xa47c82ba29272d82e1de8eec0e287b4584db0c505846a36088e9832cf0b94ca3

Geth 源码系列:存储设计及实现
在区块链的世界中,状态存储是每一个节点的「记忆核心」 — — 它记录着亿万账户的余额、合约的代码、交易的痕迹,甚至决定着一笔交易能否被正确执行。作为以太坊生态的基石,Geth 客户端如何以精密的架构设计承载海量状态数据?其存储系统如何在性能、安全与可扩展性之间找到平衡? 这篇文章是 Geth 源码系列的第二篇,通过这个系列,我们将搭建一个研究 Geth 实现的框架,开发者可以根据这个框架深入自己感兴趣的部分研究。这个系列共有六篇文章,在这第二篇文章中,将系统讲解 Geth 的存储结构设计与相关源码,介绍其数据库层次划分并详细分析各个层次中相应模块的核心功能。 以太坊作为全球最大的区块链平台,其主流客户端 Geth(Go-Ethereum)承担了绝大部分节点运行与状态管理的职责。Geth 的状态存储系统,是理解以太坊运行机制、优化节点性能、以及推动未来客户端创新的基础。 本文作者: po Web3buidler.tech Core Contributor, EthStorage Engineer Geth 底层数据库总览 自 Geth v1.9.0 版本起,Geth 将其数据库分为...

以太坊单独质押实战教程:手把手教你完成部署
内容丨Ray 编辑 & 排版丨Yewlne、环环 以太坊的单独质押(Solo Staking)是保护网络安全和去中心化的黄金标准。通过运行自己的验证者节点,您可以直接参与网络共识,获得完整的质押奖励,并保持对资金的完全控制。本教程将为您提供详细的指导,帮助您在家中部署以太坊单独质押节点,确保安全性和稳定性。前提概要首先,我们需要有这样的一个基本概念:要处理来自执行层的传入验证器存款,您需要运行执行客户端以及共识客户端。这意味着我们至少需要部署两个客户端程序(在本教程中,为三个,共识客户端按照功能进行了拆分)。如果想了解更多执行客户端和共识客户端的差异及功能职责,可以点击阅读: https://ethereum.org/zh/developers/docs/networking-layer/一、选择执行客户端以太坊生态的客户端种类非常丰富,执行客户端和共识客户端都有多种不同语言的实现,如使用 Go 语言实现的 Geth, 使用 Rust 语言实现的 Reth 等。你可以根据自己喜好,选择不同的客户端,整体流程是类似的,只是不同客户端实现涉及的命令不同。在这里,我们不能对所有的客户端...

重磅 | LXDAO 中文名正式从“良心 DAO”改为“蓝翔 DAO”!
撰文 | Bruce 编辑&排版 | Connie 图片 | Ache、Connie、Cikey重磅消息! LXDAO 今日起中文名正式从“良心 DAO”改为“蓝翔 DAO”! 让我们抓紧看看到底怎么个事儿——Web3 技术哪家强?中国就找 LXDAO!LXDAO 创办于 2022 年 6 月,至今已有快 2 年的历史,是由几位喜欢开源的开发者联合发起的一所现代化、综合性的产学研一体的 DAO 组织,主要从事 Web3 公共物品相关的教育、研发和维护。 LXDAO 以创办历史不太悠久,但实训项目齐全、师资力量雄厚、培养模式先进而闻名全国。LXDAO 超过一半的同学为程序员,是现代化 Web3 技师、高级技工的摇篮。学院概况LXDAO 现有 0 个校区(正在筹备在清迈四海搭建第一个线下校区)。我们主要在 Internet 远程学习和工作交流。面向全球 13810 个城市招生,不限语言、地区和种族,能同时容纳上百万人。 LXDAO 拥有丰富的实训项目,涵盖了 Web3 的多种主题,包括但不限于教育、公共物品、全链游戏、开源、开发者关系维护、商务合作等。 我们也跟许多国际单位联合开展一...
LXDAO 是一个专注研发的 DAO 组织,致力于构建支持有价值的公共物品和开源项目的无限循环。 LXDAO is an R&D-focused DAO dedicated to building an Infinite Cycle that supports valuable

Subscribe to LXDAO

Subscribe to LXDAO
Share Dialog
Share Dialog
<100 subscribers
<100 subscribers
No activity yet