教程

Nimbus 开发更新:开放以太坊 2.0 测试网

Ajian   |     |   2733 次阅读

Default featured image huge

我们做到了!😱🎉我们构建了一个 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 。当信标节点启动后,它将进行以下步骤:

  • 连接到我们的基础设施服务器
  • 查找与提供网络名称相匹配的元数据文件
  • 从该文件中获取到 bootnodes(bootstrap nodes,引导节点)的地址
  • 信标节点与 bootnodes 间建立连接,从而加入测试网

我们通过这样的形式运行信标节点是为了密切关注一些事情——我们扫描了 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 翻译及再出版。

 
0 人喜欢