---
title: "什麼是 Geth node，以及如何運行"
description: "需求、安裝與部署"
---

## Geth 與節點簡介

[Ethereum 節點](http://www.alchemy.com/overviews/what-is-an-ethereum-node)是屬於 Ethereum 區塊鏈網路的電腦。這些節點是實際運作軟體的電腦,負責檢查、儲存區塊,有時候也負責產生區塊。

「Client」是這種軟體的名稱。它讓我們可以透過 JSON-RPC API 與區塊鏈互動、讀取並驗證區塊鏈,以及讀取或寫入智能合約。

Geth 是其中一種 client,也是最常被使用的其中之一。它以 Go 語言撰寫,由 Ethereum Foundation 的一群人以及其他協助者維護更新。

**Geth 的一些特性:**

- 內建 JavaScript console,可透過 "geth console" 執行。
- 這個 client 可以與其他 JavaScript client 搭配運作(web3js)。
- 內建 Rinkeby 測試網(或是自行建立私有的 Ethereum 網路)
- 通常被視為其他 Ethereum 節點的標準。

在這篇 Alchemy 部落格文章中,我們會學習如何安裝並執行 Geth 節點。

## 網路(Mainnet 與 testnet)與 Geth

要了解 Geth 節點,我們需要先了解 Ethereum 的不同網路。

Ethereum 有一個單一的核心網路(Mainnet),所有交易都在這裡進行,但它也使用了[其他測試網路](https://www.alchemy.com/overviews/what-are-testnets),這些網路是用來測試功能的(Testnet)。可以考慮使用這些「練習用」區塊鏈,在 localhost 以外的環境嘗試區塊鏈的功能。

### 1. Mainnet

[Ethereum mainnet](https://www.alchemy.com/rpc/ethereum) 是用來產生 Ethereum 的網路。ETH 可以在這裡挖礦或在交易所交易,而且永遠可以使用。

### 2. Ropsten

Ropsten 是最接近 mainnet 的測試網路,基於相同的工作量證明(proof of work)。這個[Ropsten 測試網路](https://www.alchemy.com/overviews/ropsten-testnet)容易受到垃圾交易攻擊,因為測試用 ETH 的挖礦方式與 Mainnet ETH 相同,而且很容易取得,沒有實際價值。

### 3. Rinkeby

Rinkeby 的測試網使用權威證明(proof of authority),也就是說,除非你能證明自己的身分,否則無法取得測試用 ETH。做法是將 Ethereum 位址與社群媒體帳號(例如 Facebook)連結。這使得攻擊這個網路變得困難許多,因為要取得大量 ETH 需要花費相當大的功夫。Rinkeby 只能透過 Geth 節點存取。

若要開始在 Rinkeby 測試網上建置,可以[從免費水龍頭取得 Rinkeby Ether](https://rinkebyfaucet.com/)。

### 4. Kovan

主要差異在於 Kovan 只能在 parity 節點上使用,而且你必須透過 GitHub 驗證身分。

### 5. Goerli

Goerli 是在權威證明(Proof-of-Authority)架構下部署的。它採用 Clique 共識機制,最初由 Chainsafe 與 Afri Schoedon 開發。Goerli 社群負責維護這個網路,並由 Geth、Parity、[Nethermind](https://www.alchemy.com/dapps/nethermind) 與 Hyperledger Besu 提供支援。相較於 Kovan 與 Rinkeby,Goerli 的網路規模、節點數量與 client 種類都更多。

了解[如何取得 Goerli Ether](https://goerlifaucet.com/),並使用 Alchemy 的 [GoETH 水龍頭](https://goerlifaucet.com/)開始在 Goerli 測試網上進行操作。

### 6. Kiln

在撰寫本文時,由於 Ethereum 正全速朝著今年稍晚的權益證明合併(proof of stake merge)邁進,上述許多測試網都將被淘汰或升級。截至目前,Kiln 測試網是轉換為權益證明之前的最後一個公開測試網。

這次轉換對 Ethereum 網路來說是一項重大成就,這個網路即將經歷自成立以來最重大的變化之一。假設 Kiln 沒有出現問題,現有的 Ethereum 測試網(Goerli、Ropsten 等)將能夠不受影響地繼續運作。

進一步了解 [Kiln 測試網](https://www.alchemy.com/overviews/kiln-testnet),並[取得模擬的 Kiln Ether](https://kilnfaucet.com/)以開始在 Kiln 上進行建置。

## 什麼是 Geth 節點?

<ImageBlock
  src="https://media.alchemy.com/1704166765-geth-node.png"
  alt="Geth 節點類型示意圖：Ethereum 上的 light、full 與 archive node"
  width={1224}
  height={602}
/>

透過 Geth,你可以建立自己的私有 Ethereum 網路。一個 Ethereum 網路的區塊鏈,是從一個稱為 genesis block(創世區塊)的根區塊開始的。genesis block 中沒有任何交易。

Ethereum 節點有不同種類,但 Geth 節點分為三類:light node、full node 與 archive node。

### _Light node_

由於 light node 不會驗證每一個區塊,所以它們不會保存一份完整的 Ethereum 區塊鏈副本。因此,它們依賴來自 full node 的資料。執行 light node 有許多優點,包括啟動速度更快、儲存空間使用更少,以及運算/記憶體需求更低。light node 的信任程度較低,而且經常依賴 full node,這可能會造成問題。

Light node:

- 儲存區塊標頭鏈(header chain),並向其他節點請求其餘資料。
- 依據區塊標頭中的 state root 驗證資料的有效性。
- 提供給低運算能力的裝置使用,例如嵌入式裝置或手機,這些裝置無法負擔儲存數 GB 的區塊鏈資料。

### _Full node_

Full node 會驗證區塊中的交易是否符合 [Ethereum Yellow Paper](https://ethereum.github.io/yellowpaper/paper.pdf) 所規定的標準。它們這麼做是為了確保透過網路傳送的區塊是真實有效的。你可以信任它們所做的驗證工作。full node 使用這種驗證方式,讓網路維持符合 Ethereum 的要求。

Full node:

- 儲存完整的區塊鏈資料。
- 參與區塊驗證,並驗證所有區塊與狀態。
- 推導出所有的狀態(state)。
- 服務網路,並依請求提供資料。

### _Archive node_

Archive node 是會保存完整交易歷史的節點。網路的健全性與結構都仰賴這些節點。

Archive node:

- 儲存 full node 所保存的所有資料,並建立歷史狀態(historical state)的存檔。如果你想要查詢帳戶餘額或任何鏈上資料,或是單純想在不透過挖礦的情況下,簡單且可靠地測試自己的交易集合,就需要使用 [OpenEthereum](https://ethereum.org/en/developers/docs/nodes-and-clients/#:~:text=Stores%20everything%20kept,and%20chain%20analytics.)。
- 提供的資料量以 TB(terabyte)為單位。這使得一般使用者較不會想使用,但對於區塊瀏覽器、錢包供應商與鏈上分析服務等來說相當實用。

<ImageBlock
  src="https://media.alchemy.com/1704166787-pow-consensus.png"
  alt="Ethereum 節點在網路中達成 proof-of-work 共識的示意圖"
  width={1079}
  height={493}
  caption="source: https://ethereum.org/en/developers/docs/nodes-and-clients/"
/>

‍

## 安裝 Geth 的需求

- 多核心 CPU(7GB\+ RAM)
- 本機 SSD 硬碟,約需 600GB\+ 的可用空間
- 選用:使用 16/32 GB\+ 的 CPU,透過快取(caching)提升效能。使用快取功能(也就是加上 '--cache' 參數)後,Geth 就能從記憶體讀取 state,而不必從硬碟讀取。
- Mac 使用者需要 [Homebrew](https://formulae.brew.sh/formula/ethereum)
- Linux/Ubuntu 使用者需要 [PPA](https://launchpad.net/~ethereum/+archive/ubuntu/ethereum)
- 選用:Parity(想了解更多資訊,可參考[如何從 parity 遷移到 Geth](https://hub.docker.com/r/ethereum/client-go/))‍

## Geth 安裝方式

你可以透過套件管理工具安裝 Geth,例如在 MacOS 上使用 homebrew,或在 Ubuntu 上使用 PPA;也可以直接下載、在 [docker](https://hub.docker.com/r/ethereum/client-go/) 中執行,或甚至[從原始碼建置](https://github.com/ethereum/go-ethereum)。

### 在 MacOS 終端機中使用 Homebrew:

<CodeSnippet
  code={`\$ brew tap ethereum/ethereum
\$ brew install ethereum`}
  language="text"
  theme="light"
/>

可以在[這裡](https://hub.docker.com/r/ethereum/client-go/)查看各種實用指令的清單(abigen、bootnode、checkpoint-admin、clef、devp2p、ethkey、evm、faucet、geth 等),或者也可以執行:

<CodeSnippet code={`\$ geth --help`} language="text" theme="light" />

### Linux/Ubuntu 適用的 PPA:

<CodeSnippet
  code={`\$ sudo add-apt-repository -y ppa:ethereum/ethereum`}
  language="text"
  theme="light"
/>

### 安裝穩定版本的 go-Ethereum:

<CodeSnippet
  code={`\$ sudo apt-get update
\$ sudo apt-get install ethereum`}
  language="text"
  theme="light"
/>

### Docker:

從[這裡](https://hub.docker.com/r/ethereum/client-go/)下載 Docker。然後執行以下指令:

<CodeSnippet
  code={`\$ docker pull ethereum/client-go:latest`}
  language="text"
  theme="light"
/>

接著執行:

<CodeSnippet
  code={`\$ docker run ethereum/client-go:latest`}
  language="text"
  theme="light"
/>

## 執行 Geth

在我們解壓縮 Geth 資料夾/root 資料夾的位置,於終端機中執行以下指令,以便執行它:

<CodeSnippet
  code={`\$ ./Geth console --testnet --syncmode "light" --rpc --rpcaddr "localhost" --rpcport "8485" --rpccorsdomain "*" --rpcapi="db,eth,net,web3,personal"`}
  language="text"
  theme="light"
/>

這會立刻將我們帶進 Geth console。

輸入 `net`,我們可以查看是否有任何 peer。輸入 `eth.syncing`,可以查看節點目前是否正在同步。你的節點有可能要等到重新啟動後才會開始同步。

舉例來說,執行 `eth.syncing` 會輸出以下的範例查詢結果:

<ImageBlock
  src="https://media.alchemy.com/1704167169-eth-syncing-output.svg"
  alt="eth.syncing 查詢的 Geth 主控台輸出，顯示區塊同步進度"
  width={1570}
  height={393}
/>

## 結語

大多數供一般使用者採用的 web/擴充功能錢包([MetaMask](https://www.alchemy.com/dapps/metamask)、[Coinbase](https://www.alchemy.com/dapps/coinbase)、Rainbow 等)通常都已經內建了 Geth。

不過,如果你想嘗試挖礦,或開發自己專屬的 Ethereum 軟體,安裝並執行 Geth 是相當值得的。如果你只是想掌控自己的節點與錢包金鑰(自行簽署交易,而不依賴第三方軟體),這麼做也很有幫助。使用 Geth,現在你可以打開 Ethereum 開發的整個世界!
