Skip to content

jouleverse testnet node setup

hmisty edited this page Jan 15, 2024 · 8 revisions

注意:本教程最新版本已迁移至Jouleverse/jouleverse-node wiki,请移步查看:https://github.com/Jouleverse/jouleverse-node/wiki

Jouleverse Testnet 搭建指南

版本:

  • 1.4 evan.j 2023.9.15 删除节点启动更改etherbase的参数。
  • 1.3 evan.j 2023.9.14 增补说明。添加FAQ。
  • 1.2 evan.j 2023.9.12 修复keystone相关操作,避免权限问题。增补一些查看状态的操作和日志解释。
  • 1.1 evan.j 2023.9.11 增补了keystore教程链接,以及若干细节问题的解决方法
  • 1.0 evan.j 2023.9.6

PoWh激励标准

项目持续期间,每个稳定运行的测试网节点每月计5h算力,与正式记账节点相同。

简明步骤

  1. 准备一个用于签名出块的keystore账户
  2. 购买一台全新的云主机(新IP地址),最低配置(2核4G内存40G硬盘),系统选用带docker的Linux 2.1 云主机管理后台,防火墙开放端口40311/tcp以及40311/udp
  3. 云主机后台,登陆主机终端,下载测试节点软件包(含配置文件) 3.1 展开软件包,初始化区块链数据 3.2 启动测试网节点
  4. 在节点群里通知其他节点投票,批准自己节点入网
  5. 入网后,填写测试网节点信息采集表

账户准备

keystore是一种把私钥加密保存在文本文件中的技术。keystore文件是加密保存了私钥的文本文件(json格式)。可以用 https://vanity-eth.tk/ 这个工具生成。记住keystore对应的地址0xAAA...(下文称为“签块地址”),并把keystore文件下载到电脑上,重命名为testnet.keystore 。请妥善保管keystore文件并记住其解锁密码。稍后需要将该文件放到云主机上面去。

《教程:使用Vanity-ETH地址生成器创建keystore账户》:https://mp.weixin.qq.com/s/MUBWPodZ8V3_qqOcSTs8Aw

购买云主机

配置最低2核4G内存40G硬盘,和见证节点同等即可。系统镜像选用Ubuntu 20.04 LTS + Docker的版本。

要求:全新主机,新IP地址。

时长:3个月或以上。测试期预计可能需要3个月以上。

配置云主机防火墙

在云主机管理后台,找到防火墙配置,关闭所有非必要的端口,打开40311/tcp(即:端口号 40311 协议 tcp)和40311/udp(端口号 40311 协议 udp),分别用于节点数据传输和节点组网信令交换。

登陆云主机终端,下载测试节点软件包

找到云主机的管理后台,登陆终端。登陆后显示命令行

创建 id_rsa.testnet 文件,用于下载测试节点软件包时验证身份

粘贴 id_rsa.testnet 的内容,方法:(后面说到粘贴keystore文件内容到云主机上的方法是一样的)

先输入命令:

cat > ~/id_rsa.testnet

复制下面的内容:

【不要复制此处文档内容。请用 id_rsa.testnet.txt 文件内容,内容另行告知】

粘贴到终端,回车,按下 Ctrl + D 键,保存退出。

输入下述命令确认文件已经正确粘贴到了云主机上:

cat ~/id_rsa.testnet

终端应该显示出上面粘贴的内容。

下载测试节点软件包并展开

在终端输入下述命令,下载测试节点软件包:

scp -i ~/id_rsa.testnet testnet@rpc.jnsdao.com:/pub/upload/testnet-node-20230906.tar.gz .

看到 Enter passphrase for key './id_rsa.testnet': 请输入口令:【口令另行告知】

注1:第一次执行 scp 会询问 Are you sure you want to continue connecting (yes/no/[fingerprint])? 这时候要回答 yes 回车。

注2: 如果看到提示说 Permissions 0640 for .../id_rsa.testnet are too open. 这说明文件权限过于开放。先执行命令 chmod 0600 id_rsa.testnet ,然后再重新执行上面的 scp 命令即可。

正确执行就应该会看到显示软件包的下载进度,直至100%。如果没有看到,请检查是否输错了命令,或者输错了口令。


在终端输入下面的命令,验证一下你下载了正确的、未被篡改的软件包:

shasum testnet-node-20230906.tar.gz

你应该看到结果是:

64f177d1970831f707de0ae86c17d4350dca9748  testnet-node-20230906.tar.gz

警告:如果结果不是和上面一致,请立即报告问题并不要继续向下进行!


在终端执行命令,展开软件包:

tar xvfz testnet-node-20230906.tar.gz

拉取docker镜像

执行命令:

sudo docker pull ubuntu:20.04

初始化区块链数据

终端执行命令,创建数据目录:

mkdir ~/data

初始化数据目录:

sudo docker run -v ~/testnet-node-20230906:/j -v ~/data:/data -it ubuntu:20.04 /j/geth init -datadir /data/testnet /j/genesis-testnet.json

把keystore文件和密码文件复制粘贴到云主机上

仿照上面粘贴创建id_rsa.testnet文件的方法,把最初生成保存下来的testnet.keystore文件粘贴创建到云主机上:

cat > ~/data/testnet.keystore

粘贴keystore内容,按Ctrl+D,保存退出。

确认一下文件内容正确:

cat ~/data/testnet.keystore

内容应该类似这样:

{"address":"0x38885d668d422e07b1d3b205f021b2d4363051e9","crypto":{"kdf":"pbkdf2","kdfparams":{"c":262144,"dklen":32,"prf":"hmac-sha256","salt":"6a2017.......41d4e5aa516f706a"},"cipher":"aes-128-ctr","ciphertext":"12b662d.....e332","cipherparams":{"iv":"a29fb2....6d4f95769822"},"mac":"85e521....63f8d0b"},"id":"a30fe...-....-....-....-....bc57cbe2e","version":3}

把它拷贝到正确的位置:

sudo cp ~/data/testnet.keystore ~/data/testnet/keystore/testnet.keystore

注:直接 sudo cat > ~/data/testnet/keystore/testnet.keystore 会得到 Permission denied 错误。因此要拆分两步操作,先粘贴,再拷贝。

然后再创建一个密码文件:

cat > ~/data/password-testnet.txt

输入你的keystore文件的解锁密码,Ctrl+D保存退出。

确认一下文件内容正确:

cat ~/data/password-testnet.txt

以上步骤都正确完成后的目录结构如下:

~
|- id_rsa.testnet 下载软件包时用于验证身份的RSA私钥
|- testnet.keystore 签块账户keystore文件(备份)
|- testnet-node-20230906/ 测试节点软件包(含配置文件)
    |- geth 节点软件(链接)
    |- geth.vj1.11.2 节点软件(二进制文件)
    |- node-testnet.toml 节点配置文件(测试网)
    |- genesis-testnet.json 节点创世区块初始化文件(测试网)
|- data/ 数据目录
    |- password-testnet.txt 签块账户keystore解锁密码
    |- testnet/ 区块链数据(测试网)
        |- geth/... 数据库文件...
        |- keystore/ 签块账户keystore文件保存目录
            |- testnet.keystore 签块账户keystore文件(测试网)

启动测试网节点

运行命令,用docker启动节点:(注意把你的签块地址和记账收入接收地址替换到下方单引号里面)

sudo docker run -v ~/testnet-node-20230906:/j -v ~/data:/data --name "jouleverse-testnet" -p 40311:40311/tcp -p 40311:40311/udp -d ubuntu:20.04 /j/geth --config /j/node-testnet.toml --snapshot=false --unlock '这里替换成你的签块账户地址0xAAA...' --password /data/password-testnet.txt --mine 

注1:注意必须有 --snapshot=false 参数,关闭snapshot,否则会出现BAD BLOCK签坏块的错误。

注2:clique使用etherbase作为默认的签块地址,不可以在启动的时候加参数 --miner.etherbase '0xBBB...' 来更改地址,否则会启动失败,报告错误: Fatal: Failed to start mining: signer missing: unknown account

确认节点已成功启动:

sudo docker ps

观察节点运行日志,确信节点已正常同步区块链数据,只是不能签署区块(还需要现有节点网络投票批准你节点加入记账)。

观察节点运行日志的方法

在Linux终端运行命令:

sudo docker logs -n 100 -f jouleverse-testnet

按 Ctrl+C 退出观察。

注1:如果节点正确启动,应该能看到日志里显示,节点已经像见证节点一样正常下载区块数据。但是,不能出块,会出现错误信息 Block sealing failed err="unauthorized signer" ,这是正常情况,因为此时你的节点还没有被DAO投票批准成为合法的记账节点。

正确启动的节点,日志大致应该包含类似下面的内容:

INFO [09-11|14:42:11.833] Looking for peers                        peercount=2 tried=0 static=0

peercount=2 已经连接到两个节点

INFO [09-11|14:42:12.465] Imported new chain segment               blocks=1    txs=0 mgas=0.000 elapsed=4.701ms     mgasps=0.000 number=8170 hash=71b348..eff93c dirty=0.00B

能够成功且持续从现有出块节点同步区块数据

INFO [09-11|14:42:12.465] Commit new sealing work                  number=8171 sealhash=cc4d53..5bba57 uncles=0 txs=0 gas=0 fees=0 elapsed="202.81µs"
WARN [09-11|14:42:12.465] Block sealing failed                     err="unauthorized signer"

本节点尝试签块,但是因为还没有被投票通过,所以会显示错误“未授权的签块者”

在节点控制台输入命令 eth.blockNumber 应该能看到一个大于零而且持续在增加的数字,这是目前同步到的区块高度。数字持续增加,说明在持续同步最新区块。如果此处是0,或者不变,那么节点运行是有问题的。

注2:如果日志中出现 BAD BLOCK 这样的错误,并且无法正常同步最新的区块链数据,那么表示节点设置有问题(或者区块链出了问题),请截屏或者复制日志发到节点交流群里,和大家进行讨论,探明问题原因。

进入节点控制台的方法

在Linux终端运行命令:(请注意区分Linux终端命令和节点控制台命令,二者运行环境不同)

sudo docker exec -it jouleverse-testnet /j/geth attach /data/testnet/geth.ipc

在节点控制台(geth console),可以执行节点命令,比如:

> eth.blockNumber 查看当前区块高度
> eth.mining 查看是否正在记账(应该返回true)
> eth.coinbase 查看接收记账收入的地址(默认和签块账户是同一个地址)

注:节点控制台的命令前面的 > 是提示符,实际输入的时候请不要输入 > ,直接输入后面的命令即可!以下皆同。

更改接收记账收入的地址(可选)

准备地址:另行准备一个用于接收记账收入(手续费gas fee收入)的普通地址。挑选一个普通的地址0xBBB...(可以是MetaMask钱包地址,最好余额是零,以便于观察产生的记账收入),用来接收记账收入(手续费收入,如果你出快且打包了交易,交易支付的gas fee就会转入该地址)。下文称为“收入地址”。

节点启动后,默认会把记账收入汇聚到签块地址0xAAA...。

注:在控制台手工更改miner.etherbase,在节点重启后会被重置。也就是说,每次重启节点都会自动恢复成签块地址接收记账收入。所以,这里介绍的这个方法运用起来会比较繁琐(每次重启节点都需要重新执行)。但是,很遗憾,暂时没有更好的办法(比如使用启动参数自动配置)。

首先进入节点控制台,然后执行以下命令:

> miner.setEtherbase('此处替换为记账收入接收地址0xBBB...')

确认一下变更:

> eth.coinbase

检查该地址的结账收入(当前余额,单位 J):

> web3.fromWei(eth.getBalance(eth.coinbase))

MetaMask接入测试网的方法

MetaMask添加网络:

联系其他有测试J的节点获取测试J进行测试体验。

在节点群里通知其他节点投票,批准自己节点入网

告知自己的节点名称,IP地址,签块账户的地址,请其他节点在节点控制台投票!超过半数节点投票通过即可获批入网。

最好粘贴一下你的节点运行日志,以便于投票的其他节点判断一下你的节点是否正常运行。否则,投票通过后无法出块,可能会卡住区块链。

入网成功后,检查一下你是否正常参与出块了:

查看自己是否在签块者列表里

进入节点控制台,执行:

> clique.getSigners()

看一下列表中是否有你自己的签块地址。

查看最近轮次的出块情况

进入节点控制台,执行:

> clique.status()

大致会看到类似这样的结果:

{
  inturnPercent: 100,
  numBlocks: 64,
  sealerActivity: {
    0x38885d668d422e07b1d3b205f021b2d4363051e9: 16,
    0x3fc084c968e77f264803ef5af09e6d6f05228bea: 16,
    0xaf3ecb17dfe77cd145bcbed98ca7c4c4a7c28414: 16,
    0xb9e2af773e435dad23ef4ba77f006a56935e4040: 16
  }
}

首先看下是否有自己的签块地址和出块个数。其次看一下目前有几个节点,每个节点出了几个块。上面的数字可以看到最近64个区块,平均由4个节点在出,每个节点各出16个,非常均匀。

投票批准其他节点接入网络

节点控制台执行:

> clique.propose('替换为待批准节点的签块地址0x...', true)

撤销批准(反悔):

> clique.discard('替换为待批准节点的签块地址0x...')

投票踢掉网络中的签块节点

节点控制台执行:

> clique.propose('替换为待批准节点的签块地址0x...', false)

撤销踢人(反悔):

> clique.discard('替换为待批准节点的签块地址0x...')

入网后,填写测试网节点信息采集表

当你的节点被其他节点投票批准成功入网后,填写下表:

腾讯表单,链接:https://docs.qq.com/form/page/DTGtXWkljbEJHbnZJ

FAQ

如何重启节点?

重新运行节点的步骤:

  1. 停止旧节点: sudo docker stop jouleverse-testnet
  2. 先删除旧容器:sudo docker container rm jouleverse-testnet
  3. 启动新节点: ```sudo docker run -v ~/testnet-node-20230906:/j -v ~/data:/data --name "jouleverse-testnet" -p 40311:40311/tcp -p 40311:40311/udp -d ubuntu:20.04 /j/geth --config /j/node-testnet.toml --snapshot=false --unlock '这里替换成你的签块账户地址0xAAA...' --password /data/password-testnet.txt --mine

如何从BAD BLOCK错误中恢复?

当BAD BLOCK错误卡住节点网络无法出块时,可采用如下办法恢复:

  1. 查看节点运行日志,定位BAD BLOCK错误的区块高度

终端命令: sudo docker logs -n 100 -f jouleverse-testnet

如果最近100条日志看不到,那就看200、300…… 直到发现类似这样的错误信息:

########## BAD BLOCK #########
Chain config: Chain ID:  3888 (unknown)
Consensus: Clique (proof-of-authority)

...

Number: 17102
Hash: 0xbf09bc44473d95052435991dec39a1fb70fd49a0bd1cb3cff9044164987bd9c4
	 0: cumulative: 21000 gas: 21000 contract: 0x0000000000000000000000000000000000000000 status: 1 tx: 0x7c383c7964b74f97fad138bf144254020936d5b6e849b152c5185d826e4f015d logs: [] bloom: 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 state:


Error: invalid merkle root (remote: 309aed67b7fd05cfe675f21a83358cc382162f4fefa25900f2f93f113f62857d local: c8de6162a545d388470ff76b503c502516013e2acbe8a04be3e89b5e8ba7be9c)
##############################
  1. 定位签坏块的节点是谁

节点控制台执行:> clique.getSnapshot()

可以看到类似这样的结果:

{
  hash: "0x2a234cfd9dd8c3d6d10b87bcdded559270fb443c6b2d8e0e1091078fd26a24dc",
  number: 17101,
  recents: {
    17099: "0xb9e2af773e435dad23ef4ba77f006a56935e4040",
    17100: "0x38885d668d422e07b1d3b205f021b2d4363051e9",
    17101: "0x3fc084c968e77f264803ef5af09e6d6f05228bea"
  },
  signers: {
    0x38885d668d422e07b1d3b205f021b2d4363051e9: {},
    0x3fc084c968e77f264803ef5af09e6d6f05228bea: {},
    0xaed47a0abf3c7a190a5a864428a15870e8d30e49: {},
    0xaf3ecb17dfe77cd145bcbed98ca7c4c4a7c28414: {},
    0xb9e2af773e435dad23ef4ba77f006a56935e4040: {}
  },
  ...

这里,recents就是最近的区块高度的签块人。可以看到,最后一个区块就是17101。到17102就坏块了。

那么这个17102坏块是谁签的呢?看signers列表,它是按顺序轮流签块的,所以猜测会是0x3fc0....(17101的signer)的下一顺位即0xaed4...

0xaed4... 自己在控制台执行 clique.getSnapshot() 会看到recents比其他人多一个 17102,而且自己会检查出来这是个坏块。

  1. 坏块的签署者回滚一个区块

先重启节点,修复问题(比如关闭snapshot)。

然后在节点控制台执行命令:> debug.setHead('0x42cc') 回滚到17101区块。

观察。应该可以恢复轮流出块了。问题解决。