以太坊作為全球領(lǐng)先的智能合約平臺(tái)和去中心化應(yīng)用(DApp)生態(tài)系統(tǒng)的基石,吸引了無(wú)數(shù)開(kāi)發(fā)者和研究者的關(guān)注,在自己的服務(wù)器上搭建以太坊節(jié)點(diǎn),不僅可以參與網(wǎng)絡(luò)驗(yàn)證、獲取交易收益(對(duì)于驗(yàn)證者節(jié)點(diǎn)),還能更深入地了解區(qū)塊鏈的運(yùn)行機(jī)制,并為DApp開(kāi)發(fā)和測(cè)試提供穩(wěn)定的環(huán)境,本文將詳細(xì)介紹如何在阿里云服務(wù)器上,從零開(kāi)始搭建一個(gè)以太坊全節(jié)點(diǎn)(以Geth客戶(hù)端為例)。

準(zhǔn)備工作:選擇合適的阿里云服務(wù)器

在開(kāi)始之前,選擇一款合適的云服務(wù)器至關(guān)重要,以太坊節(jié)點(diǎn)對(duì)硬件資源有一定要求:

  1. CPU:建議選擇至少2核vCPU,多核CPU有助于同步和同步后的交易處理。
  2. 內(nèi)存:建議至少4GB RAM,8GB或以上更佳,特別是在同步區(qū)塊和運(yùn)行復(fù)雜智能合約時(shí)。
  3. 存儲(chǔ):這是最關(guān)鍵的部分,以太坊區(qū)塊鏈數(shù)據(jù)量巨大且持續(xù)增長(zhǎng)(截至2024年初,已超過(guò)1TB,并仍在增加)。
    • 類(lèi)型:必須選擇高性能云盤(pán),如ESSD(彈性塊存儲(chǔ)),以保證I/O性能,避免同步和運(yùn)行時(shí)因磁盤(pán)性能不足而卡頓。
    • 大小:建議至少選擇500GB起步,但考慮到未來(lái)增長(zhǎng),1TB或更大更為穩(wěn)妥,可以在初始配置時(shí)選擇較小容量,后續(xù)通過(guò)擴(kuò)容功能增加。
  4. 操作系統(tǒng):推薦使用Ubuntu Server 20.04 LTS或22.04 LTS,64位版本,因?yàn)镚eth對(duì)Linux的支持最好,社區(qū)文檔也最豐富。
  5. 網(wǎng)絡(luò):確保服務(wù)器帶寬足夠,建議至少5Mbps以上,且最好是按量后付費(fèi)或固定帶寬,以保證同步速度的穩(wěn)定性。

連接服務(wù)器與基礎(chǔ)環(huán)境配置

  1. 遠(yuǎn)程連接:使用SSH工具(如PuTTY、Xshell或Terminal)連接到你的阿里云服務(wù)器,公網(wǎng)IP地址和登錄憑證在阿里云ECS控制臺(tái)可以獲取。
    ssh root@你的服務(wù)器公網(wǎng)IP
  2. 更新系統(tǒng)
    sudo apt update
    sudo apt upgrade -y
  3. 創(chuàng)建非root用戶(hù)(推薦)
    sudo adduser ethereum  # 創(chuàng)建一個(gè)名為ethereum的用戶(hù)
    sudo usermod -aG sudo ethereum # 將該用戶(hù)加入sudo組

    然后退出root登錄,用新創(chuàng)建的ethereum用戶(hù)登錄:

    exit
    ssh ethereum@你的服務(wù)器公網(wǎng)IP
  4. 安裝必要工具
    sudo apt install -y git wget curl build-essential

安裝Geth以太坊客戶(hù)端

Geth是以太坊官方Go語(yǔ)言實(shí)現(xiàn)的客戶(hù)端,是最常用、最穩(wěn)定的以太坊節(jié)點(diǎn)軟件之一。

  1. 下載Geth:訪問(wèn)Geth的官方GitHub Releases頁(yè)面(https://github.com/ethereum/go-ethereum/releases)獲取最新穩(wěn)定版的下載鏈接,或者使用以下命令下載(以最新版本為例,請(qǐng)?zhí)鎿Q為實(shí)際版本號(hào)):

    # 下載最新穩(wěn)定版的geth(請(qǐng)?zhí)鎿Q為實(shí)際版本號(hào))
    wget https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.13.12-4cd6ba6d.tar.gz

    (注意:版本號(hào)會(huì)更新,請(qǐng)務(wù)必確認(rèn)最新穩(wěn)定版號(hào))

  2. 解壓并安裝

    tar -xvf geth-linux-amd64-*.tar.gz
    sudo cp geth-linux-amd64/geth /usr/local/bin/
    # 驗(yàn)證安裝
    geth version

    如果看到版本信息,說(shuō)明安裝成功。

初始化以太坊節(jié)點(diǎn)

在啟動(dòng)節(jié)點(diǎn)之前,可以選擇初始化一個(gè)數(shù)據(jù)目錄,這一步不是必須的,但可以提前配置一些參數(shù)。

  1. 創(chuàng)建數(shù)據(jù)目錄
    mkdir -p ~/ethereum/data
  2. 初始化(可選): 如果你想創(chuàng)建一個(gè)自定義的genesis.json文件(通常用于私有鏈或測(cè)試鏈),可以初始化,對(duì)于公共主網(wǎng),這一步可以跳過(guò),Geth在首次啟動(dòng)時(shí)會(huì)自動(dòng)使用主網(wǎng)的genesis block。
    # geth init --datadir ~/ethereum/data /path/to/your/genesis.json

啟動(dòng)并同步以太坊節(jié)點(diǎn)

這是核心步驟,我們將啟動(dòng)Geth節(jié)點(diǎn)并開(kāi)始同步以太坊區(qū)塊鏈數(shù)據(jù)。

  1. 基本啟動(dòng)命令

    geth --datadir ~/ethereum/data sync
    • --datadir:指定數(shù)據(jù)存儲(chǔ)目錄。
    • sync:?jiǎn)?dòng)同步模式。
  2. 常用啟動(dòng)參數(shù)(推薦): 為了更好的體驗(yàn)和性能,通常會(huì)添加更多參數(shù):

    geth \
      --datadir ~/ethereum/data \
      --http \
      --http.addr "0.0.0.0" \
      --http.port "8545" \
      --http.api "eth,net,web3,personal" \
      --ws \
      --ws.addr "0.0.0.0" \
      --ws.port "8546" \
      --ws.api "eth,net,web3" \
      --syncmode "snap" \
      --gcmode "full" \
      --cache 8192 \
      --maxpeers 50 \
      console
    • --http:?jiǎn)⒂肏TTP-RPC服務(wù),方便DApp或其他工具連接。
    • --http.addr "0.0.0.0":允許任何IP訪問(wèn)HTTP-RPC服務(wù)(生產(chǎn)環(huán)境請(qǐng)謹(jǐn)慎設(shè)置,或限制特定IP)。
    • --http.port "8545":HTTP-RPC服務(wù)端口,默認(rèn)8545。
    • --http.api:允許通過(guò)HTTP-RPC訪問(wèn)的API列表。
    • --ws:?jiǎn)⒂肳ebSocket-RPC服務(wù),適用于實(shí)時(shí)性要求高的應(yīng)用。
    • --ws.addr--ws.port:WebSocket服務(wù)地址和端口。
    • --syncmode "snap":使用快速同步模式(snap sync),是目前最快的同步方式,它會(huì)先下載狀態(tài)數(shù)據(jù),再逐步同步歷史區(qū)塊。
    • --gcmode "full":運(yùn)行全節(jié)點(diǎn)模式,保存所有區(qū)塊數(shù)據(jù),可以設(shè)置為light運(yùn)行輕節(jié)點(diǎn),但全節(jié)點(diǎn)功能更完整。
    • --cache 8192:設(shè)置緩存大小(單位MB),適當(dāng)?shù)木彺婵梢蕴嵘阅埽ㄗh根據(jù)服務(wù)器內(nèi)存調(diào)整。
    • --maxpeers 50:最大連接節(jié)點(diǎn)數(shù),默認(rèn)25,可根據(jù)網(wǎng)絡(luò)狀況調(diào)整。
    • console:?jiǎn)?dòng)后進(jìn)入交互式控制臺(tái),方便管理和查詢(xún)節(jié)點(diǎn)狀態(tài)。
  3. 后臺(tái)運(yùn)行: 如果你想讓節(jié)點(diǎn)在后臺(tái)持續(xù)運(yùn)行,可以使用nohup結(jié)合&

    nohup geth --datadir ~/ethereum/data --syncmode snap --gcmode full --http --http.addr "0.0.0.0" --http.port "8545" --http.api "eth,net,web3,personal" --cache 8192 --maxpeers 50 > ~/ethereum/geth.log 2>&1 &

    這樣,Geth將在后臺(tái)運(yùn)行,日志會(huì)輸出到~/ethereum/geth.log文件中。

驗(yàn)證節(jié)點(diǎn)狀態(tài)與遠(yuǎn)程訪問(wèn)

  1. 查看同步狀態(tài): 如果啟動(dòng)時(shí)進(jìn)入了控制臺(tái)(console),可以輸入:

    eth.syncing

    如果返回false,表示已同步完成;如果返回一個(gè)對(duì)象,則表示仍在同步中,可以查看currentBlockhighestBlock等進(jìn)度。 如果是后臺(tái)運(yùn)行,可以查看日志:

    tail -f ~/ethereum/geth.log

    日志中會(huì)顯示同步進(jìn)度。

  2. 遠(yuǎn)程連接到Geth控制臺(tái): 在本地電腦上,可以通過(guò)以下命令連接到服務(wù)器上的Geth控制臺(tái):

    ssh -L 8545:localhost:8545 ethereum@你的服務(wù)器公網(wǎng)IP

    然后在SSH連接會(huì)話(huà)中運(yùn)行:

    geth attach http://localhost:8545

    或者直接使用geth attach命令(如果geth在PATH中):

    geth attach ~/ethereum/data/geth.ipc

    (注意:IPC文件只在本地有效,所以通常需要先SSH隧道連接)

  3. 通過(guò)HTTP-RPC遠(yuǎn)程訪問(wèn): 確保阿里云ECS服務(wù)器的安全組規(guī)則已放行你設(shè)置的HTTP和WebSocket端口(如8545和8546)。

    登錄阿里云