我們做到了!😱🎉我們構建了一個 Nimbus-to-Nimbus 的測試網,並不是在一臺機器上進行模擬,而是包含一個遠程引導節點(bootstrap node),用戶甚至可以從 Status 之外訪問!
這是以太坊 2.0 開發的一個重要裡程碑,雖然網絡穩定性依然有一些問題,也可能存在一些 BUG,但是我們現在有了一個能夠在節點間同步信息的信標鏈,並且節點可以分布在遠程的設備上,這是非常重要的。
我們將其命名為 testnet0 ——這是未來一系列測試網絡中的第一個,每個測試網絡都將增加新的功能、可擴展性與穩定性。在最初運行的幾周內,testnet0 將經常重啟,以修正或改進我們從反饋和網絡監控中發現的一些問題與提案。這次迭代基於 eth2.0-spec 的 0.5.1 版本,設置 400 個驗證者節點來維護網絡正常運行。其中,50 個驗證節點預留給 「勇敢的探索者」(當你想加入我們的時候,你將得到一個隨機分配給你的驗證者節點)。
插播:如果你有任何問題,你可以在 Status 的 #status-nimbus 頻道向我們詢問,或是在 Chaos Unicorn Day 找到 Status,在 Gitter 上聯繫我們。
Nimbus 入門
我們將從 Nimbus 的父倉庫啟動所有指令。nim-beacon-chain 代碼庫是 Nimbus 的一個依賴庫,其中包含了 以太坊 2.0 的全部代碼,但是這些代碼將從 Nimbus 的父倉庫啟動。nim-beacon-chain 的代碼將作為一個子模塊自動拉取下來,並且包含一個自己的 Makefile 文件。
請注意,本文中所有指令僅適用於 Linux 或 Mac 作業系統。除非你配置一個像我們這樣的 nim-vagrant 虛擬機,否則你不能在 Windows 上運行這些指令。
加入 Nimbus 測試網
想加入我們的測試網麼?教程如下!
從頭開始
如果你是從頭開始,甚至沒有安裝 Nim 的話(你首先還需要安裝 RocksDB - 教程),以下是完整命令:
# 確保你在運行以下命令以前已經正確安裝 RocksDB!
git clone https://github.com/status-im/nimbus
cd nimbus
make update # 這可能需要幾分鐘
cd vendor/nim-beacon-chain # 以太坊 2.0 全部功能代碼都在這個 package 中
make testnet0
./build/testnet0_node # 該命令將啟動你剛剛構建的 testnet0-specific 節點
如果你之前運行過我們的測試網,你可能保存了一些與最新版本測試網不兼容的緩存。你可能還有一些舊版代碼,現在需要將他們與我們的 master 分支同步並且重新構建測試網節點。構建過程與 「從頭開始」 的步驟類似:
cd nimbus
make update # 更新依賴
cd vendor/nim-beacon-chain
make clean-testnet0 testnet0 # 清除緩存並重新構建可執行文件
./build/testnet0_node # 該命令將啟動你剛剛構建的 testnet0-specific 節點
恭喜你!你現在已經接入我們的測試網了——你的節點將開始同步我們的信標鏈的當前狀態。一旦你進入同步階段,你也將開始提出(「產生」)你自己的區塊並提供證明——很令人激動,不是麼!那麼現在你就是 以太坊 2.0 Nimus 的先驅者了!
那麼 make testnet0 是做什麼的呢?
在運行 make testnet0 命令時,將通過執行一個特殊的 Shell 腳本,構建一個預先配置好的自定義信標鏈節點,並制定好特定的測試網編號,該 Shell 腳本內容如下:
#!/bin/bash
[ -z "$1" ] && { echo "Usage: `basename $0` testnetX"; exit 1; }
set -eu
cd $(dirname "$0")
NETWORK_NAME="$1"
source "$NETWORK_NAME.env"
cd ..
NIM_FLAGS="-d:release --lineTrace:on -d:chronicles_log_level=DEBUG -d:SECONDS_PER_SLOT=$SECONDS_PER_SLOT -d:SHARD_COUNT=$SHARD_COUNT -d:SLOTS_PER_EPOCH=$SLOTS_PER_EPOCH -d:DEFAULT_NETWORK=$NETWORK_NAME --hints:off --verbosity:0"
BEACON_NODE_BIN="build/${NETWORK_NAME}_node"
CMD="nim c $NIM_FLAGS -o:$BEACON_NODE_BIN beacon_chain/beacon_node"
echo "$CMD"
$CMD
if [ ! -d ~/.cache/nimbus/BeaconNode/${NETWORK_NAME}/validators ]; then
$BEACON_NODE_BIN --network=$NETWORK_NAME importValidator
fi
echo
echo "A binary for connecting to $NETWORK_NAME was placed in '$BEACON_NODE_BIN'"
echo "To sync with the network, launch it with default parameters"
echo
第一條命令(即,「testnet0」)加載了 testnet0.env 的內容,其中包括我們將要啟動的信標鏈節點所需的環境變量。該 Shell 腳本之後設置了一些 Nim 標誌變量以優化編譯過程,其他變量將傳遞到節點內部以使其兼容測試網規則——特別是,每個周期(epoch)的 slot 數與分片數。我們需要特殊的規則,因為我們現在正運行一個與 eth-spec2.0 實現顯著不同的小型測試網。
如果這是你第一次加入測試網,信標節點將使用 importValidator 命令行連接到我們的測試網的引導節點上,並且下載一個隨機私鑰給你——我們已經準備好了一些預生成的私鑰。有了這個私鑰,系統將認為你已經存儲了 32 ETH,並認可你是一個驗證者。如果出於某種原因你的節點宕機了或者你需要重新加入測試網,將重用相同的驗證者私鑰。請注意,你不能在信標節點中使用自己生成的私鑰,因為你的私鑰並沒有在我們預先設置的 「已存儲 32 ETH」 的列表中,你的節點就不能成為驗證者節點了。.
最後,在 build 目錄中生成 beacon_node 可執行文件,該文件名稱將包含測試網標識 build/testnet0_node 。當信標節點啟動後,它將進行以下步驟:
我們通過這樣的形式運行信標節點是為了密切關注一些事情——我們掃描了 Grafana 與 Kibana 的情況,但是如果你更願意使用自己的測試網,請參考下面的內容。
當你加入測試網後會發生什麼首先,你的節點將依據下載下來的元數據文件連接到指定的引導節點。所有其他節點也通過該文件建立連接。然後,你的信標節點將獲取到目前為止生成的所有區塊。
一旦它擁有了所有這些數據,它便將這些數據存儲到狀態機中——將數據寫入它本地的資料庫,並構建區塊鏈。因此,它首先獲取原始數據,通過驗證後將原始數據轉換為區塊鏈。
一旦它存儲完所有內容之後,它將進行下一輪獲取數據的過程——因為上一部分區塊歷史已經下載完了。接下來將進行幾輪這樣的操作,直到節點同步為止。
此時,信標鏈將連接到本地驗證器 (當你加入測試網址時自動下載的驗證器),將它發送到負責對給定分片進行驗證和提議的委員會中,並定期檢查是否輪到它工作。
然後,信標節點將等待驗證器執行某些操作,同時不斷地從其他節點請求數據,並保持區塊鏈狀態處於最新狀態。當輪到你的信標節點成為驗證者時,節點將調用驗證器,生成一個證書並將其發送到網絡中,或是將提議一個區塊,亦或是同時做這兩件事。與此同時,信標節點也將調整和封裝區塊。.
當退出節點並稍後重啟時,你已經有的數據將重用:驗證者私鑰以及資料庫中的內容。若想清楚所有數據從頭開始,請運行 make clean-testnet0。
創建一個 Nimbus 測試網
為了啟動測試網,我們的信標節點目前有一個 createTestnet 命令。這可以幫它為其他參與節點生成初始快照、元數據文件、埠和網路信息等。
在我們開始之前,請注意,所有加入你自定義的測試網的信標節點 必須 使用相同的信標鏈常量進行編譯 - 即,如果一個節點編譯時設置為每個時期 8 個時隙,一個設置為每個時期 16 個時隙,那麼它們之間將不兼容。考慮到這一點,讓我們從 vender/nim-beacon-chain 中構建基本的信標節點可執行文件,並構建能夠生成驗證者私鑰的工具。
export NIMFLAGS="-d:release -d:SECONDS_PER_SLOT=30 -d:SHARD_COUNT=8 -d:SLOTS_PER_EPOCH=8" \
&& make beacon_node validator_keygen
以上命令將在當前文件夾(vendor/nim-beacon-chain)中生成信標節點(beacon_node)可執行文件以及驗證者私鑰生成工具(validator_keygen)。.
讓我們創建一個節點存儲數據的文件夾,然後在其中生成一些驗證者私鑰。我設置驗證者個數為 500。
mkdir -p $HOME/testnets/custom-network/data
./build/validator_keygen --totalValidators=500 --outputDir="$HOME/testnets/custom-network""
運行以上命令,我們將在特定文件夾($HOME/testnets/custom-network)中擁有 500 個私鑰文件以及 500 個對應公鑰文件。.
接下來,讓信標節點為我們生成一個測試網,其中包含所有可能其他人需要連接到我們的附加功能。
export NETWORK_DIR=$HOME/testnets/custom-network && ./build/beacon_node
--dataDir=$NETWORK_DIR/data \
createTestnet \
--networkId=666 \
--validatorsDir=$NETWORK_DIR \
--totalValidators=500 \
--outputGenesis=$NETWORK_DIR/genesis.json \
--outputNetwork=$NETWORK_DIR/custom-network.json \
--bootstrapAddress=$(curl -s ifconfig.me) \
--bootstrapPort=34000 \
--genesisOffset=6000
以上命令設置了自定義網絡的主文件夾(home folder),並將其傳遞給所需的參數,並讓它生成創世文件(genesis file)以及元數據文件供其他節點加入我們的測試網使用。bootstrap 地址部分是由 ifconfig.me 服務自動生成的 - 如果你知道你的公網 IP,或者 ifconfig.me 服務沒有檢測到它(可以在命令行輸入 curl -s ifconfig.me 測試),你可以手動輸入 bootstrap 地址。bootstrap 埠是可選的,但建議你在意外連接到默認埠上其他節點時儘量避免跨鏈噪聲。
genesisOffset 標誌變量將創世區塊的時間設置為未來某個時間——在本例中為 10 分鐘後。我們這樣做的目的是為了給每個想要加入的人足夠的時間在創世區塊生效前加入,因為如果它們在創世區塊生效後加入,並且它們剛好是加入前某時刻鏈期望的驗證者節點,它們將被視為離線,並受到懲罰,最終被剔除信標鏈。.
運行以上命令將產生兩個新文件。本例子中為 $HOME/testnets/custom-network/genesis.json和 $HOME/testnets/custom-network/custom-network.json。
現在,我們已經準備好連接,並與那些準備連接到我們的人共享以上文件。請注意,為了允許其他人與你建立連接,在 Nimbus 實現 UPnP之前,你需要在你的路由器和防火牆上手動打開你選擇的埠。如果你在類似 DigitalOcean 或 AWS 的平臺上運行你的 bootnode,那麼會遇到非常嚴重的防火牆控制問題。對於你自己的本地計算機,請參考路由手冊完成該修改。
genesis.json 是起始狀態,即你的測試網信標鏈的 「區塊0」。它包含了驗證者列表、初始分組以及為了讓連接到本測試網的所有客戶端能夠構建相同狀態的系統所需的所有信息。custom-network.json 是你的測試網的 「元數據」 文件 - 它已經標識了你的節點,即與此文件一同生成的節點(bootnode,引導節點),其中,bootstrapNodes 下包含了該 bootnode 的節點地址、其他所需數據以及創世根。你可以把這個文件放到某個地方的伺服器上,讓其他人可以獲取創世文件。之後,如果他們運行以下命令就可以連接到你的測試網了。
./build/beacon_node --network=$HOME/testnets/custom-network/custom-network.json --stateSnapshot=$HOME/testnets/custom-network/genesis.json --tcpPort=34001 --udpPort=340011
為了更好地展示當前成果,我們正在構建一個基本的可視化工具,它將在屏幕上以圖形的形式展示節點、時隙、區塊、時期和證明。希望這能幫助那些不熟悉信標鏈的人更好地理解,並幫助我們直觀地發現一些異常。
這裡的視頻地址為:https://imgur.com/a/yTnEDlX。
這是一個早期預覽,所以事情看起來會有很大不同。原始碼即將發布。
原文連結: https://our.status.im/the-nimbus-mvp-testnet-is-here/
作者: Bruno Škvorc@Status
翻譯&校對: stormpang & 阿劍
本文由作者授權 EthFans 翻譯及再出版。