全節點與輕節點:以太坊節點面面觀 <10> 文組也該知道的區塊鏈技術知識

Blockchain Technical Overview <10> Light node / Full node / Archive node — Brief Introduction to Ethereum Nodes

Vins Lai @AuroraCard
Pelith
10 min readJun 3, 2020

--

收看本系列文章的讀者,應該都對於區塊鏈的基本原理和架構有些概念,如果沒有,推薦您先去 Google 搜尋 區塊鏈、比特幣、以太坊這些關鍵字了解一下。我們將在這些基礎概念之上,來談區塊鏈的技術知識。本系列文章並不會談到太深的技術鑽研,而是希望以深入淺出的方式讓每一個想要搞懂區塊鏈技術的人都能在讀完後說出:原來如此!

本系列文章由區塊鏈技術解決方案開發公司:Pelith 編撰。內容皆經過諸位區塊鏈資深研究員及開發者校對與驗證,盡可能確保內容正確無誤,讓讀者能安心吸收正確的區塊鏈技術知識

在本系列過往的文章中我們逐一介紹了以太坊各個環節的運作機制,相信有在持續關注的讀者都已對以太坊技術架構有粗略的認識。

上一篇 我們用較長的篇幅完整解析「預言機 Oracle:區塊鏈與現實世界的橋樑

因應以太坊 2.0 的即將來臨,本篇文章將針對以太坊節點(Ethereum Nodes)做概論性的介紹,讓讀者能充分瞭解節點的運作機制。

以太坊網路 Ethereum Network

以太坊 Ethereum 是由分散式節點所組成的網路架構,這些節點稱為「以太坊節點 Ethereum Nodes」或「以太坊客戶端 Ethereum Clients」。任何人只要有規格足夠的電腦硬體設備都能夠加入以太坊網路中成為節點,貢獻算力賺取區塊挖礦獎勵。截至 2020/05,分佈在全世界各地的以太坊節點總共約有 5,756 個。

來源:https://www.ethernodes.org/

在當前的以太坊網路中,每個節點都是相互平等的,彼此間即時溝通「同步區塊資料」及「打包待出塊的交易(挖礦)」來維持以太坊區塊鏈的運作,我們可以透過下圖一覽節點的主要作業內容:

以太坊節點所做的工作

  • Receive Transactions:接收來自 DApp、錢包 或 其它節點 的交易資訊
  • Receive Blocks:從其它節點接收區塊資訊同步至最新的區塊高度
  • Validating:驗證新的區塊之正確性、驗證待處理交易之有效性
  • Executing:處理交易,進行運算並更改狀態值,打包成新區塊
  • Mining:用電腦算力來計算 nonce 值,最先找到 nonce 值出塊並廣播的礦工可以獲得區塊獎勵與所有交易之手續費(Gas)
  • Consensus:通過共識機制達成全網帳本之一致性或區塊重組(reorg)

以上便是以太坊節點常態性的工作內容,正是這些分佈在全球的數千個節點們不間斷地工作維繫了以太坊區塊鏈的正常運作。

然而其實節點有許多不同形式,上述參與所有工作內容(包含接收、驗證、挖礦)的節點僅是大眾普遍認知的其中一種形式,接著我們將介紹現行各種不同形式的節點。

以太坊的節點種類 Ethereum Nodes

在以太坊網路中,節點大致可被分為「全節點 Full Node」、「輕節點 Light Node」、「歸檔節點 Archive Node」三大類。我們將逐一來進行介紹。

全節點 Full Node

全節點是擁有完整區塊鏈帳本資料的節點,具備獨立驗證的能力來確認交易之有效性。具體來說全節點主要在處理下列四件事:

  1. 儲存所有歷史交易資訊,資料公開透明
  2. 監測礦工挖出來的新區塊,驗證其合法性後同步該區塊
  3. 監測區塊鏈網路中的新交易資訊,驗證每個交易的合法性
  4. 將驗證過的「交易/區塊資訊」廣播給全網路節點

一個節點只要下載了完整且最新的區塊鏈資料,穩定運行驗證交易和同步區塊資訊,那它就是一個全節點了。由於每一個全節點都保有全網資料,所以即使其中部分節點出現問題,例如斷網或被駭客攻擊,都不會影響整個區塊鏈網路的安全性。這即是「去中心化」記帳系統的優勢所在。

同時,全節點的數量越多,也代表完整的區塊鏈帳本被保存的份數越多,「不可篡改性」也就越強,整個區塊鏈網路的安全性也隨之提升。一但有人企圖組織算力叛變,試圖改變區塊共識或發動雙花攻擊,其它正常運作的全節點可以即時驗證拒絕掉這些交易。

隨着持續增加的交易記錄與智慧合約部署,全節點所需的儲存空間也在不斷增長。截至 2020/05,以太坊全節點的資料大小已經超過 360 GB,並以每個月約 30 GB 的速度持續增長中。

圖片來源:https://etherscan.io/

礦工節點

挖礦的過程即是將驗證過的待處理交易打包成新區塊,並以電腦算力來計算 「nonce 值」,最先找到 nonce 值成功出塊並廣播的礦工會獲得區塊獎勵與所有交易之手續費(gas)作為報酬。

礦工必須要運行全節點才能即時瀏覽區塊鏈歷史資料進行交易驗證,再將驗證通過的交易進行打包。因此,所有礦工必定是全節點;然而全節點未必是礦工,運行全節點的人未必會花費電腦算力去參與新區塊 nonce 值的運算來爭取區塊獎勵。

輕節點 Light Node

輕節點顧名思義即是輕量級的節點,具體定義是不儲存或維護完整的區塊鏈副本,只儲存最小量的狀態來作為發送或傳遞交易訊息的節點。至於輕節點究竟儲存了哪些狀態,我們得先透過下圖瞭解以太坊的資料結構:

圖片來源:https://blog.ethereum.org/

Block Header and Body

以太坊的每個區塊主要分為 Header 和 Body 兩個部分存儲,Body 即是交易列表;Block Header 則較為複雜,包含了前個區塊的 Hash、時間戳及挖礦難度等相關參數。

在 Block Header 中採用一種名為 Merkle-Patricia Trie (MPT) 的核心資料結構來儲存區塊鏈資訊,可以理解為把帳本分割成無數個小的資料塊,每個資料塊像是一棵樹中的無數葉片,而我們把每兩個相鄰的葉片合併成一個字串,並算出該字串的 Hash 值。如此過程經過無數次後,最終如同所有樹枝歸向一個樹幹一般,會得到一個包含了所有區塊資料的 Hash 值,稱為「Merkle Root」。

輕節點資訊

全節點儲存了所有區塊的 Block Header 與 Body(交易列表),而輕節點只儲存最小量的狀態:即「區塊標頭 Block Header」,藉此大幅降低儲存空間的需求。截至 2020/05,以太坊主網上約有 1017 萬個區塊,而每個區塊標頭的大小約為 508 bytes,故輕節點的大小約為 4.8 GB。

輕節點如何驗證交易

由於割捨掉區塊的 Body,即所有歷史的交易列表,因此當輕節點需要驗證某個交易的合法性時,具體做法為:

  1. 向鄰近的全節點發起確認請求
  2. 全節點收到請求後提供所需相關資訊供驗證

需要向全節點請求的原因是:假設有一個合約執行的交易,那麼便必須要有該合約部署時的原始碼(位在 Contract Created 之交易中)。由於該交易位於某個區塊之 Body,故輕節點必須要向全節點請求該合約之相關資訊方能進行交易驗證。

輕節點的特色摘要

整體而言,輕節點大致上具備以下幾點特色:

  • 只儲存每個區塊的區塊標頭 Block Header
  • 不一定保持隨時在線(獲取最新的 Block Header 資訊)
  • 根據需求可以只保存與自己相關的交易內容
  • 無法驗證大多數交易的合法性,只能驗證與自己相關交易的合法性
  • 無法驗證新區塊的正確性
  • 只能檢測到當前的最長鏈,但無法知道哪條是最長合法鏈

由於輕節點必須要向全節點請求與交易驗證相關的 Block Body 資訊,那麼要怎麼知道全節點回傳的資訊是正確的呢?

這時就要回到以太坊的資料結構來談,前面提到輕節點為了減少儲存空間,而割捨掉 Block Body,僅保留作為驗證之用的 Block Header。由於存有已經驗證合法之 Block Header,因此當未來需要驗證相關交易時只要透過跟全節點請求相關的 Block Body 資訊即可進行驗證,不需要從頭驗證整個區塊。

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,即歸檔節點。

歸檔節點 Archive Node

「歸檔節點」是在全節點的基礎之上,額外儲存了每個區塊高度的區塊狀態(個人帳戶與合約帳戶之當時餘額等資訊),即針對每個區塊高度當下的狀態進行快照並存檔。歸檔節點能讓你快速回到某個區塊高度去查詢當下狀態:例如你想要知道某一個帳戶在區塊高度 #5,000,000 的餘額時便會派上用場。

歸檔節點截至 2020/05 的資料大小已經超過 4 TB,對硬體要求相當龐大。通常只有特殊的服務如「區塊鏈瀏覽器:Etherscan」或「RPC Endpoint Provider:Infura」等底層服務會有架設歸檔節點的需求,大多數的情況全節點已非常足夠。

歸檔節點與安全性

歸檔節點對於區塊鏈的信任模型與整體安全性原則上「不會有額外的加成或影響」,全節點(包含挖礦節點)已能充分保障全網路的安全。然而如果沒有人繼續維護歸檔節點的話,查詢區塊鏈上的歷史資料得花費許多的時間。Archive Node 保存了區塊鏈上的完整歷史紀錄與資料,以及所有區塊高度的當時全網狀態。

截至 2020/05,以太坊全網的歸檔節點總數量約為 100 個。

最後,我們透過下方的圖表來綜覽三種節點之異同:

結論

  1. 在以太坊網路中,節點大致可被分為「全節點 Full Node」、「輕節點 Light Node」、「歸檔節點 Archive Node」三大類。
  2. 輕節點(Light Node)僅儲存了區塊標頭 Block Header,沒有儲存 Body。當需要驗證交易時會向鄰近的全節點發起相關資訊請求以進行驗證。
  3. 歸檔節點(Archive Node)即在全節點基礎之上多儲存了每個區塊高度的狀態(State)快照,供檢索相關用途。

介紹至此,讀者應該對於節點有初步的認識。未來,我將在這基礎之上進行以太坊 2.0 上線前的過度階段「以太坊 1.X」相關介紹,敬請期待!

以上,若有任何

A. 我寫得不夠清楚的地方
B. 撰寫上改進的建議
C. 希望我能夠撰寫分享的區塊鏈技術知識內容

都非常歡迎在底下留言回覆。希望我的文章能幫助到更多像我一樣想學習區塊鏈技術與知識的朋友。如果您覺得讀完有所收穫,也希望能

  • 給我 50 claps
  • 分享給您的朋友們

謝謝大家!

也歡迎大家閱讀區塊鏈技術知識系列的其它篇文章
https://medium.com/pelith/blockchain-technical-overview-8c2a643424fa

--

--

Vins Lai @AuroraCard
Pelith
Editor for

Co-Founder of Aurora Card - World's First Crypto Credit Card built on Trust with supreme Privacy, sign up: https://app.aurora-card.com/signup?userRef=N527Zi