本文將以Medalla 多客戶端測試網為例介紹在ETH 2.0 上質押的詳細步驟。主要基於以下幾個技術:

Ubuntu v20.04 (LTS) x64 服務器Go Ethereum 節點(代碼分支)Prysmatic Labs ETH 2.0 客戶端—— Prysm(代碼分支)官方多客戶端公共測試網 Medalla瀏覽器擴展程序錢包 MetaMaskPrometheus 指標Grafana 控制面板

這篇指南介紹瞭如何:

配置新運行的Ubuntu 服務器實例配置和運行ETH 1.0 節點為ETH 2.0 Phase 0(Medalla 測試網)編譯並配置Prysmatic Labs 信標鍊和驗證者客戶端軟件,並提供相應的運行服務安裝並配置Prometheus 指標,並創建Grafana 控制面板用於查看數據和接收警報(編者註:該部分內容未選入)

 

致謝和免責聲明

這篇指南參考了各種網上資料。沒有它們,就沒有這篇指南。特此表示感謝!

我本人並不精通這篇指南中列出的所有技術。經過親身嘗試之後,我發現這些技術非常有趣,因此想要分享給其他人。如有任何錯誤或疏漏之處,煩請見諒。歡迎大家積極反饋!

讀者須知

這篇指南並不適合初學者。讀者需要具備一些關於以太坊、以太幣、質押、Linux 和MetaMask 的知識。在開始閱讀之前,請先運行Ubuntu 服務器實例。先安裝好MetaMask 瀏覽器插件並配置好也在一定程度上有所幫助。然後,我會引導你完成接下來的步驟。

樹莓派用戶須知

我沒有在樹莓派上測試過這個指南。如果你想嘗試一下,直接將下文列出的軟件換成ARM 版本。但是我不保證一定能成功!

要求

Ubuntu 服務器實例。我使用的是v20.04 (LTS) amd64 服務器虛擬機。安裝並配置好的MetaMask 密碼學錢包瀏覽器擴展程序。運行Prysm 軟件的最低硬件要求:— 操作系統:64-bit Linux — 處理器:Intel Core i5–760 或AMD FX-8100 或以上— 內存:4GB RAM (推薦8GB) — 硬盤:不低於20GB 的SSD固態硬盤空間— 網絡:穩定的寬帶連接目前似乎還沒有任何硬性硬盤要求(無論是Medalla 測試網還是ETH 2.0 主網)。測試網可能只需要100GB 的SSD 固態硬盤就夠了。對於主網來說,接下來的幾年,使用1TB 的SSD 固態硬盤(信標鍊和分片鏈各佔一半)可能更好。總的來說,最好做好在必要時擴展硬盤容量的準備。

概述

這份指南很長而且細節繁多。所以我畫了一張究極簡化的示意圖來幫助你對接下來要做的事情建立基本概念。下圖中的黃色框即是本指南會覆蓋到的部分。

整個流程可以概念化表述為:

啟動一個Eth1 節點並同步Eth1 Göerli 測試網生成並激活驗證者密鑰對配置信標鏈節點和驗證者客戶端讓信標鏈節點在驗證者(簽名功能)的幫助下施展魔法(處理區塊、見證消息和罰沒事件)

第一步—— 保護你的系統

安全性很重要。由於本文不是一篇全面的安全性指南,我只介紹一些基本設置:防火牆和用戶賬號。本文預設你可以訪問你的Ubuntu 實例的控制台,並作為

root

用戶通過SSH 登陸控制台。

配置防火牆

Ubuntu 20.04 服務器可以使用默認的UFW 防火牆 來限制訪問該服務器的流量。我們需要允許來自SSH、Go Ethereum、Grafana 和Prysm 的入站流量。允許SSH —— 允許通過SSH(端口22/TCP )連接到該服務器

注:出於安全考慮,你可能需要考慮更換你的SSH 端口(默認端口是22 )。這裡面會有一些細微差別,你可以自己研究一下。

# ufw allow 22/tcp允許Go Ethereum —— 允許來自Go Ethereum 節點(端口30303/TPC 和30303/UDP)的請求。

注:如果你將你的Ubuntu 實例託管在本地,你需要對你的路由器和/或防火牆進行配置,允許來自這些端口的入站流量。

# ufw allow 30303/tcp# ufw allow 30303/udp允許Grafana —— 允許將入站請求發送至Grafana 網絡服務器(端口3000/TCP)

# ufw allow 3000/tcp允許Prysm —— 允許對等節點之間進行連接,以便在信標鏈節點上進行操作。 Prysmatic Labs 將端口13000/TCP 和12000/UDP 列為默認端口。

注:如果你將你的Ubuntu 實例託管在本地,你需要對你的路由器和/或防火牆進行配置,允許來自這些端口的入站流量。

# ufw allow 13000/tcp# ufw allow 12000/udp可選項:如果你想要直接訪問Prometheus 數據服務,你也可以開啟端口9090/TCP 。如果你只使用Grafana 查看數據,那就沒必要開啟這個端口。我自己就沒有開啟這個端口。

# ufw allow 9090/tcp現在開啟防火牆並檢查防火牆是否已經按照上述規則正確配置。

# ufw enable# ufw status numbered輸出應如下圖所示:

-UFW 防火牆設置-

創建一個新的用戶賬戶,並授予其管理權限

使用

root

賬戶登陸存在很大的風險。讓我們來重新創建一個擁有管理權限的用戶賬戶。

# adduser你需要輸入密碼以及其它信息。

將新的用戶加入sudo 群組,即可授予其管理權限。

# usermod -aG sudo當你以登陸時,你可以在命令行前鍵入sudo ,即可以超級用戶的權限來執行操作。

可選項:如果你使用SSH 密鑰連接你的實例,你需要將這個新賬戶與

root

賬戶的SSH 密鑰數據進行關聯。

# rsync --archive --chown= : ~/.ssh /home/第二步—— 升級你的系統

註銷你的

root

賬戶登錄狀態和SSH,使用你新創建的用戶名進入Ubuntu 系統,運行下列命令行來升級系統。

$ sudo apt update && sudo apt upgrade$ sudo apt dist-upgrade && sudo apt autoremove

第三步—— 安裝並運行Go Ethereum 節點

本步的用意是安裝並配置好一個將來的你的信標鏈節點需要連接的以太坊1.0 節點。如果你傾向於使用由第三方託管的節點(比如Infura),那就跳過這一步。

安裝Go Ethereum

Go Ethereum 建議使用PPA 的(Personal Package Archives,個人安裝包歸檔)。

$ sudo add-apt-repository -y ppa:ethereum/ethereum更新安裝包並安裝最新的穩定版本。

$ sudo apt-get update$ sudo apt-get install ethereum運行Go Ethereum 作為後台服務

為要運行的服務創建一個用戶。此種類型的用戶無法登錄服務器。

sudo useradd --no-create-home --shell /bin/false goeth為Eth1 區塊鏈創建數據文件夾。這是存儲Eth1 節點數據所必須的操作。使用 -p 來創建完整的路徑。

$ sudo mkdir -p /var/lib/goethereum設定文件夾權限。用戶 goeth 需要權限來修改該數據文件夾。

$ sudo chown -R goeth:goeth /var/lib/goethereum創建一個systemd 服務文件來存儲服務配置。我們將使用配置文件來命令你的systemd 運行 geth 進程。

$ sudo nano /etc/systemd/system/geth.service複製下列服務配置到該文件裡面。

[Unit]Description=Ethereum go clientAfter=network.targetWants=network.target[Service]User=goethGroup=goethType=simpleRestart=alwaysRestartSec=5ExecStart=geth --goerli --http --datadir /var/lib/goethereum[Install] WantedBy=default.target那個--goerli 標籤是用來指定Goerli 測試網的,而--http 標籤則是用來暴露供信標鏈節點連接的端口(http://localhost:8545)的。

可以對照下面這張屏幕截圖。你的文件也應該像它一樣。記得保存然後退出。

重啟systemd 以使更改生效。

$ sudo systemctl daemon-reload開啟這項服務,並確保它正常運行。

$ sudo systemctl start geth$ sudo systemctl status geth啟動服務後的輸出應該像下圖一樣。

如果一切正常,它應該會用綠色文本顯示“active (running)”。如果不正常,那就倒回去,重複這個步驟來解決這個問題。可以按Q 退出。

允許geth 服務在系統重啟時自動啟動。

$ sudo systemctl enable gethGo Ethereum 會自動開始同步。你可以運行journal 命令來查看進度。按Ctrl+C 可以退出。

$ sudo journalctl -f -u geth.service找到對等節點並完成Goerli 測試網同步可能要花好一段時間。如果出現了延宕的情況,你可以手動添加節點來幫助同步。到這個網站找到最新的節點列表,並像這樣這樣修改geth 服務:

$ sudo systemctl stop geth$ sudo nano /etc/systemd/system/geth.service修改“ExecStart” 那一行,加入 --bootnodes 標籤和一些最新的節點(用逗號分隔)。

ExecStart=geth --goerli --http --datadir /var/lib/goethereum --bootnodes "enode://46add44b9f13965f7b9875ac6b85f016f341012d84f975377573800a863526f4da19ae2c620ec73d11591fa9510e992ecc03ad0751f53cc02f7c7ed6d55c7291@94.237.54.114:30313,enode://119f66b04772e8d2e9d352b81a15aa49d565590bfc9a80fe732706919f8ccd00a471cf8433e398c55c4862aadb4aadf3a010201483b87e8358951698aa0b6f07@13.250.50.139:30303"保存文件並退出。重啟服務並觀察。

$ sudo systemctl daemon-reload$ sudo systemctl start geth$ sudo journalctl -f -u geth.service

結果應該像這樣:

注意:在你運行信標鏈節點之前,要先等這個Eth1 節點同步完成。可以在這裡找到最新的區塊。

接下來,我們要下載Prysm 軟件(用於運行信標鏈節點和驗證者)。從這裡開始你可以開啟一個新的命令行窗口,這樣你就能繼續觀察Eth1 節點的同步情況了。

第四步—— 安裝Bazel

Bazel 是一個開源構建工具。我們將使用它來編譯Prysm 軟件。

我們還需要使用Curl 來下載Prysm 代碼。

$ sudo apt install curl gnupg下載Bazel gpg distribution URI 並將其添加為包源。你在復制命令行時,別漏了“add” 後的(-):sudo apt-key add -sudo apt-key add -。

$ curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -$ echo "deb [arch=amd64] https://storage.googleapis.com/bazel-apt stable jdk1.8 " | sudo tee /etc/apt/sources.list.d/bazel.list

根據Bazel 的文檔,保留組建名“jdk1.8” 只是出於歷史遺留原因,不再代表支持或包含哪些JDK 版本。

安裝Bazel 。先安裝最新版本,然後安裝3.2.0 版本。 Prysm 目前需要3.2.0 版本。

$ sudo apt update && sudo apt install bazel$ sudo apt update && sudo apt install bazel-3.2.0第五步—— 安裝並構建Prysm

Prysm 由兩部分二進製文件組成:信標鍊和驗證者。我們將構建這兩部分。

克隆Prysm 的主代碼庫。

$ git clone https://github.com/prysmaticlabs/prysm$ cd prysm使用Bazel Build 來編譯信標鍊和驗證者二進製文件。

$ bazel build //beacon-chain:beacon-chain$ bazel build //validator:validator信標鏈文件需要一段時間才能構建完成。現在我們可以喝杯水小憩一下。或許可以讀一下我的其它文章。

構建驗證者文件會快一些,因為我們已經下載和/或構建好相關項了。

如果二者均構建完成,就可以執行後續步驟了。如果失敗了,可以去Prysm 的Discord 尋求幫助。

更新Prysm

注:務必在完成本指南中的所有步驟後再執行該步驟,否則請直接跳到第六步。

如果你因為Git 代碼庫變化而需要更新代碼,請執行以下步驟獲得最新文件,並創建你的二進製文件:

$ cd prysm$ git pull origin master$ bazel build //beacon-chain:beacon-chain$ bazel build //validator:validator別忘了停止信標鍊和驗證者服務,並將二進製文件複製到/usr/local /bin 目錄下,然後再開始啟動服務:

$ sudo systemctl stop beaconchain$ sudo systemctl stop validator$ sudo cp bazel-bin/beacon-chain/linux_amd64_stripped/beacon-chain /usr/local/bin$ sudo cp bazel-bin/validator/linux_amd64_stripped/validator /usr/local/bin $ sudo systemctl start beaconchain$ sudo systemctl status beaconchain <-- Check for any errors.$ sudo systemctl start validator$ sudo systemctl status validator <-- Check for any errors.

第六步—— 配置信標鏈節點

在這一步驟中,我們將讓信標鏈節點作為後台服務運行,如果系統重啟,信標鏈節點進程也會自動重啟。

建立賬戶和目錄

為這項服務創建一個用戶。此種類型的用戶無法登錄服務器。

$ sudo useradd --no-create-home --shell /bin/false beaconchain也要為信標鏈節點創建數據目錄(文件夾)。這是存儲信標鏈數據庫所必需的。使用 -p 來創建完整的路徑。

$ sudo mkdir -p /var/lib/prysm/beaconchain設置文件夾權限。這個 beaconchain 用戶需要權限來更改這個數據庫目錄。 -R 表示遞歸。

$ sudo chown -R beaconchain:beaconchain /var/lib/prysm/beaconchain接下來,把新編譯的 beacon-chain 二進製文件複製到 /usr/local/bin 目錄。我們會在這個文件夾裡運行它。

注意:每次你拉取/構建一個新版本的 beacon-chain 二進製文件的時候,都要做這一步驟。

$ sudo cp bazel-bin/beacon-chain/linux_amd64_stripped/beacon-chain /usr/local/bin

把所有權設給我們上面創建的用戶賬戶 beaconchain。

$ sudo chown -R beaconchain:beaconchain /usr/local/bin/beacon-chain

創建和配置服務

創建一個systemd 服務文件來存儲這個服務的配置。

$ sudo nano /etc/systemd/system/beaconchain.service複製下列內容到這個文件裡面。

[Unit]Description=BeaconchainWants=network-online.targetAfter=network-online.target[Service]Type=simpleUser=beaconchainGroup=beaconchainRestart=alwaysRestartSec=5Environment="ClientIP=$(curl -s v4.ident.me)"ExecStart= /bin/bash -c "/usr/local/bin/beacon-chain --p2p-host-ip=${ClientIP} --datadir=/var/lib/prysm/beaconchain --http-web3provider=http:/ /127.0.0.1:8545"[Install]WantedBy=multi-user.target我們是用一個環境參數(Environment variable)來獲得這個客戶端的IP 地址Environment="ClientIP=$(curl -s v4.ident.me) " 因為ExecStart 不允許內聯調用(call in-line)。使用 --p2p-host-ip=${ClientIP} 是為了應對故障(work-around)。

--http-web3provider

標籤用於定義Eth1 節點的端口。如果你使用的是本地的節點,這個值就是

http://127.0.0.1:8545

,如果你在使用第三方服務,那就要使用一個外部的端口地址。

看看你的文件是不是也像這個截圖一樣。應該是一樣的。然後你可以保存並退出。

重啟systemd 以使變更生效。

$ sudo systemctl daemon-reload注意:如果你在本地運行Eth1 節點(見第三步),你需要等待本地的節點同步區塊鏈同步完成,然後才能開始beaconchain 服務。使用這個命令行來檢查進度:sudo journalctl -f -u geth.service 。啟動服務並檢查它有沒有正常運行。

$ sudo systemctl start beaconchain$ sudo systemctl status beaconchain屏幕上的輸出看起來應該是這樣的。

如果你正確地完成了上述步驟,它應該會用綠色字體顯示“active (running)”。如果沒有這麼顯示,你要倒回去,重複這些步驟,來修復問題。按Q 可以退出。

讓信標鏈服務能隨系統重啟而自動重啟。

$ sudo systemctl enable beaconchain然後信標鏈節點會開始同步。可能需要幾個小時才能完成同步。你可以運行journal 命令來檢查進度。按Ctrl+C 來退出。

$ sudo journalctl -f -u beaconchain.service命令行窗口的輸出會給你來自Eth1 區塊鏈的(對應於Medalla 測試網的就是Goerli 測試網)、正在處理的保證金的狀態信息。

現在你的信標鏈節點已經作為一項服務在後台運行了。恭喜!雖然節點還在同步,我們可以開始下一步了。

第七步—— 完成Medalla 測試網的引導流程

在啟動驗證者客戶端之前,我們需要先生成我們的驗證者密鑰對。官方的Eth2 Launch Pad 會引導你完成這個流程(生成驗證者密鑰對、存入Goerli ETH),不過,在你開始存入保證金之前,你需要獲得一些Goerli ETH。

獲得Goerli ETH

遵照下列步驟:

點擊MetaMask 瀏覽器插件並登錄點擊頂部的下拉菜單,選擇Goerli 測試網點擊你的用戶名,它會自動複製下你的Goerli ETH 錢包地址;你可以通過這個經過認證的水龍頭來獲得Goerli 測試網ETH,或者到ethstaker Discord 群組的goerli-eth 頻道內使用機器人命令:!goerliEth獲取。如果你在計劃運行多個驗證者,你可以請求自己想要的額度(32ETH 乘以你想運行的驗證者數量)

等到Goerli ETH 出現在你的錢包裡,你就可以操作下一步了(記得要選擇Goerli 測試網!)

生成驗證者數據

訪問官方的Eth2 Launch Pad 網站,跟隨指引完成操作。如果一切順利,它就能生成一個驗證者密鑰文件(每一個驗證者都會有一個專門的文件,你想運行幾個驗證者,就要生成幾個)。

(編者註:Launch Pad 的使用流程簡介可見此處。)

根據引導流程、使用命令行工具所生成的JSON 文件會存儲在你運行“驗證者密鑰生成” 腳本的目錄下的

eth2.0-deposit-cli/validator_keys

文件夾裡。當我們要運行驗證者的時候(下一步),我們需要從這個位置引用我們的密鑰。如果你需要通過SFTP(SSH 文件傳輸協議)發送到你的服務器,那可以放心這麼做。本指南假定這個文件會存儲在這個目錄:

$HOME/eth2.0-deposit-cli/validator_keys

第八步—— 創建驗證者錢包

首先我們要使用Prysm 的驗證者二進製文件(我們之前就編譯好的)來創建一個錢包,就基於上一步我們所創建的密鑰。

$ cd prysm$ bazel run //validator:validator -- accounts-v2 import --keys-dir=$HOME/eth2.0-deposit-cli/validator_keys

你會被程序詢問指定一個錢包的存儲位置。你可以直接按回車,這樣它會存儲到默認位置。你還需要輸入一個新的錢包口令,請務必把這個口令保管在安全的地方。

接下來你要輸入你在Eth2 Launch Pad 網站上創建驗證者密鑰時候使用的口令。如果你正確輸入了,這個賬戶就會導入到這個新錢包中。

Enter a wallet directory (default: /home/ethstaker/.eth2validators/prysm-wallet-v2):New wallet password:Confirm password:[2020-08-04 06:16:17] INFO accounts-v2: Successfully created new wallet wallet-path=/home/ethstaker/.eth2validators/prysm-wallet-v2Enter the password for your imported accounts:Importing accounts, this may take a while...Importing accounts... 100% [======= ================================] [3m13s:0s]Successfully imported 40 accounts, view all of them by running accounts -v2 list

確認驗證者賬戶創建成功。

$ bazel run //validator:validator -- accounts-v2 list這就完成啦。現在這個驗證者錢包已經配置好了,我們將啟動驗證者作為一個後台服務。

第九步—— 配置驗證者客戶端

建立賬戶和存儲目錄

我們將讓驗證者能作為一項後台服務運行,並且在系統重啟時這個線程會自動重啟。

為要運行的服務創建一個用戶賬戶(系統賬戶)。此種類型的賬戶無法登錄服務器。

$ sudo useradd --no-create-home --shell /bin/false validator為驗證者客戶端創建數據存儲目錄,也就是跟驗證者相關的數據庫存放的地方。使用 -p 來創建完整的地址。

$ sudo mkdir -p /var/lib/prysm/validator設置目錄的權限。這個 validator 用戶需要修改這個數據目錄的權限。

$ sudo chown -R validator:validator /var/lib/prysm/validator現在,複製我們之前編譯好的 validator 二機製文件到這個 /usr/local/bin 目錄。

注意:每次你拉取/構建一個新版本的 validator 二進製文件,都要做這一步。

$ cd prysm$ sudo cp bazel-bin/validator/linux_amd64_stripped/validator /usr/local/bin

把用戶和群組權限設給

validator

用戶。

$ sudo chown -R validator:validator /usr/local/bin/validator

創建和配置服務

創建一個systemd 服務文件來存儲服務配置。

$ sudo nano /etc/systemd/system/validator.service

完全複製下列內容到這個文件中,就除了下面的兩個例外:

用你正在使用的用戶名替代那兩個

用你的 Prysm POAP 參與獎章值 替換掉

,這樣就能獲得特殊的NFT 獎品(POAP 獎章)!例如

--graffiti "abcdefg12345"

[Unit]Description=ValidatorWants=network-online.targetAfter=network-online.target[Service]Type=simpleUser=validatorGroup=validatorRestart=alwaysRestartSec=5ExecStart=/usr/local/bin/validator --datadir /var/lib/prysm /validator --wallet-dir /home/ /.eth2validators/prysm-wallet-v2 --wallet-password-file /home/ /.eth2validators/prysm-wallet-v2/password.txt --graffiti " "[Install]WantedBy=multi-user.target檢查你的文件,看看是不是跟這個截圖一樣。保存並退出。

password.txt

是必需的,因為

--wallet-password-file

需要指定一個口令文件。因此我們就創建一個,然後存儲在那個位置。

$ cd /home/ /.eth2validators/prysm-wallet-v2$ touch password.txt$ nano password.txt

把你的錢包password 輸入到這個文件中。就像下圖一樣,然後保存並退出。

重啟系統以使變更生效。

$ sudo systemctl daemon-reload啟動服務並確保正常運行。

$ sudo systemctl start validator$ sudo systemctl status validator你的屏幕輸出應該看起來像這樣。

如果你正確地完成了上述步驟,它應該會用綠色字體顯示“active (running)”。如果沒有這麼顯示,你要倒回去,重複這些步驟,來修復問題。按Q 可以退出。

讓信標鏈服務能隨系統重啟而自動重啟。

$ sudo systemctl enable validator你可以運行journal 命令來檢查進度。按Ctrl+C 來退出。

$ sudo journalctl -f -u validator.service等信標鏈真的啟動之後,可能還要等幾個小時來激活你的驗證者賬戶。驗證者進程的輸出會顯示進度。

Aug 02 03:03:25 ETH-STAKER-01 validator[5203]: time="2020-08-02 03:03:25" level=info msg="Waiting for beacon chain start log from the ETH 1.0 deposit contract" prefix=validator

你可以通過beaconcha.in 檢查自己的驗證者的狀態。只需搜索你的驗證者公鑰即可。網站上很快就會顯示出來。

就這麼簡單。我們已經開始運行信標鏈節點和驗證者客戶端了。恭喜恭喜,你很棒!

(編者註:下文的內容為指導用戶安裝Prometheus、節點瀏覽器、Gafuna,主要是幫助用戶管理自己的節點和驗證者,但這恐怕不是用戶最需要的。如果用戶了解足夠多的背景知識,使用區塊瀏覽器基本上也能滿足自己監控驗證者的需求,只是自動化程度差一些。因此我們不選入。感興趣的用戶可以自己到原文閱讀。)

(文內有許多超鏈接,可點擊左下”閱讀原文“ 從EthFans 網站上獲取)

原文鏈接:

https://medium.com/@SomerEsat/guide-to-staking-on-ethereum-2-0-ubuntu-medalla-prysm-4d2a86cc637b

作者: Somer Esat

翻譯&校對:

閔敏 &阿劍