admin管理员组

文章数量:1567280

繁忙的公共节点

在之前的文章中,我们尝试用python写了一个链游Farmers World的挂机脚本:
《链游Farmers World【农民世界】爆火,发布一个免费开源的辅助挂机脚本》
https://encoderlee.blog.csdn/article/details/121512342

这个脚本在单机,账号比较少的情况下运作良好,但是在几十个号多开的时候,就频繁出现网络错误,这是因为链游脚本的每一次操作,实际上都要和WAX PRC节点交互,发送HTTP请求,而这些公共的RPC节点,并非是无限制使用的。试想,如果你有1000个号,每秒发送几百次HTTP请求,对服务器来说压力很大,公共节点不是只服务你一个人的,所以公共节点一般都针对单个IP有访问频率限制,超出限制后就会timeout或者给你一个HTTP错误。

另外一个问题是目前大部分的公共节点都分布在欧洲和美洲,从大陆直接访问这些节点延迟一般在300ms以上,而亚洲节点只有韩国、日本、新加坡,从大陆直连的话也是延时比较高,不过其中日本节点
【EOSeoul】https://wax.eoseoul.io
如果走代理进行访问的话,延时值是比较理想的。

WAX公共节点列表

https://wax.eosio.online/endpoints

自建节点

最终要从根本上解决延时和访问频率限制的问题,最好还是自建节点,自建节点可以参考这篇官方文档:
https://developer.wax.io/en/dapp-development/wax-blockchain-setup/
WAX官方提供了一个docker镜像,可以仅凭几条命令就启动一个节点:
https://github/worldwide-asset-exchange/wax-blockchain/tree/develop/samples/mainnet

不过这个nodeos.sh脚本也有一些小问题:

  1. 没有及时更新为最新的docker镜像版本
  2. config.ini中的一些P2P节点已经失效,或者无法从大陆访问
  3. 不支持从快照启动

于是我将官方这份启动脚本clone到我的github上并进行了修改,方便大家使用:

✱✱✱✱✱✱✱✱✱✱✱✱✱✱✱✱✱✱✱✱✱✱✱✱✱✱✱✱✱✱
安装脚本:https://github/encoderlee/wax_node
✱✱✱✱✱✱✱✱✱✱✱✱✱✱✱✱✱✱✱✱✱✱✱✱✱✱✱✱✱✱

安装脚本优化

我们的安装脚本和官方脚本稍有不同,主要做了以下参数调整,以便更适用于我们的需求:

  1. nodeos.sh 支持从快照启动

    nodeos --snapshot $NODEOS_HOME/$1

  2. 允许任意ip访问rpc端点(公网部署建议前面加Nginx)

    -p 0.0.0.0:8888:8888
    http-validate-host = false

  3. 增加rpc http server处理请求的并发能力

    http-threads = 32

  4. 从默认的全节点模式切换为轻节点模式,只验证块头,提高验证效率,降低CPU负载,加快同步速度

    validation-mode = light

  5. 解决rpc提交交易出错的问题

    abi-serializer-max-time-ms = 150000

  6. 优化节点CPU利用率

    chain-threads = 4

  7. 精选30个从大陆访问延迟较低的p2p节点

    p2p-peer-address = xxx

推荐配置

官方文档中说明,运行节点的机器配置至少是双核CPU和8G内存,但这是几年前的文档了,那时候WAX网络刚刚运行,状态数据很少,而现在随着用户越来越多,状态数据已经大到76GB了(2022年3月),并且还在不断增大中。

但实际经过我们测试,WAX节点对机器配置的要求大概如下:

1.CPU
EOS的VM引擎基本上只能单线程运行,所以节点在验证数据的时候,只能用到单核性能,多核几乎无用,所以机器CPU最少只需要2核即可,但是!正因为它依赖CPU单核性能,所以CPU主频单核性能一定要高,可以参考CPU单核性能天梯图,简单来说的话就是建议CPU主频要在3.5Ghz以上。这一点非常重要,有的云主机CPU主频本来就不高,而且还会限制CPU峰值使用率,即长时间保持100%的CPU占用的话,会对你进行降频处理,而且虚拟化后的CPU单核性能往往落后于物理主机,CPU单核性能不足的话,会导致节点验证交易的速度慢于出块速度,而永远追不上超级节点的最新区块。其实有条件的话建议最好还是自己配一台物理主机放在家中,反正大内存的云主机也很贵。

2.硬盘
硬盘一定要SSD,并且最好是NVME SSD,虽然我们在SATA SSD上搭建成功了,但是现在NVME SSD也很便宜了,不用省这个钱,可用空间大于150G即可

3.内存
内存要求至少64G,其实有条件的话建议上到96G,因为现在节点状态数据大小为76G,上到96G的话,可以启用heap模式,将状态数据全部放在内存中,这将大大提高节点性能,尤其是rpc并发读性能。

安装步骤

接下来我们使用一台ubuntu 20.04的机器进行安装部署:

1.首先安装docker,建议按照docker官方文档安装最新版本docker:
https://docs.docker/engine/install/ubuntu/

sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

如果从我的github仓库下载,也可以直接执行

sudo ./install_docker.sh

2.下载快照
从这里下载WAX主网最新快照:
https://snapshots.waxsweden/
为什么要从快照启动?因为如果直接启动的话,节点会从0开始同步,等同步到最新区块,可能需要几十天甚至一个月,从最新快照启动可以大大节省我们的时间。

wget https://snapshots-cdn.eossweden/wax/2.0/latest -O latest.tar.gz
tar -zxvf latest.tar.gz

如果从我的github仓库下载,也可以直接执行

./download_snapshot.sh

注意,下载快照的时候最好使用香港代理,从大陆直连的话会非常缓慢

3.从快照启动
快照解压后会得到一个bin文件,假如是 snapshot-167371985.bin
接下来使用我的github仓库修改过的nodeos.sh来从快照启动节点

sudo ./nodeos.sh snapshot-167371985.bin

日志显示:

Starting initialization from snapshot, this may take a significant amount of time

说明程序已经开始解析bin文件生成数据了,只需耐心等待即可,这个过程时间长短取决于磁盘性能,可能耗时几十分钟到十几个小时不等,所以说为什么磁盘一定要SSD,如果不是SSD,后面节点同步,以及节点PRC访问,还会遇到很多瓶颈。
可以用 du -sh 命令检查 data 目录大小,大约增长到70多G左右,节点日志开始滚动,就说明正常了。
此时可以用

sudo pkill nodeos

命令停止节点,然后不带参数运行nodeos.sh

sudo ./nodeos.sh

即可正常使用节点了

4.检查同步状态
即便是从快照启动,我们的节点仍然会落后最新区块一点,此时节点会自动从其它公共节点同步数据,逐渐追上最新区块,在此期间,该节点RPC API 已经可以使用,等待完全同步后,节点RPC API才能达到正常性能,在此之间RPC API 虽然能用,但是性能较差。

当节点出现此类日志的时候,说明已经追上最新区块

nodeos producer_plugin.cpp:379 on_incoming_block ] Received block aec0fa0f25cb5d9c… #170206010

使用命令检查当前节点状态

sudo ./cleos.sh --url http://localhost:8888 get info

对比公共节点状态

sudo ./cleos.sh --url https://api.wax.alohaeos get info

可以得到两者最新区块的差距

比如上图中,我的节点已经追上公共节点最新区块

注意!注意!!!

一定要等节点最新区块追上公共节点以后,rpc才能达到最优性能,否则rpc请求频繁出错、超时!

同步过慢

为什么我的节点一直跟不上最新区块?
1.机器内存最好大于64G,否则节点频繁使用虚拟内存,验证交易速度巨慢

2.机器CPU主频尽量高,EOS节点验证交易不能并发,几乎是单线程运行,所以尽量选择CPU主频高的计算型云主机。

搭建服务

最后,节点其实不是敲个命令跑起来就一劳永逸了,在使用过程中还会有很多问题,比如同步速度过慢,已经同步的节点突然又丢失同步状态,RPC请求超时无响应,RPC端口开放到公网上的安全问题,访问频率的限制,防止滥用,防DDOS等等,都需要花时间维护。

所以,如果有搭建需求的客户,可以在博客左上方找到我的联系方式,我们提供技术咨询和代搭建服务,推荐机器配置或云主机,调优参数,解决疑难杂症,只收取辛苦费。

本文标签: 自己的节点网络WAX链游