以太坊节点:全节点、轻节点、归档节点

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

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

1. 以太坊节点的工作

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

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

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

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

2. 全节点 Full Node

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

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

一个节点只要下载了完整且最新的区块链资料,稳定运行验证交易和同步区块信息,那它就是一个全节点了。由于每一个全节点都保有全网资料,所以即使其中部分节点出现问题,例如断网或被骇客攻击,都不会影响整个区块链网络的安全性。这即是「去中心化」记帐系统的优势所在。

同时,全节点的数量越多,也代表完整的区块链帐本被保存的份数越多,「不可篡改性」也就越强,整个区块链网络的安全性也随之提升。一但有人企图组织算力叛变,试图改变区块共识或发动双花攻击,其它正常运作的全节点可以即时验证拒绝掉这些交易。

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

矿工节点

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

矿工必须要运行全节点才能即时浏览区块链历史资料进行交易验证,再将验证通过的交易进行打包。因此,所有矿工必定是全节点;然而全节点未必是矿工,运行全节点的人未必会花费电脑算力去参与新区块nonce值的运算来争取区块奖励。

3. 轻节点 Light Node

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

3.1 Block Header and Body

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

在Block Header 中采用一种名为Merkle-Patricia Trie (MPT) 的核心资料结构来储存区块链信息,可以理解为把帐本分割成无数个小的资料块,每个资料块像是一棵树中的无数叶片,而我们把每两个相邻的叶片合并成一个字串,并算出该字串的Hash 值。如此过程经过无数次后,最终如同所有树枝归向一个树干一般,会得到一个包含了所有区块资料的Hash 值,称为「Merkle Root」。

3.2 轻节点信息

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

3.3 轻节点如何验证交易

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

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

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

3.4 轻节点的特色摘要

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

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

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

这时就要回到以太坊的资料结构来谈,前面提到轻节点为了减少储存空间,而割舍掉Block Body,仅保留作为验证之用的Block Header。由于存有已经验证合法之Block Header,因此当未来需要验证相关交易时只要透过跟全节点请求相关的Block Body 信息即可进行验证,不需要从头验证整个区块。

3.5 Block Header 与交易验证

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

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

介绍完全节点与轻节点后,最后我们来介绍Archive Node,即归档节点。

4. 归档节点 Archive Node

「归档节点」是在全节点的基础之上,额外储存了每个区块高度的区块状态(个人帐户与合约帐户之当时余额等信息),即针对每个区块高度当下的状态进行快照并存档。归档节点能让你快速回到某个区块高度去查询当下状态:例如你想要知道某一个帐户在区块高度#5,000,000的余额时便会派上用场。

归档节点截至2020/05 的资料大小已经超过4 TB,对硬体要求相当庞大。通常只有特殊的服务如「区块链浏览器:Etherscan」或「RPC Endpoint Provider:Infura」等底层服务会有架设归档节点的需求,大多数的情况全节点已非常足够。

归档节点与安全性

归档节点对于区块链的信任模型与整体安全性原则上「不会有额外的加成或影响」,全节点(包含挖矿节点)已能充分保障全网络的安全。然而如果没有人继续维护归档节点的话,查询区块链上的历史资料得花费许多的时间。Archive Node保存了区块链上的完整历史纪录与资料,以及所有区块高度的当时全网状态。

5. 总结

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

下一章:以太坊源码分析 state

1. 源码说明database.go:底层的存储设计 dump.go  用来 dump stateDB 数据iterator.go:用来遍历 Triejournal.go:用来记录状态的改变s ...