Cover photo

Stake Wars:Episode III - Challenge 5

Stake Wars:Episode III - Challenge 5

前言

  • 这篇文章是为 Stake Wars: Episode III - Challenge 5 所写的节点启动文档,记录了我的 Shardnet 节点启动步骤

  • 节点启动环境:4-Core CPU / 8GB DDR4 / 500GB / Tencent Cloud / Ubuntu Server 20.04 LTS 64bit。节点费用大概 ¥360/月。

Challenge 1

账户创建

  • 首先需要创建一个 Shardnet 的账户作为节点的控制账户。从 这里 进入账户创建页面,创建步骤与 Mainnet 账户一致。

Near-CLI 命令行工具下载

  • 先更新下 apt

sudo apt update && sudo apt upgrade -y
  • 安装 Node.js 与 npm 环境,已安装可以跳过

curl -sL https://deb.nodesource.com/setup_18.x | sudo -E bash -  
sudo apt install build-essential nodejs
PATH="$PATH"
  • 然后可以检查下环境

node --version
npm -- version
  • 安装命令行工具 near-cli

sudo npm install -g near-cli
  • 检查下环境

near --version
post image

Shardnet 环境

  • Near 有四个网络,我们需要切换到正确的网络进行交互:

    • GuildNet

    • TestNet

    • MainNet

    • Shardnet

  • near-cli 可以通过命令行与节点进行交互,但是首先需要设置正确的交互网络环境变量 NEAR_ENV

export NEAR_ENV=shardnet
  • 上面的设置在每次进入新的终端后都需要重新设置网络,也可以直接把环境变量写进 bash 的配置中

echo 'export NEAR_ENV=shardnet' >> ~/.bashrc
echo 'export NEAR_ENV=shardnet' >> ~/.bash_profile
source $HOME/.bash_profile
  • 最后可以检查下当前的网络设置

echo $NEAR_ENV
post image

Challenge 2

节点环境

  • Chunk Only Producer 节点的硬件要求如下,目前 Shardnet 存储占用为30GB左右,如果只是参加 StakingWar 的话可以暂时使用稍小的存储

post image
  • 首先可以检查下 CPU 是否支持

lscpu | grep -P '(?=.*avx )(?=.*sse4.2 )(?=.*cx16 )(?=.*popcnt )' > /dev/null \
  && echo "Supported" \
  || echo "Not supported"
post image
  • 安装下依赖环境

sudo apt install -y git binutils-dev libcurl4-openssl-dev zlib1g-dev libdw-dev libiberty-dev cmake gcc g++ python docker.io protobuf-compiler libssl-dev pkg-config clang llvm cargo
  • 安装 python 和 pip 环境

sudo apt install python3-pip
  • 安装 rust 的编译依赖环境

sudo apt install clang build-essential make
  • 安装 rust 和 cargo, 出现如下图命令时,选择 1)Proceed with installation

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
post image
  • 执行这个命令让 cargo 环境生效

source $HOME/.cargo/env

节点客户端

  • 在自定义目录下 clone 客户端代码

git clone https://github.com/near/nearcore
cd nearcore
git fetch
  • 切换到指定 commit

  • 编译客户端 neard

cargo build -p neard --release --features shardnet
  • 编译完成后查看下版本信息

./target/release/neard --version
post image

节点配置文件

  • 节点的配置文件主要是这三个:

    • config.json : 里面可以对节点的运行,P2P,共识等功能进行配置

    • gensis.json:节点的创世状态配置,包括初始账户,合约,密钥等。这个配置文件也可以表示某个 snapshot 下的网络状态配置

    • node_key.json: 节点关联账户的公私钥信息

  • 我们首先生成默认的配置文件

./target/release/neard --home ~/.near init --chain-id shardnet --download-genesis
  • 然后需要修改 config.json 中的配置

    • boot_nodes:默认配置没有指定启动节点,这里需要指定一个

    • tracked_shards:默认配置没有指定验证的分片,这里可以指定为分片0

  • 也可以执行下面的命令下载配置好的 config.json 进行替换

rm ~/.near/config.json
wget -O ~/.near/config.json https://s3-us-west-1.amazonaws.com/build.nearprotocol.com/nearcore-deploy/shardnet/config.json
post image
post image

启动节点

  • 首先定位到 nearcore 目录,然后执行下面的命令, 看到下图输出说明已经启动成功,节点会先同步 全部head,然后再同步 block

./target/release/neard --home ~/.near run
post image
  • 节点启动正常之后,可以先 ctrl+c 停止节点,之后我们会用 service 来启动节点

添加验证者账户

  • 现在需要给节点授权验证者账户用来进行质押,奖励等工作,首先输入下面命令

  • 弹出的网页上进行账户的授权

  • 网页授权完成后会转到无法加载的空页面,直接关闭就行,然后控台内输入刚才进行授权的账户名,等待返回成功结果 successfully

post image
  • 然后需要添加一个验证者账户的配置文件, 是你的节点id,格式是 xxx.factory.shardnet.near

  • near generate-key <pool_id>

    • 拷贝生成的配置文件

    cp ~/.near-credentials/shardnet/YOUR_WALLET.json ~/.near/validator_key.json
    
    • 打开这个 validator_key.json 文件,将 private_key 改为 secret_key

    {
      "account_id": "xxx.factory.shardnet.near",
      "public_key": "ed25519:****",
      "secret_key": "ed25519:****"
    }
    

    使用 Service 启动节点

    • 打开 neard.service 文件进行 service 配置, 注意这里一般需要 sudo 权限

    sudo vi /etc/systemd/system/neard.service
    
    • 填入下面的配置,替换为系统的用户名,ExecStart 需要改为你的 neard 文件路径

    • [Unit] Description=NEARd Daemon Service [Service] Type=simple User=<USER> #Group=near WorkingDirectory=/home/<USER>/.near ExecStart=/home/<USER>/nearcore/target/release/neard run Restart=on-failure RestartSec=30 KillSignal=SIGINT TimeoutStopSec=45 KillMode=mixed [Install] WantedBy=multi-user.target

      • 这里可以新建一个 screen 窗口来单独运行 service

      screen -S neard_service
      
      • 在新弹出的控台窗口中启动 service

      sudo systemctl enable neard
      sudo systemctl start neard
      
      • 之后任何配置的修改都需要重载 service

      • ctrl + a + d 退出当前 screen

      • 想要重新回到 near_service screen, 执行命令

      screen -r neard_service
      

      challenge 3

      创建质押池

      • Near 是通过质押池与质押合约来保证进行质押交互的,质押池需要创建在账户上,同时账户也要配置到节点上。通过下面命令创建质押池

      near call factory.shardnet.near create_staking_pool '{"staking_pool_id": "<pool id>", "owner_id": "<accountId>", "stake_public_key": "<public key>", "reward_fee_fraction": {"numerator": 5, "denominator": 100}, "code_hash":"DD428g9eqLL8fWUxv8QSpVFzyHi1Qd16P8ephYCTmMSZ"}' --accountId="<accountId>" --amount=30 --gas=300000000000000
      
      • 这里的 填写质押池的名字,例如我的质押池这里就填写 jazzlost,最后质押池的完整名字是 jazzlost.factory.shardnet.near。 填写之前进行或授权的节点账户,我这里是 jazzlost.shardnet.near。 可以在之前的 validator_key.json 文件中找到。下面是我的节点创建命令, 创建成功可以看到返回 successfully created

        near call factory.shardnet.near create_staking_pool '{"staking_pool_id": "jazzlost", "owner_id": "jazzlost.shardnet.near", "stake_public_key": "ed25519:*****", "reward_fee_fraction": {"numerator": 5, "denominator": 100}, "code_hash":"DD428g9eqLL8fWUxv8QSpVFzyHi1Qd16P8ephYCTmMSZ"}' --accountId="jazzlost.shardnet.near" --amount=30 --gas=300000000000000
        
        post image
        • 节点的佣金可以通过下面的命令来调整

        near call <pool_name> update_reward_fee_fraction '{"reward_fee_fraction": {"numerator": 1, "denominator": 100}}' --accountId <account_id> --gas=300000000000000
        

        质押操作

        • 创建完质押池就可以进行质押了,只有质押量达到最低席位要求的节点才能被选中为出块节点, 填写完整质押池名称 xxx.factory.shardnet.near, 填写质押数量, 填写授权过给节点的账户

          near call <staking_pool_id> deposit_and_stake --amount <amount> --accountId <accountId> --gas=300000000000000
          
          • 如果需要解除质押,可以执行下面命令

          near call <staking_pool_id> unstake_all --accountId <accountId> --gas=300000000000000
          
          • 执行接触质押需要等待2-3个 epochs,然后就可以取出质押代币了

          near call <staking_pool_id> withdraw '{"amount": "<amount yoctoNEAR>"}' --accountId <accountId> --gas=300000000000000
          

          质押信息查询

          • 先 ping 一下节点更新节点信息, 填写完整质押池名字 xxx.factory.shardnet.near

          • near call <staking_pool_id> ping '{}' --accountId <accountId> --gas=300000000000000

            • 查询质押池总的余额

            near view <staking_pool_id> get_account_total_balance '{"account_id": "<accountId>"}'
            
            post image
            • 查询质押量

            near view <staking_pool_id> get_account_staked_balance '{"account_id": "<accountId>"}'
            
            post image

            Challenge 4

            Proposals 脚本

            • 节点需要在每个 epoch 内执行 ping 操作来申请下一轮出块的 proposal, 这里可以通过 crontab 脚本进行自动化

            • 首先创建一个 shell 脚本。 填写系统用户名, 填写质押池完整名称, 填写授权的账户

              #!/bin/sh
              # Ping call to renew Proposal added to crontab
              
              export NEAR_ENV=shardnet
              export LOGS=/home/<USER_ID>/logs
              export POOLID=<YOUR_POOL_ID>
              export ACCOUNTID=<YOUR_ACCOUNT_ID>
              
              echo "---" >> $LOGS/all.log
              date >> $LOGS/all.log
              near call $POOLID.factory.shardnet.near ping '{}' --accountId $ACCOUNTID.shardnet.near --gas=300000000000000 >> $LOGS/all.log
              near proposals | grep $POOLID >> $LOGS/all.log
              near validators current | grep $POOLID >> $LOGS/all.log
              near validators next | grep $POOLID >> $LOGS/all.log
              
              • 然后创建一下输出日志的保存目录, 同时添加读写权限

              mkdir $HOME/logs
              chmod +x $HOME/scripts/ping.sh
              
              • 然后创建一个 crontab

              crontab -e
              
              • 新打开的文件末尾添加触发任务, 保存退出

              0 */2 * * * sh /home/<USER_ID>/scripts/ping.sh
              
              • 然后启动 crond 任务

              service crond start
              
              • explorer 可以看到节点每两个小时自动执行 ping

              post image

              网络信息

              • 执行下面命令可以在控台打印P2P网络信息

              journalctl -n 100 -f -u neard | ccze -A
              
              post image
              • 日志中的 #1657223是当前的区块高度,后面是区块哈希,100 validators是当前网络验证者数量,30 peers 是节点的 peer数量,后面是一些网络信息

              • 执行下面命令可以查看本地节点版本信息

              curl -s http://127.0.0.1:3030/status | jq .version
              
              post image
              post image