一文了解以太坊节点:全节点、轻节点、归档节点

 2023-10-06 10:30:06发布 2023-10-06 10:30:31更新

在以太坊网络中,节点大致可被分为“全节点(Full Node)”、“轻节点(Light Node)”、“归档节点(Archive Node)”三大类。轻节点仅存储区块头,没有区块体。当需要验证交易时会向邻近的全节点发起相关资讯请求以进行验证。归档节点即在全节点基础之上多存储了每个区块高度的状态(State)快照,供搜索相关用途。

以太坊网络

以太坊是由分散式节点所组成的网络架构,这些节点称为“以太坊节点(Ethereum Nodes)”或“以太坊客户端(Ethereum Clients)”。任何人只要有规格足够的电脑设备都能够加入以太坊网络中成为节点,贡献算力赚取区块挖矿奖励。

在当前的以太坊网络中,每个节点都是相互平等的,彼此间即时沟通“同步区块资料”及“打包待出块的交易(挖矿)”来维持以太坊区块链的运作,下图展示了节点的主要工作内容:

节点的主要工作内容

节点的主要工作内容

以太坊节点的工作

  • 接收交易(Receive Transactions):接收来自DApp、钱包或其它节点的交易信息
  • Receive Blocks:从其它节点接收区块信息同步至最新的区块高度
  • 验证(Validating):验证新的区块之正确性、验证待处理交易之有效性
  • 执行(Executing):处理交易,进行运算并更改状态值,打包成新区块
  • 挖矿(Mining):用电脑算力来计算nonce 值,最先找到nonce 值出块并广播的矿工可以获得区块奖励与所有交易之手续费(Gas)
  • 共识(Consensus):通过共识机制达成全网帐本之一致性或区块重组(reorg)

以上便是以太坊节点常态性的工作内容,正是这些分布在全球的数千个节点们不间断地工作维系了以太坊区块链的正常运作。

然而其实节点有许多不同形式,上述参与所有工作内容(包含接收、验证、挖矿)的节点仅是大众普遍认知的其中一种形式。

以太坊节点的分类

在以太坊网络中,节点大致可被分为“全节点(Full Node)”、“轻节点(Light Node)”、“归档节点(Archive Node)”三大类。

全节点(Full Node)

全节点是拥有完整区块链帐本资料的节点,具备独立验证的能力来确认交易之有效性。具体来说全节点主要在处理下列四件事:

  1. 储存所有历史交易信息,资料公开透明
  2. 监测矿工挖出来的新区块,验证其合法性后同步该区块
  3. 监测区块链网络中的新交易信息,验证每个交易的合法性
  4. 将验证过的“交易/区块信息”广播给全网络节点

一个节点只要下载了完整且最新的区块链资料,稳定运行验证交易和同步区块信息,那它就是一个全节点了。

由于每一个全节点都保有全网资料,所以即使其中部分节点出现问题,例如断网或被黑客攻击,都不会影响整个区块链网络的安全性。这即是“去中心化”记帐系统的优势所在。

同时,全节点的数量越多,也代表完整的区块链帐本被保存的份数越多,“不可篡改性”也就越强,整个区块链网络的安全性也随之提升。

一但有人企图组织算力叛变,试图改变区块共识或发动双花攻击,其它正常运作的全节点可以即时验证拒绝掉这些交易。

随着持续增加的交易记录与智慧合约部署,全节点所需的储存空间也在不断增长。

矿工节点

挖矿的过程即是将验证过的待处理交易打包成新区块,并以电脑算力来计算“nonce值”,最先找到nonce值成功出块并广播的矿工会获得区块奖励与所有交易之手续费(gas)作为报酬。

矿工必须要运行全节点才能即时浏览区块链历史资料进行交易验证,再将验证通过的交易进行打包。

因此,所有矿工必定是全节点;然而全节点未必是矿工,运行全节点的人未必会花费电脑算力去参与新区块nonce值的运算来争取区块奖励。

轻节点(Light Node)

轻节点顾名思义即是轻量级的节点,具体定义是不储存或维护完整的区块链副本,只储存最小量的状态来作为发送或传递交易讯息的节点。

轻节点具体存储了哪些状态,可以先透过下图了解以太坊的数据结构:

以太坊的数据结构

以太坊的数据结构

区块头和区块体

以太坊的每个区块主要分为Header 和Body 两个部分存储,Body 即是交易列表;Block Header 则较为复杂,包含了前个区块的Hash、时间戳及挖矿难度等相关参数。

在Block Header 中采用一种名为Merkle-Patricia Trie (MPT) 的核心资料结构来储存区块链信息,可以理解为把帐本分割成无数个小的资料块,每个资料块像是一棵树中的无数叶片,而我们把每两个相邻的叶片合并成一个字串,并算出该字串的Hash 值。

如此过程经过无数次后,最终如同所有树枝归向一个树干一般,会得到一个包含了所有区块资料的Hash 值,称为“Merkle Root”。

轻节点信息

全节点储存了所有区块的区块头和区块体(交易列表),而轻节点只储存最小量的状态:即“区块头(Block Header)”,借此大幅降低储存空间的需求。

轻节点如何验证交易

由于割舍掉区块的Body,即所有历史的交易列表,因此当轻节点需要验证某个交易的合法性时,具体做法为:

  1. 向邻近的全节点发起确认请求;
  2. 全节点收到请求后提供所需相关信息供验证。

需要向全节点请求的原因是:假设有一个合约执行的交易,那么便必须要有该合约部署时的原始码(位在Contract Created 之交易中)。由于该交易位于某个区块体,故轻节点必须要向全节点请求该合约之相关信息方能进行交易验证。

轻节点的特点

整体而言,轻节点大致上具备以下几点特点:

  • 只储存每个区块的区块头Block Header
  • 不一定保持随时在线(获取最新的Block Header信息)
  • 根据需求可以只保存与自己相关的交易内容
  • 无法验证大多数交易的合法性,只能验证与自己相关交易的合法性
  • 无法验证新区块的正确性
  • 只能检测到当前的最长链,但无法知道哪条是最长合法链

由于轻节点必须要向全节点请求与交易验证相关的区块体信息,那么要怎么知道全节点回传的信息是正确的呢?

这时就要回到以太坊的资料结构来谈,前面提到轻节点为了减少储存空间,而割舍掉Block Body,仅保留作为验证之用的区块头。

由于存有已经验证合法之区块头,因此当未来需要验证相关交易时只要透过跟全节点请求相关的区块体信息即可进行验证,不需要从头验证整个区块。

区块头与交易验证

轻节点能够利用Block Header 验证交易的原因为: 区块头中的Merkle Root即是由区块体中的交易信息经由杂凑演算法(Hash Algorithm)生成的“数位指纹(Digital Fingerprint)”,因此区块头可以充分代表区块体内的信息。

区块头中的Merkle-Patricia Trie是一个生成Hash需要花费大量算力,但验证非常迅速的结构。当轻节点收到全节点提供的信息时,便能够利用已有的区块头相关讯息迅速验证该信息是否正确,进一步进行交易验证。

归档节点(Archive Node)

“归档节点”是以太坊网络上存储历史区块链数据的特定节点。因为它们提供了这些历史信息,所以当你需要审计过去的交易历史或收集数据时,它们会很有帮助。

在归档模式下运行的完整节点对于了解事务的历史结果是必要的。你可以在任何时间点的任何区块回答与账户余额、智能合约代码、交易计数、代币供应、代币价格等相关的问题。

此状态包含每个钱包的余额和所有智能合约内部变量的值。这是向以太坊区块链添加新区块所必需的,因为新交易可能会执行智能合约。这些交易的结果将取决于这些内部变量的内容。

存档节点还可以在无需在区块链上创建交易的情况下测试智能合约。例如,如果你使用 Ganache,它是 Truffle 开发工具套件中的个人区块链模拟器,它使你能够在完全存档模式下在以太坊分叉,以便在部署到实时区块链之前测试智能合约。

通常只有特殊的服务如“区块链浏览器:Etherscan”或“RPC Endpoint Provider:Infura”等底层服务会有架设归档节点的需求,大多数的情况全节点已非常足够。

归档节点与安全性

归档节点对于区块链的信任模型与整体安全性原则上“不会有额外的加成或影响”,全节点(包含挖矿节点)已能充分保障全网络的安全。

如果没有人继续维护归档节点的话,查询区块链上的历史资料得花费许多的时间。归档节点保存了区块链上的完整历史纪录与资料,以及所有区块高度的当时全网状态。

推荐阅读