01_以太坊主網節點搭建
0x01 搭建節點需要什麼配置
推薦配置:
CPU: 4 core 記憶體: 8G 硬碟: 500G SSD (固態硬碟) 網路: 5M+
最低配置:
CPU: 2 core 記憶體: 4G 硬碟: 500G 高速硬碟 網路: 2M
我自己搭節點用的是這裡說的推薦配置,週一下午開始同步,週三早上來上班就已經同步好了。
0x02 節點是放國內還是國外
放國外安裝過程會更順利,國內雲服務已經比較成熟了,但由於牆的原因,搭建過程稍微麻煩一點兒。
最近的這次安裝,因為買國外伺服器走公司財務比較麻煩,就買了阿里雲的 VPS,因為公司其它系統用的都是 CentOS 6,這裡也用了CentOS 6,其實網上關於 Ubuntu 和 CentOS 7的資料更多。
0x03 具體安裝步驟
1. 安裝 go 語言
安裝 go 主要是為了去編譯 go-ethereum 原始碼
平日裡一般我都是用gvm 去安裝和管理不同版本的 go,但 gvm 在阿里雲上預設是連不上所需要的 golang 下載伺服器的。於是直接用下面一條命令搞定。
yum install golang
安裝的版本不是最新的但也還是可以用的。
# go version go version go1.9.6 linux/amd64
2. 安裝 git
安裝 git 主要是為了拉取 go-ethereum 原始碼
直接通過 yum 安裝的版本比較老
我是通過下面的命令安裝的:
yum install https://centos6.iuscommunity.org/ius-release.rpm yum install epel-release yum install git2u
得到下面的 git 版本
# git version git version 2.16.4
ius 是專門用來提供 RPM 包的一個社群專案,具體可以檢視iuscommunity
3. 獲取 go-ethereum 原始碼
可以通過下面的命令獲取 go-ethereum 並切換到指定的 release branch
git clone https://github.com/ethereum/go-ethereum.git cd go-ethereum/ git checkout release/1.8
接下來對原始碼進行編譯
cd go-ethereum/ make all
編譯之後會在 go-ethereum/build/bin 下生成各種二進位制檔案,其中包括接下來會用到的geth
# ls abigenbootnodeclefethkeyevmexamplesfaucetgethp2psimpuppethrlpdumpsimulationsswarmswarm-smokewnode
4. 新增 geth 到系統路徑
- 開啟 /etc/profile
- 將export PATH=$PATH:/opt/ethereum/go-ethereum/build/bin 新增到檔案最後
- 執行source /etc/profile 將設定載入到當前 shell 環境
- 看到類似下面的結果說明就配置成功了
# geth version Geth Version: 1.8.13-stable Git Commit: 225171a4bfcc16bd12a1906b1e0d43d0b18c353b Architecture: amd64 Protocol Versions: [63 62] Network Id: 1 Go Version: go1.9.6 Operating System: linux GOPATH= GOROOT=/usr/lib/golang
5. 啟動 geth 重要引數
直接在命令列執行geth 不就行了麼,當然可以,geth 會立馬啟動主網資料同步的準備工作。當還是建議關注一下下面的引數:
--datadir "xxxx" 指定資料目錄,用來存放區塊鏈資料,狀態資料,keystore資料等。如果不加這個引數這些資料在不同的系統會放到不同的位置。這個目錄佔用空間是比較大的,我一般會指定一個目錄,並保證這個目錄所在分割槽有足夠的磁碟空間。 --cache value 分配給內部快取的記憶體MB數量,預設為 128,最後設定大一點兒,起碼 1024吧,這個值設大一些可以提高資料同步效率。
--rpc啟用HTTP-RPC伺服器 --rpcaddr valueHTTP-RPC伺服器介面地址(預設值:“localhost”),預設只允許本地連線,設定為 0.0.0.0 可以接收任何地址發來的連線請求 --rpcport valueHTTP-RPC伺服器監聽埠(預設值:8545),可以改為不同的埠
--ws啟用WS-RPC伺服器,幾乎所有第三方節點都不啟動這個服務,而要監聽以太坊事件又必須啟動這個服務 --wsaddr valueWS-RPC伺服器監聽介面地址(預設值:“localhost”) --wsport valueWS-RPC伺服器監聽埠(預設值:8546)
最後啟動 geth 的命令看起來是這樣的:
geth --datadir --cache 4096 data --rpc --rpcport 6666 --rpcaddr 0.0.0.0--ws --wsaddr 0.0.0.0 --wsport 6667 --wsorigins "*"
**這裡把 rpcaddr 設為0.0.0.0
是有安全風險的。
的,最好指定特定 ip 地址或者通過反向代理或防火牆控制對 geth 節點的訪問**
6. 後臺啟動 geth
如果直接在 shell 終端直接啟動 geth,終端關掉程序也就關掉了,可以通過下面的命令使 geth 在後臺執行
nohup geth --datadir data --cache 4096 --rpc --rpcport 6666 --rpcaddr 0.0.0.0--ws --wsaddr 0.0.0.0 --wsport 6667 --wsorigins "*" & > nohup.out
但如果直接在 shell 終端執行,可以用 CTRL + C 關閉程序,如何關閉執行在後臺的 geth 程序呢,寫了個簡單的指令碼如下:
#!/bin/sh pid=`ps -ef|grep geth|grep -v grep|awk '{print $2}'` echo $pid kill -INT $pid
關於關閉 geth 程序,想了解更多可以檢視這裡 。
0x04 監控同步狀態
可以通過下面的命令 attach 到執行的節點,這裡的 data 為上面啟動 geth 時指定的 datadir 目錄。
# geth attach data/geth.ipc Welcome to the Geth JavaScript console! instance: Geth/SamewayProdNode1/v1.8.13-stable-225171a4/linux-amd64/go1.9.6 modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
然後呼叫 eth.syncing, 如下面所示,可以看到當前的同步狀態,我這邊節點已經執行一段時間了,可以看到當前區塊和最新區塊高度是比較接近的。剛開始這兩個數字差別是比較大的,在執行一天後這兩個數字就開始比較接近,給人的感覺好像是快要同步完了,但實際上要再跑一天左右才能真正同步完成。
> eth.syncing { currentBlock: 6143193, highestBlock: 6143296, knownStates: 91512910, pulledStates: 91498893, startingBlock: 0 }
在同步的過程中我們通過 eth.blockNumber 去檢視當前區塊號的話會顯示為 0
> eth.blockNumber 0
這個時候看 geth 的輸出的話,可以看到下面的日誌
INFO [08-14|04:32:20] Imported new block headers INFO [08-14|04:32:24] Imported new block receipts INFO [08-14|04:32:33] Imported new state entries
可以通過net.peerCount
來看自己的這個節點連了多少個其它節點進行資料同步。如果返回結果為0,就要自查一下了。
> net.peerCount 8
當看到 geth 日誌裡是下面的資訊
# tail nohup.out INFO [08-16|14:20:15.307] Imported new chain segmentblocks=1txs=117mgas=7.979elapsed=761.592ms mgasps=10.477number=6156276 hash=56b327…03c068 cache=905.73mB INFO [08-16|14:20:32.926] Imported new chain segmentblocks=1txs=42mgas=2.325elapsed=143.505ms mgasps=16.204number=6156277 hash=f577a7…1c6104 cache=905.59mB INFO [08-16|14:20:35.940] Imported new chain segmentblocks=1txs=121mgas=7.992elapsed=776.752ms mgasps=10.289number=6156278 hash=c92744…2d1448 cache=905.67mB
呼叫eth.blockNumber
得到的數字不再是 0 了,這個呼叫返回的是節點所同步到的最新區塊號
> eth.blockNumber 6156294
這個時候呼叫eth.syncing
會返回 false
> eth.syncing false
恭喜你,區塊資料已經同步完成了,該節點可以接收交易請求了。
0x05 常見問題
問題:如果非正常關閉 geth 程序,比如機器強制重啟的時候,如果這個時候以太坊正在執行資料庫寫操作,下次啟動 geth 程序時就很容易碰到下面的錯誤資訊:
Fatal: Error starting protocol stack: missing block number for head header hash
方案:很不幸,目前還沒有特別好的解決辦法
需要通過下面的命令移除區塊鏈資料並從新同步資料
# geth removedb --datadir data
問題:資料同步經常落後主網若干區塊,落後也不是很多,往往也就幾十個區塊,等段時間可以完成同步,可過段時間又落於主網了
方案:確保節點監聽埠 30303 已經在防火牆開啟,此埠在防火牆放行後,可大大提高主網資料同步的穩定性