如何跑起以太坊執行層與共識層客戶端

ChiHaoLu
SWF Lab
Published in
15 min readJul 7, 2023

本文一開始會簡單介紹什麼是客戶端,如果大家對相關內容還完全不了解,可以透過我提供的 References 來幫助理解。而本文的重點在介紹在 The Merge 之後如何跑起執行層與共識層的客戶端。

Author: ChiHaoLu(chihaolu.eth) @ swfLAB

Briefly Introduction

What is Node? What is Client?

“Run a Node” 和 “Run a Client” 是同一件事情。

Image0: Nodes and networks | Prysm

以太坊是一個分散式網路,由節點們(Nodes)構成,實際上跑(或說運行)每一個節點就是在跑一個軟體,而這個軟體又稱為客戶端(Client):

  1. 包含了 Ethereum 的 Protocol(EVM、如何處理交易、區塊、合約的規則)、會根據交易執行合約內容,並產生新的狀態
  2. 會下載以太坊區塊鏈的副本並驗證每個區塊的有效性
  3. 隨著新的區塊和交易的出現時可以驗證新區塊和交易數據,使其保持最安全和最新的狀態
  4. 協助其他人下載和更新他們自己的副本(與其他人進行同步)
Image 1:Ethereum.org | SPIN UP YOUR OWN ETHEREUM NODE

由 Image 1 可以看見一個 Ethereum Node 由 Execution Layer Client(執行層客戶端)和 Consensus Layer Client(共識層客戶端)兩種客戶端組成。而本文會著重在運行一個節點,也就是這兩種客戶端上,而不會深入 Validator 的內容。

關於「The Merge 前後的差別」以及「Run a Node 還有 Run a Validator 的差別」在後文會提到。

Execution Client vs Consensus Client

合併後的以太坊由兩個部分組成:執行層和共識層。這兩層由不同的客戶端軟體運行。不同的執行層客戶端和不同的共識層客戶端,會有不同的團隊以不同程式語言開發實現。

執行層客戶端(Execution Layer Client)

  • 也稱為 Execution Engine、EL Client 或過往稱作 ETH1 Client。
  • 用於監聽網路中廣播(會管理一個 mempool)的新交易,將它們在 EVM 中執行(執行智能合約的內容),並保存所有當前以太坊數據的最新狀態和數據庫。更白話一點說就是管理用戶狀態並執行與交易相關的計算。
  • 例如 Geth 由 Golang 實現,Nethermind 以 C# 和 .NET 實現。

共識層客戶端(Consensus Layer Client)

  • 也稱為 Beacon Node、CL Client 或過往稱作 ETH2 Client。
  • 驗證 PoS,以及 Fork Choice Rule(LMD GHOST)
  • 例如 Prysm 以 Golang 實現,和 Lighthouse 以 Rust 實現。

多種客戶端實現可以減少對單個程式碼庫的依賴,使網路多樣性增加,不讓任何一種客戶端主導整個網路,從而消除潛在的單點錯誤。多種語言的存在還可以吸引更廣泛的開發者社區,使他們能夠使用自己喜歡的語言來參與客戶端的開發。

以下是兩種客戶端之間的關係:

  1. 兩種客戶端透過 Engine API 這樣一個 JSON RPC API 溝通(可見下方 Image 2)
  2. 執行層和共識層客戶端使用 JWT 密鑰對彼此進行身份驗證(達到安全的溝通),且每一個共識層客戶端必須要且只能與一個執行層客戶端配對。
  3. 多個 Validator 可以對應同一組共識層客戶端 + 執行層客戶端組合
Image 2: Ethereum.org | NODES AND CLIENTS

關於兩者如何互動的細節可以參考以下 Reference:

  1. Ethereum.org | Ethereum Execution Client Specifications
  2. Ethereum.org | Ethereum Consensus Client Specifications
  3. TEM | 以太坊 The Merge 合併之技術面懶人包 (2022–04 version)
  4. TEM | Eth 2.0 的共識層和執行層分工及 The Merge 影響
  5. Infura | How The Execution Client and the Consensus Client Can Work Together on the Blockchain

當使用者抵押 32 ETH 參與以太坊的 PoS 共識機制時,他們會使用一個獨立的軟體稱為 Validator Client,他會連接到他們的 Prysm Beacon Node。這個特殊的軟體管理著 Validator 金鑰和負責生成新的區塊和對他人提議的區塊進行投票。

簡單來說,Validator Client 讓人們將 32 ETH 作為擔保品在以太坊的共識層中進行抵押。Validator 負責在以太坊的 PoS 共識機制中提議區塊,並在「合併」之後完全取代 PoW miner。

Validator Client 僅與本地通過 Beacon Node 連接到以太坊網路,Validator 的 Beacon Node 告訴 Validator 需要執行的工作,並在 Validator 執行其職責時將 Validator 的成果廣播到以太坊網路上。而 Beacon Node 則依賴 Execution Node。

Image3: Nodes and networks | Prysm

Before and After The Merge

在合併之前,共識層和執行層是獨立的網絡,那時候所有以太坊的交易和用戶活動都在現在的執行層上進行。也就是只有一個(執行層)客戶端軟體同時提供執行環境(EVM)和對礦工生成的區塊(PoW)進行共識驗證。

自 2020 年 12 月之後,共識層(信標鏈、Beacon Chain)開始獨立運行,它使用了基於權益證明(PoS、proof-of-stake)的共識機制,並根據來自以太坊主網的數據協調 Validator 的網路。

而在 The Merge 之後,Ethereum 進到 PoS,執行層客戶端和共識層客戶端必須一起運作,以驗證以太坊的最新狀態。也就是我們前面講的執行層客戶端會負責搜集交易然後利用 EVM 執行交易,而共識層客戶端會驗證共識機制(PoS)。

Image 4: Mainnet Merge Announcement

誰需要/可以跑節點?跑節點需要抵押 ETH 嗎?

從 Image 1 我們可以看見 Node 並不包含 Validator,而 Validator 包含 Node。所以節點不是只給 Validator(PoS 權益證明的驗證者)使用,而是任何人都可以運行節點,而且你不需要擁有以太幣就可以跑節點。

跑節點不一定要當 Validator(抵押 ETH),而當 Validator 一定要跑節點。

只跑一個節點無法像 Validator 那樣獲得獎勵,因為真正「批准一筆交易是否能夠到區塊」裡面是 Validator 在做的,而節點只負責「執行交易和驗證結果」。但對於任何以太坊用戶來說,運行節點還有許多其他好處,包括隱私、安全性、降低對第三方服務器(Node Provider)的依賴、抗審查性和改善網路的健康和去中心化程度。

也就是說擁有自己的節點之後,你就不需要信任由第三方提供的有關以太坊的網路狀態的訊息,也不用透過第三方送出你的交易。

關於跑節點的好處可見 Reference:

  1. Ethereum.org | WHY SHOULD I RUN AN ETHEREUM NODE?
  2. Mastering Ethereum — Should I Run a Full Node

當然跑一個自己的節點會耗費許多成本,如果覺得不需要的話使用第三方的 Node Provider(e.g. Infura 或 Alchemy)也可以。

Node Types vs Sync Modes

為了追蹤和驗證網路中的當前數據,以太坊客戶端需要與最新的網路狀態同步。所以當我們運行客戶端,會從其他節點下載數據,進行加密驗證以確保其完整性,並構建一個 Local DB 來儲存區塊鏈歷史資料。

  • 不同的 Node Types 代表這些節點以不同的方式儲存數據,以及參與驗證與否。
  • 不同的 Sync Modes 代表節點能夠多快地獲取到以太坊狀態的最新信息,而執行層客戶端與共識層客戶端有不同的同步方式。

Node Types 和 Sync Modes 有很多種分類,詳細可見以下 Reference:

Running Clients

Travel Preparations

  1. 本文選擇開發文件最豐富的 Nethermind 作為示範執行層的客戶端,以及選擇目前參與程度最高的 Prysm 作為共識層的客戶端。
  2. 本文使用 MacBook Pro 2022 M2 作為作業系統
  3. 本文使用 Sepolia 作為測試網

Step 0: Create Folders

首先在電腦的任意一處創建一個資料夾 ethereum,底下創建兩個子資料夾 consensusexecution,分別儲存共識層客戶端和執行層客戶端的軟體。

📂ethereum
┣ 📂consensus
┣ 📂execution

Step 1: Installing CL Client

進到 consensus 這個資料夾($ cd consensus),並且下載執行層客戶端 prysm:

$ mkdir prysm && cd prysm
$ curl https://raw.githubusercontent.com/prysmaticlabs/prysm/master/prysm.sh --output prysm.sh && chmod +x prysm.sh
>
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 9538 100 9538 0 0 16510 0 --:--:-- --:--:-- --:--:-- 16762

設置 auth-secret:

## Optional. This command is necessary only if you've previously configured USE_PRYSM_VERSION
$ USE_PRYSM_VERSION=v4.0.0

## Required.
$ ./prysm.sh beacon-chain generate-auth-secret
>
Latest Prysm version is v4.0.6.
Downloading beacon chain@v4.0.6 to /Users/chihaolu/Desktop/Blockchain/ethereum/consensus/prysm/./dist/beacon-chain-v4.0.6-darwin-arm64 (automatically selected latest available version)
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 71.7M 100 71.7M 0 0 9242k 0 0:00:07 0:00:07 --:--:-- 11.6M
gpg is not available. Either install it or run with PRYSM_ALLOW_UNVERIFIED_BINARIES=1.

共識層客戶端與執行層客戶端之間的 HTTP connection 需要由 JWT token 驗證,而產生 JWT token 的方式有許多種,例如:

  • Use a utility like OpenSSL to create the token via command: openssl rand -hex 32 | tr -d "\n" > "jwt.hex".
  • Use an execution client to generate the jwt.hex file.
  • Use Prysm to generate the jwt.hex file:

我們將 jwt.hex 這個 file 放在 ethereum/consensus/prysm 資料夾中。

Step 2: Installing EL Client

ethereum/execution 這個資料夾中:

$ brew tap nethermindeth/nethermind
$ brew install nethermind

Step 3: Running EL Client

$ nethermind \
--config sepolia \
--JsonRpc.Enabled true \
--HealthChecks.Enabled true \
--HealthChecks.UIEnabled true \
--JsonRpc.JwtSecretFile=../consensus/prysm/jwt.hex \
--Merge.TerminalTotalDifficulty 17000000000000000
>
======================== Nethermind initialization completed ========================
This node : enode://49573c3ede0f35acef54303e11df7ad79ca979cb66fa1a8a7748ea4732030b2d31efaf38b23a501257d65abf3d34463b8a9ab6e83c1b66dfdf4ba103b380af84@36.227.225.253:30303
RPC modules : Eth, Health, Net, Parity, Personal, Proof, Rpc, Subscribe, Trace, TxPool, Web3
Node address : 0x629f29d3574e88e22f0f4b1c68dd4cf5300a15e4 (do not use as an account)
Mem est tx : 41MB
Mem est DB : 4MB
JSON RPC : http://127.0.0.1:8545 ; http://localhost:8551
Genesis hash : 0x25a5cc106eea7138acab33231d7160d69cb777ee0c2c553fcddf5138993e6dd9
External IP : 36.227.225.253
Ethereum : tcp://36.227.225.253:30303
Discovery : udp://36.227.225.253:30303
Client id : Nethermind/v1.19.3+e8ac1da4/macos-arm64/dotnet7.0.8
Chainspec : chainspec/sepolia.json
Chain head : 0 (0x25a5cc...3e6dd9)
Chain ID : Sepolia
=====================================================================================
2023-07-07 22:01:43.9652|Waiting for Forkchoice message from Consensus ...

若出現錯誤:

2023-07-07 21:58:28.8959|Step StartRpc                 failed after 385ms System.IO.IOException: Failed to bind to address http://127.0.0.1:8545: address already in use.

則可:

$ lsof -i:8545
$ kill -9 <process_id>

就可以殺掉佔用的進程,再重新執行指令就可以跑了。

Step 4: Running CL Client(Run a beacon node using Prysm)

首先下載 Sepolia genesis state(Github)到 consensus/prysm

ethereum/consensus/prysm 這個資料夾中:

$ ./prysm.sh beacon-chain \
--execution-endpoint=http://localhost:8545 \
--sepolia \
--jwt-secret=jwt.hex \
--genesis-state=genesis.ssz
  • 如果出現這個問題 gpg is not available. Either install it or run with PRYSM_ALLOW_UNVERIFIED_BINARIES=1.,可以跑 $ export PRYSM_ALLOW_UNVERIFIED_BINARIES=1
  • 這邊不跑 Validator,需要的人可以參考此文件

--

--

ChiHaoLu
SWF Lab

Multitasking Master & Mr.MurMur | Blockchain Dev. @ imToken Labs | chihaolu.me | Advisory Services - https://forms.gle/mVGKQwPQEUP37fLYA