“节点”是指任何以太坊客户端软件的实例,它连接到其他也运行以太坊软件的计算机,形成一个网络。 一个节点需要运行两种客户端软件:共识客户端和执行客户端。
-
执行客户端(也称为执行引擎、EL 客户端或旧称“以太坊 1”客户端)侦听网络中广播的新交易,并在 EVM 中执行,并保存所有当前以太坊数据的最新状态和数据库。
-
共识客户端(也称为信标节点、CL 客户端或旧称“以太坊 2”客户端)实现权益证明共识算法,使网络能够根据来自执行客户端的经验证数据达成一致。 此外还有名为“验证者”的第三种软件,它们可被添加到共识客户端中,使节点能参与保护网络安全。节点分布可以看 Etherscan 节点地图 、以太坊节点
节点类型
客户端可以运行三种类型的节点:轻节点、全节点和归档节点。
轻节点
轻节点只下载区块头,不会下载每个区块。这些区块头包含区块内容的摘要信息。轻节点会向全节点请求其所需的任何其他信息。然后轻节点可以根据区块头中的状态根独自验证收到的数据。
轻节点可以让用户加入以太坊网络,无需运行全节点所需的功能强大的硬件或高带宽。轻节点不参与共识(不能成为矿工/验证者),但可以访问功能和安全保障和全节点相同的以太坊区块链。
全节点
全节点对区块链进行逐块验证,包括下载和验证每个块的块体和状态数据。有些全节点从创世区块开始,验证区块链整个历史中的每一个区块(完全同步)。有些全节点则从更近期的区块开始验证(比如 Geth 的快照同步),而且它们信任这些区块是有效的。
但是全节点并不保存全部区块链数据,而是只保存相对较新的数据,那么又如何逐块验证呢?
全节点会同步历史数据。如上所说,如果从创世开始验证,那么全节点会从创世区块开始,逐块下载、执行并验证每一笔交易,从头构建完整的状态树,这是最彻底、最慢的方式,但能获得 100% 自验证的信任。
如果从近期区块开始验证,则会从某个最近的区块开始,逐块下载、执行并验证每一笔交易,这种方式显然更快,但是要 100%信任逐块下载的初始区块。
在逐块验证后,会进行修剪。区块链的“状态”是指所有账户余额、合约代码和存储变量的当前值。当执行交易时,会产生大量中间状态。修剪机制会安全地删除那些不再被最新区块引用的旧状态数据,只保留从创世状态推导出最新状态所必需的“状态树”路径上的关键节点。
归档节点
归档节点从创世块开始验证每个区块的全节点,存储全节点中保存的所有内容不删除任何下载的数据,并建立历史状态存档。
以归档以外的任何方式同步客户端将导致区块链数据被修剪。这意味着不存在包含所有历史状态的归档,但全节点能够在需要时构建它们。
信标链
信标链(Beacon Chain)是以太坊 2.0 的核心升级,它不处理日常交易,而是作为整个网络的“中央调度员”,负责管理验证者、分配共识任务,并协调未来的分片链。
同步模式
完全同步
完全同步会下载所有区块(包括区块头和区块体),并通过执行自创世块以来的每个区块,以增量方式重新生成区块链的状态。
快速同步
与完全同步一样,快速同步会下载所有区块(包括区块头、交易和收据)。 不过,快速同步并不重新处理历史交易,而是依赖收据,直至到达最近的头部时,再切换到导入和处理区块,以提供一个完整的节点。
收据(Receipt)是交易被成功打包进区块并执行完毕后生成的“官方凭证”,它记录了交易的交易哈希、执行结果、状态变化、消耗 Gas、状态跟等信息,是快速同步机制中信任历史交易的关键依据。
快照同步
快照同步从一个最近的已知为真实区块链一部分的受信任检查点开始。节点会定期保存检查点,同时删除早于某个时间的数据。这些快照被用于在需要时重新生成状态数据,而不是永久储存它。
轻量同步
轻客户端模式下载所有区块头和区块数据,并对其中一些进行随机验证。 仅从可信的检查点同步链的头部。
共识层同步模式
乐观同步
乐观同步是一种合并后同步策略,专为选择加入和向后兼容而设计,允许执行节点通过已确立的方法进行同步。
执行引擎可以在不进行完全验证的情况下乐观地导入信标区块,找到最新区块头,然后使用上述方法开始同步链。接着在执行客户端更新之后通知共识客户端信标链中交易的有效性。
检查点同步
检查点同步也称为弱主观性同步”,它基于弱主观性假设,从最近的弱主观性检查点而不是从创世块同步信标链。检查点同步可大幅加快初始同步速度,意味着节点会连接到远程服务,以下载最近的最终确定状态并从该点继续验证数据。提供数据的第三方会受到信任,因此要谨慎选择。
执行客户端
-
Go Ethereum:简称 Geth,Go 语言实现,以太坊协议的原始实现之一。 目前,它是使用最为广泛的客户端,拥有最大的用户群,为用户和开发者提供各种工具。
-
Erigon:Go 实现,以前称为 Turbo‐Geth,最初是 Go Ethereum 的一个分叉,注重速度和磁盘空间效率。
-
Nethermind:C#、.NET 实现。
-
Besu:Java 实现,企业级以太坊客户端,面向公共网络和许可网络。 它运行所有以太坊主网功能(从追踪到 GraphQL),可进行大范围监控。
-
Reth:Rust 实现,以太坊全节点。
-
EthereumJS:TypeScript 实现。
共识客户端
-
Lighthous:Rust
-
Grandine:Rust
-
Lodestar:TypeScript
-
Nimbus:Nim
-
Teku:Java
-
Prysm: Go