引言
Eth 2.0 迎来了从挖矿到 staking 的范式转变。Staking 是指锁定一定数量(目前是 32 个)的以太币来获得 “验证者” 的身份,进而能参与确定哪些区块能链接在链上。
当前有许多模拟 Eth 2.0 架构的测试网供大家实验,其中 staking 功能往往是借助 Goerli (Eth1.0)测试网实现的 。此前大多数 Eth 2.0 节点搭建的教程都是基于 Geth 客户端在 Goerli 上完成 staking。能提前感受 Eth 2.0 真的很不错。不过 Eth 2.0 的目标之一是让每一个人都可以参与到验证中来,因此本文聚焦于介绍如何使用 Nethermind 客户端在 Goerli 测试网上质押以太币,成为 Eth 2.0 的验证者。
一台基于 Linux 操作系统并装有 Curl 的设备足以复现本教程。不过在开始之前,我们必须提前声明一点:Eth2.0 的进展日新月异。因此,本文信息的时效性有限。不过我们会尽可能提供资源帮读者解决可能遇到的更新和变动,希望读者们在甄别过程中遵循密码学货币世界的一条基本法:无验证,不信任(Don’t Trust, Verify)。
安装 Nethermind 客户端
Nethermind 客户端主页:https://www.nethermind.io/client
Nethermind 客户端文档:https://nethermind.readthedocs.io/
准备安装 Nethermind 之时,请访问公开版本页,下载适用于您的操作系统的最新版本(不过本教程聚焦于 Linux 系统下的安装和运行)。从 zip 压缩文件中提取出 Nethermind:
unzip nethermind-linux-amd64–1.8.XX-XXXXXXX.zip -d nethermind
(第一个 xx 是版本号。比如我现在撰文的时候,最新的版本是 1.8.43。文件名中有一个 7 位数的校验和,就是 xx 后面的 xxxxxxx。对于 1.8.43 版本来说,校验和是 f28f4b7。文件名后面可能还附有文件的上传时间,这全看你是在哪儿下载的文件。真正最重要的事只有一个:下载 Nethermind 最新的稳定版本!使用最新的版本往往能让很多技术问题迎刃而解。)
确保 Nethermind 是最新版本
Eth2 的技术规范变化很快,甚至有可能推倒过去的一些东西。Nethermind 客户端也在快速推进,有时候几乎每天都有新版本。我建议你把检查和升级 Nethermind 作为日常工作的一部分,再不济也要变成每周的例行工作。
如果你想检查自己运行的 Nethermind 是不是最新版本,在 Nethermind 的目录里面打开 CLI(./Nethermind.Cli),输入
web3.clientVersion
然后版本号就会出来了。然后再比对 Nethermind 的公开版本页,如果不是最新版本,就请动手更新。
更新版本跟安装实质上是一样的。下载新的安装包,解压 zip 文件到你选定的存储位置,覆盖掉旧的 Nethermind 文件。我这里就完全复制了从下载文件夹解压 Nethermind 的命令行,只不过加了一个 -o,表示要覆盖文件夹里的内容:
unzip -o nethermind-linux-amd64–1.8.XX-XXXXXXX.zip-d nethermind
升级之后你必须重启软件,这样你的节点才会允许最新版本的 Nethermind。
同步 Goerli 测试网
在 Nethermind 目录中,使用 Nethermind 同步 Goerli 测试网:
./Nethermind.Runner –config goerli –JsonRpc.Enabled true
(另一种方法是,在运行 Nethermind.Launcher (启动)时会提供额外的选择,询问你要同步哪条链。本版指南使用了 Nethermind.Runner,额外的好处是可以通过制作一个 systemd 脚本或者类似方法来自动化这个过程)。
如果你想使用 Nethermind 来生成在 Goerli 测试网上使用的钱包,你还得再加一段:–Init.EnableUnsecuredDevWallet true。
把 JsonRpc.Enabled 设为 True(启动)是为了便于使用 Goerli 水龙头(免费获得 Goerli 测试网上的以太币)和发送验证者保证金。如果你的计算机上没有别的软件在使用 8545 端口传输消息,那 Nethermind 就会直接使用这个端口。不要忘了在 MetaMask 上把网络设成 localhost:8545(我自己不觉得有必要做这一步,不过如果你已经在本地同步好了,那就没有必要使用 Infura 来查询 Goerli 测试网了 —— 你不手动设,MetaMask 就会自动使用 Infura)。
当 Nethermind 开始显示 “Processed” 的时候,就说明你的节点已经完成同步了。这里有张截图,已同步好 Goerli 测试网的 Nethermind 节点就是这样的:
Lighthouse
Lighthouse 是由 Sigma Prime 团队开发的 Eth2 客户端,是用 Rust 语言写的。所以你得跳转到 rustup.rs 网页找个简易的安装指南装一下 Rust。稍微剧透一下,安装 Rust 可能很花时间、占用很多计算机资源(译者注:此言不虚,在 Windows 安装完整的 Rust 非常麻烦。)
装好 Rust、确保能运行之后,下一步就是下载和构建 Lighthouse 代码。build(构建)操作会花一些时间,我上次尝试的时候,运行时间超过半个小时。
git clone https://github.com/sigp/lighthouse.git
cd lighthouse
cargo build — release
Lighthouse 默认加入 Witti 测试网,所以你需要下载 Witti 代码库。找个文件夹,输入下面这个命令行就可以了:
git clone https://github.com/goerli/witti
(译者注:现在 Witti 测试网已经关停了。现正在运行的多客户端测试网叫 Altona。可在此处查看详情:https://github.com/goerli/altona )
第一步是让信标链节点(Beacon Node)连上 Goerli 测试网并同步区块链。下面整个命令行是假设 Witti 被克隆到了 home 目录,不然的话你要替换成你用的地址:
lighthouse bn –http –testnet-dir ~/witti/lighthouse –eth1-endpoint http://127.0.0.1:8545
注意:要是你光输入 lighthouse 没用的话(比如程序出错,显示 bash: lighthouse: command not found ),你可能需要换成 ~/lighthouse/target/release/lighthouse ,而且可能每次用到 lightho
如果你的 Nethermind 还在 terminal 窗口里输出,你应该能看到好多个 RPC 请求出现:
我们会使用 Lighthouse 来创建用于 Staking 的钱包。创建一个口令文件(包含你所设定的口令),放到一个你选定的地方。我这里用的文件命名为 password.txt,假定把它放在 home 目录下,你可以根据需要传入不同的输入。这里的钱包我也直接命名为 witti,这只是因为本教程所用的 Witti Lighthouse 用户必读文件中建议这么做,但实际上你可以随自己高兴来命名。类似地,生成的助记词文件我们也直接放到 home 目录里面。这样做其实不安全。只不过,这样可以让我写文章的时候容易一点。我希望你在阅读的时候能更小心一些,弄清楚自己需要做什么。
lighthouse account_manager wallet create \
–name “witti” \
–passphrase-file ~/password.txt \
–testnet-dir ~/witti/lighthouse \
–mnemonic-output-path ~/menmonic.txt
这样做就能生成一个钱包了。你会看到一套由 12 个单词组成的助记词出现在屏幕上,还附有如何保管助记词的建议。我就不截图放出来了,因为,正如一些建议所说:永远不要跟人分享你的助记词(译者注:因为助记词即意味着对一个账户的完全控制权)。
下一步我们要创建一个验证者账户。
lighthouse account_manager validator create \
–at-most 1 \
–testnet-dir ~/witti/lighthouse \
–wallet-name “witti” \
–wallet-passphrase ~/password.txt
这时会产生一串 16 进制的数字。
现在我们需要为我们的验证者存入保证金。基本上有两种办法,要么用 MetaMask,要么用 Nethermind CLI。
使用 MetaMask:你先要将 MetaMask 连接到你的节点,就是在右上角选择所用网络的下拉选项里选择 localhose:8545(如果你使用的是另一个端口,你就需要选择 “Custon RPC(自定义 PRC)”,然后输入你的端口号)。你也可以在选项里直接选择 Goerli 测试网,不过,你明明自己电脑上已经有一个 Goerli 节点了,为什么还要去用 Infura 的节点呢?
你需要存入至少 32 GoETH(也就是 Goerli 测试网上的 ETH,没有实际价值),才能成为验证者。如果你有 Twitter 或者 Facebook 账号,你可以使用 https://faucet.goerli.mudit.blog 水龙头。输入你的 MetaMask 地址,跟随指引完成操作即可。要等待一些时间才能收到 GoETH,但应该不会等待超过 1 分钟。
(译者注:访问 https://prylabs.net/participate 这个网站并连接自己的 Metamask 钱包可一次性领到 32 个测试网 ETH。)
在网页浏览器内访问 Lighthouse 的文档。点击 “upload” 按钮。Lighthouse 需要的文件应该放在 ~/.lighthouse/validators/0x… 处,也就是 home 目录里一个叫做 .lighthouse 的隐藏文件夹里(注意那个开头的 .)。你要找到一个叫做 eth1-deposit-data.rlp 的文件。上传这个文件会生成一笔 MetaMask 交易,发送 32 GoETH 到 Goerli 测试网上的保证金合约。
(译者注:使用此方法最好再检验一下 MetaMask 交易的目标地址,确保是 Altona 测试网的保证金合约地址。因为现在 Witti 网络已经关闭了)。
使用命令行:首先,需要使用额外的一个参数来启动 Goerli 节点:
–Init.EnableUnsecuredDevWallet true
在 Nethermind 目录里面,启动 CLI(./Nethermind.Cli),输入 personal.listAccounts 会给你一个测试账户列表。要是没出现这样的列表,那这个教程剩下的部分可能也没法正常运行,那我就要推荐你使用上面的 MetaMask 方法了。如果有用,你可以输入下列命令行、创建一个新账户,password 就是这个账户的口令,换成一个你喜欢的就行:
personal.newAccount(“password”)
记下运行这个命令所产生的新地址,使用 https://faucet.goerli.mudit.blog 水龙头往这个地址里打钱(需要你用 Twitter 或者 Facebook 账号给他们做宣传)。你需要至少 32 GoETH(Goerli 测试网 ETH)才能成为验证者。你还需要从 Nethermind CLI 中解锁你的账号:
personal.unlockAccount({your address}, “{your password}”)
在撰写本文之时,Lighthouse 仍需要一个 IPC 端点来发起存款,虽然我听说已经有人提了 PR 要换成 http 端点了。下面这段就是关于如何发起存款交易的一个有根据的猜测:
lighthouse account_manager validator deposit \
–eth1-http http:127.0.0.1:8545 \
–from-address {put your address here without the 0x} \
–testnet-dir ~/witti/lighthouse \
–validator all
信标链节点应该一直在同步。你可以在信标链同步期间启动验证者客户端,但在完成同步之前,验证者客户端什么都不会干。我会建议你先等着。完成信标链同步之后,软件的输出会像下图所示:
完成同步之后,信标链节点也不能关闭,要继续运行。在新的命令行窗口里,输入下列命令以启动验证者客户端:
lighthouse vc –auto-register –testnet-dir ~/witti/lighthouse
只有第一次运行验证者的时候才需要这些参数,而 –auto-register 如果不是在首次运行时使用甚至还会产生问题,所以,在你需要重启验证者客户端的时候,只要用下面这个简单的命令就好了:
lighthouse vc
整个教程就是这样啦。如果你能完整做到这一步,真是恭喜你!你现在运行着信标链节点和验证者客户端,稳妥地站在以太坊 2.0 的前沿世界里了。
一些提醒
在本文撰写之时,Witti 测试网上还没有验证者新人的排队机制,所以当你启动验证者之后,马上就能看到软件的输出如下图:
每隔一段时间,你就会看到不是上图这样的另一种输出,要么是产生了一条区块见证消息(attestation),要么是发布了一个新区块。我还没看到我的客户端发布新区块的情况,但下面这种就是产生见证消息时候的场景:
见证消息的内容是对某个区块的投票支持。发布新区块则是实际上为区块链提议一个新区块,当然这种机会要少得多。
离线的验证者会被惩罚,在本文写作之时(2020 年 6 月),这个惩罚力度被设成很小的值,大概要超过 1 年才会损失掉 32 个 ETH。因此,估计大家也会时不时离线(为了升级、更新等等)。
遵循教程的操作,可能也会有搞不定的情况。你的基本设置可能与我的并不相同,另外,这个领域是全新的,软件也很稚嫩。所以请求帮助的时候不用觉得不好意思!客户端团队基本上都有 discord 频道,虽然你们可能生活在地球的两端,但他们其实很乐意帮助你,也很希望能得到反馈。不要害羞啦!
使用其它客户端
Lighthouse 并不是唯一的以太坊 2.0 客户端软件。你可以使用 Nethermind 来同步 Goerli 测试网,再搭配任意的以太坊 2.0 客户端软件。本教程只是拿 Lighthouse 来举例。我们会在下文列举其它的一些客户端。
此外,据我所知,你可以同时运行多个以太坊 2.0 客户端。可能你得自己调整一些默认设置,比如客户端所用的网络端口;另外就是注意自己的电脑性能够不够。不过,不管怎么做,你只需要一个 Goerli 节点。
Teku 客户端
Teku 客户端正式文档:https://docs.teku.pegasys.tech/
Witti Teku 文档:https://github.com/goerli/witti/tree/master/teku
Teku 是一款用 Java 写成的软件,由 PegaSys 开发。跟随这些指令就能安装 Teku 客户端软件(还有 Java SDK)。Teku 的文档假定用户使用 Besu 客户端来同步 Goerli 测试网,(但我们这里告诉你可以用 Nethermind),所以相关的段落是可以跳过的。
我自己没有尝试过使用 Teku 配合 Netherminde,但我觉得应该是没问题的。你需要用 Nethermind 来生成钱包(根据我的理解是这样),所以你要确保使用 -Init.EnableUnsecuredDevWallet 参数来运行 Nethermind。
Lodestar 客户端
Lodestar 客户端的安装指南见:https://github.com/ChainSafe/lodestar
我也没有尝试过使用 Lodestar 配合 Netherminde,但我也觉得问题不大。尝试的时候多看看 Witti 的文档应该会有所帮助。
Prysm 客户端
Prysm 测试网指南:https://prylabs.net/participate
Witti(Schlesi)Prysm 文档:https://github.com/goerli/witti/tree/master/prysm
(译者注:现在 Schlesi 测试网也关停了。Prysm 客户端团队发起的最新单客户端测试网名为 Onyx,不过文档也都是公开的)。
Prysm 运行自己的 Goerli 节点集群,并使 Prysm 客户端默认与集群相连。在写这篇文章的时候,一些技术问题使得 Prysm 无法连接到 Nethermind 部署在本地的 Goerli 节点。它是最著名的以太坊 2.0 客户端,所以我觉得我有必要批评几句。