节点和客户端

以太坊是一个由计算机组成的分布式网络,这些计算机运行可验证区块和交易数据的软件,称为节点。 该软件必须在计算机上运行,才能将其转化为以太坊节点。 一个节点由两个独立的软件(名为“客户端”)构成。

什么是节点和客户端?

“节点”是指任何以太坊客户端软件的实例,它连接到其他也运行以太坊软件的计算机,形成一个网络。 客户端是以太坊的实现,它根据协议规则验证数据并保持网络安全。 一个节点需要运行两种客户端软件:共识客户端和执行客户端。

  • 执行客户端(也称为执行引擎、EL 客户端或旧称“以太坊 1”客户端)侦听网络中广播的新交易,并在以太坊虚拟机中执行它们,并保存所有当前以太坊数据的最新状态和数据库。Geth就是使用最广泛的执行客户端
  • 共识客户端(也称为信标节点、CL 客户端或旧称“以太坊 2”客户端)实现权益证明共识算法,使网络能够根据来自执行客户端的经验证数据达成一致。 此外还有名为“验证者”的第三种软件,它们可被添加到共识客户端中,使节点能参与保护网络安全。

这些客户端软件相互协作,以追踪以太坊的链头,并允许用户与以太坊网络进行交互。 这种模块化设计称为封装复杂性open in new window,包含多个协同运作的软件。 此方法让无缝实施合并open in new window变得更简单,客户端软件更易于维护和开发,并且还能重复利用各个客户端。

screenshot2024-07-18 16.48.55

客户端多样性

不同团队开发的各种编程语言中都有执行客户端和共识客户端。

多种客户端实现减少了对于单一代码库的依赖,使网络更强大。 它的理想目标是实现多样性,即没有任何客户端在网络中占据主导地位,从而排除潜在的单点故障。 语言多样化有助于拓宽开发者社区,并允许他们用自己喜欢的语言创建集成。

节点类型

事实上,客户端可以运行三种类型的节点:轻节点、全节点和归档节点。 同步是指节点能以多快的速度获取最新的以太坊状态信息。

全节点

全节点对区块链进行逐块验证,包括下载和验证每个块的块体和状态数据。 全节点分多种类别——有些全节点从创世区块开始,验证区块链整个历史中的每一个区块。 另一些全节点则从更近期的区块开始验证,而且它们信任这些区块是有效的(如 Geth 的“快照同步”)。 无论验证从哪里开始,全节点只保留相对较新数据的本地副本(通常是最近的 128 个区块),允许删除比较旧的数据以节省磁盘空间。 旧数据可以在需要时重新生成。

  • 存储全部区块链数据(会定期修剪,所以全节点并不存储包含创世块在内的所有状态数据)
  • 参与区块验证,验证所有区块和状态。
  • 全节点可以从本地储存中检索所有状态,或从“快照”中重新生成。
  • 为网络提供服务,并应要求提供数据。

归档节点

归档节点是从创世块开始验证每个区块的==全节点==它们从不删除任何下载的数据(这才是真正的包含所有数据)。

  • 存储全节点中保存的所有内容,并建立历史状态存档。 如果你想查询区块 #4,000,000 的帐户余额,或者想简单可靠地测试自己的一组交易而不使用跟踪挖掘它们,则需要归档节点。
  • 这些数据以太字节为单位,这使得归档节点对普通用户的吸引力较低,但对于区块浏览器、钱包供应商和链分析等服务来说则很方便。

以归档以外的任何方式同步客户端将导致区块链数据被修剪。 这意味着,不存在包含所有历史状态的归档,但全节点能够在需要时构建它们。

轻节点

轻节点只下载区块头,而不会下载每个区块。 这些区块头包含区块内容的摘要信息。 轻节点会向全节点请求其所需的任何其他信息。 然后,轻节点可以根据区块头中的状态根独自验证收到的数据。 轻节点可以让用户加入以太坊网络,无需运行全节点所需的功能强大的硬件或高带宽。 最终,轻节点也许能在手机和嵌入式设备中运行。 轻节点不参与共识(即它们不能成为矿工/验证者),但可以访问功能和安全保障和全节点相同的以太坊区块链。

为什么应该运行以太坊节点?

运行节点可以让我们直接以去信任方式私密地使用以太坊,同时通过保持网络更加稳健和去中心化来支持网络。

对自己好处

运行你自己的节点使你能够以私密、自给自足的去信任方式使用以太坊。 你去信任网络,因为你可以使用自己的客户端验证数据。 “不要信任,直接验证”是一句在区块链领域非常流行的口头禅。

  • 你的节点根据共识规则独自验证所有交易和区块。 这意味着你不必依赖网络中的任何其他节点或完全信任它们。
  • 你可以将以太坊钱包与你自己的节点一起使用。 你可以更安全、更私密地使用去中心化应用程序,因为你不必将地址和余额泄露给中间商。 你可以用自己的客户端检查所有内容。 MetaMaskopen in new windowFrameopen in new window许多其他钱包open in new window提供远程过程调用导入,这让它们可以使用你的节点。
  • 你可以运行和自我托管其他依赖于以太坊数据的服务。 例如,可以是信标链验证者、二层网络等软件、基础设施、区块浏览器、支付机构等。
  • 你可以提供自己的自定义远程过程调用端点open in new window。 你甚至可以公开地向社区提供这些端点,以帮助他们避免与大型中心化供应商合作。
  • 你可以使用进程间通信 (IPC) 连接到节点,或者重写节点将你的程序作为插件加载。 这样可以减少网络延迟,例如在使用 web3 库处理大量数据时或者当你需要尽快替换交易时(即抢先交易)会带来很大帮助。
  • 你可以直接质押以太币以保护网络并获得奖励。

对网络的好处

多样化的节点对于以太坊的健康、安全和运行弹性非常重要。

  • 全节点强制执行共识规则,因此无法欺骗它们接受不遵循规则的区块。 这在网络中提供了额外的安全性,因为如果所有节点都是轻节点,不进行完整验证,验证者可能会攻击网络。
  • 如果遇到攻击并且攻破了权益证明open in new window加密经济防御,全节点可以执行社交恢复以选择跟随最诚实的链。
  • 网络中的节点越多,网络就更加多样化和更加健壮,这是去中心化的最终目标,可实现一个抗审查的可靠系统。
  • 全节点使依赖区块链数据的轻量级客户端能够访问这些数据。 轻节点不存储整条区块链,而是通过区块头中的状态根open in new window验证数据。 如果有需要,它们可以向全节点请求更多信息。

同步模式

为了追踪和验证网络中的最新数据,以太坊客户端需要与最新网络状态同步。 同步方法如下:从对等节点下载数据,用加密方法验证其完整性,并构建一个本地区块链数据库。

同步模式代表了这个过程的不同方法,并进行了不同的折衷。 客户端在实现同步算法方面也各不相同。

执行层同步模式

完全归档同步

完全同步下载所有区块(包括区块头、交易和收据),并通过执行从创世块开始的每个区块逐步生成区块链的状态

  • 通过验证每笔交易,最大限度地减少信任并实现最高安全性。
  • 随着交易数量的增加,处理所有交易可能需要几天到几周时间

完全快照同步

快照同步逐块验证区块链,就像完全归档同步一样;然而,有别于从创世块开始验证,它会从更近期的“可信”检查点开始验证,而该检查点已知是真实区块链的一部分。 节点会定期保存检查点,同时删除早于某个时间的数据。 快照用于在需要时重新生成状态数据,而不需要永久保存。

  • 最快的同步策略,目前是以太坊主网默认设置
  • 节省大量磁盘使用空间和网络带宽,同时不影响安全

轻量同步

==看不懂,为啥区块数据也会下载==

轻客户端模式下载所有区块头和区块数据,并对其中一些进行随机验证。 仅从可信的检查点同步链的头部。

  • 仅获取最新状态,同时依赖于对开发者和共识机制的信任。
  • 客户端在几分钟内便可以使用当前网络状态。

注意:轻量同步暂不支持权益证明以太坊,新版本轻量同步应该很快就会发布!

归档节点详解

归档节点是以太坊客户端实例,配置用于构建所有历史状态的归档。 它是一种对某些用例有用的工具,但可能比全节点更难运行。

为了理解归档节点的重要性,让我们澄清一下“状态”的概念。 以太坊可以被称为基于交易的状态机。 它由执行交易并改变其状态的帐户和应用程序组成。 关于每个帐户和合约的信息等全局数据储存在一个名为“状态”的字典树数据库当中。 这些都是由执行层 (EL) 客户端处理,包括:

  • 帐户余额和随机数
  • 合约代码和存储
  • 与共识相关的数据,例如质押存款合约

为了与网络交互,验证和产生新的区块,以太坊客户端必须跟上最新的变化(链的头部),从而显示最新的状态。 一个配置为全节点的执行层客户端会验证并追踪网络的最新状态,但只缓存过去几个状态,例如与最后 128 个区块相关联的状态,这样它就可以处理链重组并提供对最近数据的快速访问。 最近的状态是所有客户端在验证传入交易和使用网络时需要的状态。

你可以把状态想象成给定区块的瞬时网络快照,而归档是历史回放。

历史状态可被安全修剪,因为它们对网络的运行不是必要条件,而且对于客户端来说,保留所有过时的数据没有意义。 在某个最近区块之前存在的状态(例如在头部之前 128个 区块)实际上会被丢弃。 全节点只保留历史区块链数据(区块和交易)和偶尔的历史快照,它们可以用来根据请求重新生成较旧的状态。 在以太坊虚拟机中重新执行过往交易就可以做到这一点;当所需状态离最近的快照很远时,可能对计算要求很高。

然而,这意味着在全节点上访问历史状态会消耗大量计算资源。 客户端可能需要执行从创世块开始的所有过往交易并计算一个历史状态。 归档节点不仅会储存最近的状态,而且还会储存在创建每个区块以后的每个历史状态,进而解决这个问题。 它基本上是以更大的磁盘空间需求为代价。

需要注意的是,网络不依赖于归档节点来保留和提供所有历史数据。 如上所述,所有历史中间状态都可以在全节点上派生出来。 任何全节点都会存储交易(目前不到 400G),而且可重放交易以构建整个归档。

尽管全节点只缓存最近 128 个区块以优化性能,但它实际上保存了整个区块链的数据,并且可以根据需要访问任何历史区块和交易。通过 JSON-RPC 接口或直接数据库访问(全节点会用数据库保存数据),你可以构建和查询整个链的数据。这确保了全节点在提供快速响应的同时,仍然具备完整性和数据可追溯性。

用例

像发送交易、部署合约、验证共识等常规使用以太坊的方式不需要访问历史状态。 用户从不需要一个归档节点来进行标准的网络交互。

状态归档的主要好处是快速访问关于历史状态的查询。 例如,归档节点会立即返回以下类似结果:

  • 帐户 0x1337…在区块 15537393 时的以太币余额是多少?
  • 合约 0x 中的代币 0x 在区块 1920000 时的余额是多少?

如上所述,一个全节点需要通过以太坊虚拟机执行来生成这些数据,这会消耗 CPU 并花费时间。 归档节点在磁盘上访问它们,并立即提供响应。 此功能对于基础设施的某些部分十分有用,例如:

  • 服务提供商,如区块浏览器
  • 研究人员
  • 安全分析师
  • 去中心化应用程序开发者
  • 审计和合规

还有一些免费服务也允许访问历史数据。 由于运行一个归档节点的要求更高,这种访问通常是有限的,只适用于偶尔的访问。 如果项目需要不断地访问历史数据,应该考虑自己运行一个。

引导节点

当新节点加入以太坊网络时,它需要连接到已经在网络上的节点,以便在后期发现新的对等节点。 这些进入以太坊网络的节点被称作引导节点。 客户端通常有一个硬编码的引导节点列表。 这些引导节点通常由以太坊基金会的开发团队或客户团队自己运行。引导节点仅在没有足够的对等节点可以连接时被调用,并且需要有一个节点来引导一些新的连接。

连接到引导节点

大多数客户端都有内置的引导节点列表,但你可能也想运行自己的引导节点,或使用不在客户端硬编码列表中的引导节点。 在这种情况下,可以在启动客户端时指定这些节点,如下所示(示例为 Geth):

geth --bootnodes "enode://<node ID>@<IP address>:<port>"

引导节点是不在 NAT(网络地址转换)后面的全节点。 只要全节点可以公开访问,它就可以充当引导节点。

Last Updated:
Contributors: liushun-ing