本文介绍了以太坊节点的不同类型(完整节点、归档节点和轻节点)以及主要的执行客户端(如Geth、Nethermind、Erigon和Besu)。讨论了它们的数据保留、同步方法和RPC实现如何影响调试、追踪和重放交易的能力,以及何时应该运行自己的节点。
与以太坊的每次交互都要通过一个节点,而且并非所有节点都是相同的。有些只存储最新的几百个区块,另一些则保留自创世以来的每个状态。有些客户端返回丰富的追踪信息,另一些则默默地丢弃不支持的 RPC。了解你使用的是哪种节点和客户端可以节省数小时的调试和困惑。
在这篇文章中,我们将剖析以太坊节点是如何实际运作的,从 Full、Archive 和 Light 节点到主要的 execution clients,如 Geth、Nethermind、Erigon 和 Besu。你将看到它们的数据保留、同步方法和 RPC 实现如何影响你调试、追踪和重放交易的能力。
最后,我们将看看什么时候 运行你自己的节点 比依赖共享 RPC 提供商更有意义,它的实际成本是多少,以及如何决定哪些值得自己托管。
在我们讨论 eth_call 和 debug_traceCall 之前,我们需要解决下一个问题:你连接的是哪种类型的节点?
你使用的以太坊节点类型决定了 哪些数据可用 以及 当你模拟或追踪交易时可以追溯到多远。选择错误的节点可能会导致令人困惑的“缺少状态”错误或不完整的追踪。
一个完整节点存储 所有区块头和区块体 以及 足够的最近状态数据,以验证区块链并为链的最新部分提供查询服务。
它 不 存储每个区块的完整历史状态,只存储最近的一小部分。通常是最近的 128 个区块 左右。较旧的中间状态会被修剪以节省资源。
完整节点 一次验证一个区块 的区块链,下载并检查区块的交易及其相应的状态更改。
它们的同步方式有所不同:有些从 创世区块 开始,验证历史中的每个区块,而另一些(如 Geth 的 snap sync)则从更近的、受信任的检查点开始,并从那里向前推进。
无论采用哪种同步方法,完整节点都只保留 最新状态的本地副本。任何较旧的数据都会被删除以节省磁盘空间。这并不意味着数据永远消失了。如果需要,节点可以通过重放早期区块的交易来重建较旧的状态,尽管这比直接从存储中读取要慢。
历史访问:
典型用例:
注意:
如果你尝试对几个月或几年前的区块进行 eth_call 或 debug_traceCall,完整节点很可能会失败,因为该状态早已被修剪掉。
一个存档节点包含完整节点拥有的所有内容,外加 自创世以来每个区块的完整历史状态记录。这意味着它会保留每个帐户余额、合约存储值和状态树,就像它们在任何时间点一样,而无需修剪。
当你查询存档节点在区块 5,000,000 的状态时,它可以立即返回数据,而无需从较早的区块重建它。这使其成为需要精确历史数据的开发人员和服务的理想选择。
典型用途:
debug_traceCall),而无需额外的计算。权衡:
运行存档节点比完整节点需要 显著更多的存储和资源。因此,许多团队依赖于 RPC 提供商,他们付费提供存档访问,而不是自己托管。
轻节点只存储 区块头,并依赖完整节点或存档节点来获取它需要的任何额外数据。它使用区块头中包含的加密证明来验证数据,使其能够在不持有完整链的情况下确认正确性。
这使得轻节点非常节省资源,它们可以在存储或带宽有限的设备上运行,但这也意味着它们在大多数查询中 依赖 其他节点。
典型用途:
局限性:
debug_traceCall,因为它不保存执行数据。eth_call 也只有在连接的完整/存档节点支持请求的区块时才有可能。当你运行像 eth_ 或 debug_ 这样的 RPC 调用时,你不是在与作为单个系统的“以太坊”对话,你正在与 以太坊协议的特定实现 对话,这被称为 客户端。
以太坊有多个执行层客户端,它们都是由不同的团队用不同的编程语言构建的,并且有它们自己的设计选择。它们都遵循相同的共识规则,但它们可能在以下方面有所不同:
debug_ 或 trace_ RPC 方法;另一些客户端根本不实现它们。这些客户端在共识规则方面是可互换的,但 它们的 RPC 功能和性能有所不同,尤其是在高级调试/追踪方面。
在以下情况下,运行你自己的节点可能是正确的选择:
debug_traceCall 这样的功能或存档历史记录,而无需依赖提供商的限制。成本提示:
- 原文链接: medium.com/@andrey_obruc...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!