dApp Docs/验证者与节点运维
Development reference. Not independently verified for production.

MSG Chain 验证者与节点运维完整指南

数据来源:MSG Chain 代码库核实

主网状态: No-Go — 当前 MSGChain 主网裁决为 No-Go,以下内容反映代码实际状态,不代表生产可用。


目录

  1. MSG Chain 节点架构
  2. 硬件要求
  3. 全节点搭建
  4. 验证者节点
  5. 委托操作
  6. DAR 共识参与
  7. Dilithium-5 密钥管理
  8. Gas 费与收益
  9. 节点安全
  10. 监控与告警
  11. 备份与恢复
  12. 升级流程
  13. 附录

一、MSG Chain 节点架构

1.1 架构总览

MSG Chain 是一条基于 Cosmos SDK + Tendermint 的 Layer 1 公链,专注于 AI Agent 经济体。其节点架构分为四层:

┌──────────────────────────────────────────────────────────┐
│                   应用层 (Application)                      │
│  CosmWasm 虚拟机 | 自定义模块 (x/) | Agent API            │
│  candidate_node_staking_v2 | validator_qualification_v2   │
│  dar_rating_v1 | gas_fee_distribution_v2                  │
│  emission_schedule_v2 | block_time_schedule_v1            │
├──────────────────────────────────────────────────────────┤
│                   共识层 (Consensus)                        │
│  Tendermint Core (改进版)                                  │
│  Round-Robin 出块调度 + DAR (Dilithium-AR) 扩展          │
│  5 秒出块 | 最大 100 个活跃验证者                         │
├──────────────────────────────────────────────────────────┤
│                   网络层 (P2P)                              │
│  libp2p | 端口 26656 (P2P) | 26657 (RPC)                  │
│  Peer Exchange | 种子节点 | 哨兵节点架构                   │
├──────────────────────────────────────────────────────────┤
│                   存储层 (Storage)                          │
│  BadgerDB (替代 IAVL) | 高性能键值存储                     │
│  状态存储 | 区块存储 | WAL (预写日志)                     │
└──────────────────────────────────────────────────────────┘

1.2 MSG Chain 与 Cosmos Hub 架构对比

特性 MSG Chain Cosmos Hub (Gaia)
共识引擎 Tendermint (改进版) Tendermint
出块时间 5 秒 ~7 秒
共识算法 Round-Robin + DAR Tendermint BFT
签名方案 Dilithium-5 (后量子) Ed25519 / Secp256k1
状态存储 BadgerDB IAVL+LevelDB
虚拟机 CosmWasm (WASM) CosmWasm
密钥类型 dilithium5 secp256k1
代币精度 18 位 18 位
最大验证者 100 180
AI 原生支持 ✅ 内置 Agent 模块 ❌

1.3 验证者相关模块详解

MSG Chain 有以下模块直接涉及验证者操作:

candidate_node_staking_v2

节点质押模块,处理验证者注册、委托、解委托、奖励分发。

validator_qualification_v2

验证者资格和评分管理。

dar_rating_v1

DAR (Dilithium-AR) 评分系统,影响出块权分配。

gas_fee_distribution_v2

Gas 费用分配模块。

emission_schedule_v2

代币发行计划管理。

slashing (规划阶段)

惩罚条件管理。

1.4 存储架构 (BadgerDB)

MSG Chain 使用 BadgerDB 替代 Cosmos SDK 默认的 IAVL 树。BadgerDB 是基于 LSM 树的嵌入式键值存储,提供更好的写入性能。

MSG Chain 数据目录 (~/.msgd/data/)
├── blockstore.db/          # 区块存储 (BadgerDB)
│   ├── MANIFEST
│   ├── 000001.sst
│   └── ...
├── cs.wal/                 # 共识 WAL (预写日志)
│   └── wal
├── evidence.db/            # 证据存储 (BadgerDB)
├── state.db/               # 应用状态 (BadgerDB)
└── tx_index.db/            # 交易索引 (BadgerDB)

1.5 共识流程: Round-Robin + DAR

MSG Chain 的共识流程与其他 Tendermint 链不同:

  1. Round-Robin 调度: 验证者按顺序轮流获得出块权
  2. DAR 权重调整: DAR 评分影响轮次中的出块概率,高评分验证者获得更多出块机会
  3. Dilithium-AR 聚合签名: 每个区块使用 Dilithium-5 聚合签名进行最终确认
  4. 5 秒出块: 固定出块间隔,不依赖交易量
区块生产流程:
  Round-Robin 选择下一验证者
       │
       ▼
  DAR 评分加权调整
       │
       ▼
  验证者生产区块 (包含 DAR 聚合签名)
       │
       ▼
  其他验证者验证 + 预提交
       │
       ▼
  Dilithium-AR 聚合签名提交
       │
       ▼
  区块最终确认 (5 秒周期)

二、硬件要求

2.1 最低硬件要求

组件 全节点 验证者节点
CPU 2 核 (x86_64/ARM64) 4 核 (x86_64)
内存 4 GB 8 GB
存储 200 GB SSD 500 GB NVMe SSD
带宽 10 Mbps 50 Mbps
操作系统 Ubuntu 22.04+ / macOS 14+ Ubuntu 22.04 LTS

2.2 推荐硬件要求

组件 全节点 验证者节点 哨兵节点
CPU 4 核 8 核 8 核
内存 8 GB 16 GB 16 GB
存储 500 GB NVMe SSD 1 TB NVMe SSD 1 TB NVMe SSD
带宽 100 Mbps 500 Mbps 1 Gbps
操作系统 Ubuntu 22.04 LTS Ubuntu 22.04 LTS Ubuntu 22.04 LTS

2.3 存储增长预估

时间 数据量 (估计)
第 1 个月 ~20 GB
第 6 个月 ~120 GB
第 12 个月 ~250 GB
第 24 个月 ~500 GB

BadgerDB 相比 IAVL 有更好的压缩比,但仍需规划足够的存储空间。建议使用支持在线扩容的云存储。

2.4 与 Cosmos Hub 硬件对比

指标 MSG Chain (推荐) Cosmos Hub (推荐)
CPU 8 核 8 核
内存 16 GB 32 GB
存储 1 TB NVMe 2 TB NVMe
存储引擎 BadgerDB (LSM-tree) IAVL+LevelDB
说明 BadgerDB 写入性能更好,内存需求略低 IAVL 树需要更多内存做缓存

三、全节点搭建

3.1 系统依赖安装

Ubuntu/Debian

# 更新系统
sudo apt-get update && sudo apt-get upgrade -y

# 安装基础工具
sudo apt-get install -y \
  build-essential \
  git \
  jq \
  curl \
  wget \
  tar \
  unzip \
  lz4 \
  gzip \
  snapd \
  ufw \
  htop \
  iotop \
  nvme-cli

# 安装 Go 1.24.6+
wget https://go.dev/dl/go1.24.6.linux-amd64.tar.gz
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go1.24.6.linux-amd64.tar.gz

# 配置 Go 环境变量
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
echo 'export GOPATH=$HOME/go' >> ~/.bashrc
echo 'export PATH=$PATH:$GOPATH/bin' >> ~/.bashrc
source ~/.bashrc

# 验证 Go 安装
go version

# 安装 Rust (用于 CosmWasm 合约编译)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
source $HOME/.cargo/env
rustup target add wasm32-unknown-unknown

CentOS/RHEL

# 更新系统
sudo yum update -y

# 安装基础工具
sudo yum install -y \
  gcc gcc-c++ make git jq curl wget tar unzip lz4 firewalld

3.2 克隆 MSG Chain 源码并编译

# 克隆仓库
git clone https://github.com/msgchain/msgchain
cd msgchain

# 安装依赖
make deps

# 编译 Linux 二进制
make build-linux

# 验证编译
ls -la build/msgd
./build/msgd version
# 预期: msg-chain-1

# 编译所有平台 (可选)
make build-all

# 运行测试
make test

# 运行后量子密码学测试
make test-quantum

3.3 初始化节点配置

# 初始化节点 (生成配置文件)
./build/msgd init --chain-id=msg-chain-1 --moniker "my-msg-node"

# 参数说明:
#   --chain-id: 链 ID,固定为 msg-chain-1
#   --moniker: 节点名称,可自定义

# 初始化后的目录结构
ls -la ~/.msgd/
# config/
#   ├── app.toml              — 应用配置
#   ├── config.toml           — Tendermint 配置
#   ├── client.toml           — 客户端配置
#   ├── genesis.json          — 创世文件
#   ├── node_key.json         — 节点 P2P 密钥
#   └── priv_validator_key.json — 验证者私钥
# data/
#   ├── blockstore.db/
#   ├── cs.wal/
#   ├── evidence.db/
#   └── state.db/

3.4 配置 app.toml

nano ~/.msgd/config/app.toml

完整 app.toml 配置:

# 最小 Gas 价格
minimum-gas-prices = "1000000000attoMSG"

# 修剪策略
pruning = "default"
pruning-keep-recent = "362880"
pruning-keep-every = "10000"
pruning-interval = "10"

[api]
enable = true
address = "tcp://0.0.0.0:1317"
enabled-unsafe-cors = true

[grpc]
enable = true
address = "0.0.0.0:9090"

[grpc-web]
enable = true
address = "0.0.0.0:9091"

[state-sync]
snapshot-interval = 1000
snapshot-keep-recent = 2

[dilithium]
signature-algorithm = "dilithium5"
[dilithium.dar]
enable = true
rating-weight = 70
aggregation-threshold = 66

[store]
backend = "badgerdb"
data-dir = "data"
value-log-file-size = 1073741824
memtable-size = 67108864
sync-writes = false

3.5 配置 config.toml

nano ~/.msgd/config/config.toml

关键配置:

moniker = "my-msg-node"
fast_sync = true
db_backend = "badgerdb"

[p2p]
laddr = "tcp://0.0.0.0:26656"
seeds = "seed1.msgchain.org:26656,seed2.msgchain.org:26656,seed3.msgchain.org:26656"
persistent_peers = ""
max_num_inbound_peers = 40
max_num_outbound_peers = 10

[consensus]
timeout_propose = "3s"
timeout_commit = "5s"
round_robin_proposer = true
dar_enabled = true
create_empty_blocks = true

[rpc]
laddr = "tcp://0.0.0.0:26657"
cors_allowed_origins = ["*"]
max_open_connections = 1000

[instrumentation]
prometheus = true
prometheus_listen_addr = ":26660"

3.6 配置 client.toml

# ~/.msgd/config/client.toml
chain-id = "msg-chain-1"
keyring-backend = "os"
output = "text"
node = "tcp://localhost:26657"
broadcast-mode = "sync"

3.7 下载创世文件

# 下载主网创世文件
curl -o ~/.msgd/config/genesis.json \
  https://raw.githubusercontent.com/msgchain/mainnet/main/genesis.json

# 验证创世文件
./build/msgd validate-genesis

# 查看创世链 ID
cat ~/.msgd/config/genesis.json | jq '.chain_id'
# 预期: "msg-chain-1"

3.8 种子节点和持久节点配置

# 方式 1: 种子节点自动发现
# config.toml: seeds = "seed1.msgchain.org:26656,seed2.msgchain.org:26656"

# 方式 2: 持久节点 (手动指定)
# config.toml: persistent_peers = "node_id@host:26656,node_id2@host2:26656"

# 获取节点 ID
./build/msgd tendermint show-node-id

# 下载 addrbook
curl -o ~/.msgd/config/addrbook.json \
  https://raw.githubusercontent.com/msgchain/mainnet/main/addrbook.json

3.9 配置 Cosmovisor

# 安装 Cosmovisor
go install cosmossdk.io/tools/cosmovisor/cmd/cosmovisor@latest

# 创建目录结构
mkdir -p ~/.msgd/cosmovisor/genesis/bin
mkdir -p ~/.msgd/cosmovisor/upgrades
cp ./build/msgd ~/.msgd/cosmovisor/genesis/bin/
ln -s ~/.msgd/cosmovisor/genesis ~/.msgd/cosmovisor/current

# 配置环境变量
echo 'export DAEMON_NAME=msgd' >> ~/.bashrc
echo 'export DAEMON_HOME=$HOME/.msgd' >> ~/.bashrc
echo 'export DAEMON_RESTART_AFTER_UPGRADE=true' >> ~/.bashrc
echo 'export DAEMON_ALLOW_DOWNLOAD_BINARIES=false' >> ~/.bashrc
source ~/.bashrc

3.10 配置 systemd 服务

# /etc/systemd/system/msgd.service
[Unit]
Description=MSG Chain Node
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=msgd
Group=msgd
ExecStart=/home/msgd/go/bin/cosmovisor run start --x-crisis-skip-assert-invariants
Restart=always
RestartSec=5
LimitNOFILE=65536
LimitNPROC=4096

Environment="DAEMON_NAME=msgd"
Environment="DAEMON_HOME=/home/msgd/.msgd"
Environment="DAEMON_RESTART_AFTER_UPGRADE=true"
Environment="DAEMON_ALLOW_DOWNLOAD_BINARIES=false"

ProtectSystem=full
NoNewPrivileges=true
PrivateTmp=true

StandardOutput=journal
StandardError=journal
SyslogIdentifier=msgd

[Install]
WantedBy=multi-user.target

3.11 启动节点

# 启动 systemd 服务
sudo systemctl enable msgd
sudo systemctl start msgd

# 查看状态
sudo systemctl status msgd

# 查看日志
journalctl -u msgd -f

3.12 验证节点同步状态

# 查询节点状态
curl -s http://localhost:26657/status | jq '.result.sync_info'

# 检查同步状态
curl -s http://localhost:26657/status | jq \
  '{height: .result.sync_info.latest_block_height, catching_up: .result.sync_info.catching_up}'

# 查询网络信息
curl -s http://localhost:26657/net_info | jq '{n_peers: .result.n_peers}'

# 健康检查
curl -s http://localhost:26657/health

3.13 状态同步 (快速追赶)

# 获取可信高度和哈希
TRUST_HEIGHT=$(curl -s https://rpc.msgchain.org/status | \
  jq -r '.result.sync_info.latest_block_height')
TRUST_HASH=$(curl -s https://rpc.msgchain.org/status | \
  jq -r '.result.sync_info.latest_block_hash')

# 更新状态同步配置
sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1true| ; \
  s|^(rpc_servers[[:space:]]+=[[:space:]]+).*$|\1\"https://rpc.msgchain.org:26657,https://rpc2.msgchain.org:26657\"| ; \
  s|^(trust_height[[:space:]]+=[[:space:]]+).*$|\1$TRUST_HEIGHT| ; \
  s|^(trust_hash[[:space:]]+=[[:space:]]+).*$|\1\"$TRUST_HASH\"|" \
  ~/.msgd/config/config.toml

# 重置数据并重启
./build/msgd tendermint unsafe-reset-all --keep-addr-book
sudo systemctl restart msgd

3.14 一键搭建脚本

#!/bin/bash
# setup_full_node.sh — MSG Chain 全节点一键搭建脚本
set -e

MONIKER=${1:-"my-msg-node"}
MSG_CHAIN_HOME="$HOME/.msgd"
CHAIN_ID="msg-chain-1"

echo "=== MSG Chain 全节点搭建 ==="

# 1. 编译
echo "[1/5] 编译节点..."
if [ ! -d "$HOME/msgchain" ]; then
  git clone https://github.com/msgchain/msgchain "$HOME/msgchain"
fi
cd "$HOME/msgchain"
make deps 2>/dev/null
make build-linux
sudo cp build/msgd /usr/local/bin/

# 2. 初始化
echo "[2/5] 初始化节点配置..."
rm -rf "$MSG_CHAIN_HOME"
msgd init --chain-id="$CHAIN_ID" --moniker="$MONIKER"

# 3. 下载创世文件
echo "[3/5] 下载创世文件..."
curl -o "$MSG_CHAIN_HOME/config/genesis.json" \
  https://raw.githubusercontent.com/msgchain/mainnet/main/genesis.json

# 4. 配置
echo "[4/5] 配置节点..."
sed -i 's/minimum-gas-prices = ""/minimum-gas-prices = "1000000000attoMSG"/' \
  "$MSG_CHAIN_HOME/config/app.toml"
sed -i 's/seeds = ""/seeds = "seed1.msgchain.org:26656,seed2.msgchain.org:26656"/' \
  "$MSG_CHAIN_HOME/config/config.toml"
sed -i 's/prometheus = false/prometheus = true/' \
  "$MSG_CHAIN_HOME/config/config.toml"

# 5. 启动
echo "[5/5] 启动节点..."
sudo tee /etc/systemd/system/msgd.service > /dev/null << SYSTEMD
[Unit]
Description=MSG Chain Node
After=network-online.target
[Service]
Type=simple
User=$USER
ExecStart=$(which msgd) start
Restart=always
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
SYSTEMD
sudo systemctl daemon-reload && sudo systemctl enable msgd && sudo systemctl start msgd
echo "搭建完成! 查看日志: journalctl -u msgd -f"

四、验证者节点

4.1 验证者概述

验证者是 MSG Chain 网络的支柱,负责生产区块、验证交易、参与 DAR 共识。验证者通过质押 MSG 代币获得出块权,并获得区块奖励和 Gas 费分成。

验证者操作流程:

生成 Dilithium-5 密钥 → 创建验证者账户 → 质押 MSG → 创建验证者 → 参与共识

4.2 创建验证者账户

使用 Dilithium-5 后量子密钥类型:

# 创建新密钥
./build/msgd keys add validator \
  --algo dilithium5 \
  --keyring-backend os

# 参数说明:
#   --algo dilithium5:   使用 Dilithium-5 后量子签名算法
#   --keyring-backend os: 使用操作系统密钥环

# 从助记词恢复
./build/msgd keys add validator \
  --recover \
  --algo dilithium5 \
  --keyring-backend os

# 查看所有密钥
./build/msgd keys list --keyring-backend os

# 查看账户地址
VALIDATOR_ADDR=$(./build/msgd keys show validator -a --keyring-backend os)
echo "Validator address: $VALIDATOR_ADDR"

# 查看公钥 (确认 Dilithium-5 类型)
./build/msgd keys show validator -p --keyring-backend os | jq '.@type'
# 预期: "/cosmos.crypto.dilithium.PubKey"

# 导出密钥 (备份)
./build/msgd keys export validator --keyring-backend os

4.3 获取共识公钥

# 获取 Tendermint 共识公钥
./build/msgd tendermint show-validator
# 输出 Dilithium-5 公钥格式

4.4 创建验证者

# 创建验证者
./build/msgd tx staking create-validator \
  --amount 500000000000000000umsg \
  --pubkey $(./build/msgd tendermint show-validator) \
  --moniker "My Validator" \
  --identity "ABC123DEF456" \
  --website "https://myvalidator.example.com" \
  --details "专业的 MSG Chain 验证者节点" \
  --security-contact "security@myvalidator.example.com" \
  --commission-rate "0.10" \
  --commission-max-rate "0.20" \
  --commission-max-change-rate "0.01" \
  --min-self-delegation "1" \
  --from validator \
  --gas auto \
  --gas-prices 1000000000attoMSG \
  --gas-adjustment 1.3 \
  --chain-id msg-chain-1 \
  --keyring-backend os \
  --node tcp://localhost:26657 \
  -y

# 参数说明:
#   --amount:               自委托数量 (500 MSG)
#   --pubkey:               共识公钥
#   --moniker:              验证者名称
#   --commission-rate:      初始佣金 (10%)
#   --commission-max-rate:  最大佣金 (20%)
#   --commission-max-change-rate: 每日佣金变更上限 (1%)

# 查询验证者列表
./build/msgd query staking validators --node tcp://localhost:26657

# 查询指定验证者
VALOPER=$(./build/msgd keys show validator --bech val -a --keyring-backend os)
./build/msgd query staking validator "$VALOPER" --node tcp://localhost:26657 -o json

4.5 创建验证者脚本

#!/bin/bash
# create_validator.sh
set -e
KEY_NAME=${1:-"validator"}
MONIKER=${2:-"My Validator"}
AMOUNT=${3:-"500000000000000000umsg"}
CHAIN_ID=${4:-"msg-chain-1"}
NODE=${5:-"tcp://localhost:26657"}
COMMISSION_RATE="0.10"
GAS_PRICES="1000000000attoMSG"

ACCOUNT_ADDR=$(msgd keys show "$KEY_NAME" -a --keyring-backend os)
VALOPER_ADDR=$(msgd keys show "$KEY_NAME" --bech val -a --keyring-backend os)
echo "Account: $ACCOUNT_ADDR"
echo "Valoper: $VALOPER_ADDR"

# 检查余额
BALANCE=$(msgd query bank balances "$ACCOUNT_ADDR" --node "$NODE" -o json | \
  jq -r '.balances[] | select(.denom=="umsg") | .amount')
echo "Balance: $BALANCE umsg"

# 检查是否已是验证者
EXISTING=$(msgd query staking validator "$VALOPER_ADDR" --node "$NODE" -o json 2>/dev/null)
if [ -n "$EXISTING" ] && [ "$EXISTING" != "null" ]; then
  echo "已是验证者,跳过"
  exit 0
fi

msgd tx staking create-validator \
  --amount "$AMOUNT" \
  --pubkey $(msgd tendermint show-validator) \
  --moniker "$MONIKER" \
  --commission-rate "$COMMISSION_RATE" \
  --commission-max-rate "0.20" \
  --commission-max-change-rate "0.01" \
  --min-self-delegation "1" \
  --from "$KEY_NAME" --gas auto --gas-prices "$GAS_PRICES" \
  --gas-adjustment 1.3 --chain-id "$CHAIN_ID" \
  --keyring-backend os --node "$NODE" -y
echo "验证者创建完成: $VALOPER_ADDR"

4.6 编辑验证者信息

./build/msgd tx staking edit-validator \
  --moniker "New Validator Name" \
  --identity "NEW_KEYBASE_ID" \
  --website "https://new-website.example.com" \
  --details "更新后的验证者描述" \
  --commission-rate "0.15" \
  --from validator \
  --gas auto --gas-prices 1000000000attoMSG \
  --chain-id msg-chain-1 \
  --keyring-backend os -y

4.7 查看验证者信息

# 查询单个验证者
VALOPER=$(./build/msgd keys show validator --bech val -a --keyring-backend os)
./build/msgd query staking validator "$VALOPER" --node tcp://localhost:26657 -o json

# REST API
curl -s http://localhost:1317/cosmos/staking/v1beta1/validators/$VALOPER | jq

# Tendermint RPC 验证者集
curl -s http://localhost:26657/validators | jq '.result.validators[] | {address, voting_power}'

# 查询验证者委托详情
./build/msgd query staking delegation \
  $(./build/msgd keys show validator -a --keyring-backend os) \
  "$VALOPER" --node tcp://localhost:26657

4.8 验证者佣金管理

# 查看当前佣金率
VALOPER=$(./build/msgd keys show validator --bech val -a --keyring-backend os)
./build/msgd query staking validator "$VALOPER" -o json | jq '.validator.commission'

# 更改佣金率 (不能超过 max-rate, 每日不超 max-change-rate)
./build/msgd tx staking edit-validator \
  --commission-rate "0.12" \
  --from validator \
  --gas auto --gas-prices 1000000000attoMSG \
  --chain-id msg-chain-1 \
  --keyring-backend os -y

4.9 解禁验证者 (Unjail)

# 检查是否被监禁
VALOPER=$(./build/msgd keys show validator --bech val -a --keyring-backend os)
./build/msgd query staking validator "$VALOPER" -o json | jq '.validator.jailed'

# 解禁
./build/msgd tx slashing unjail \
  --from validator \
  --gas auto --gas-prices 1000000000attoMSG \
  --chain-id msg-chain-1 \
  --keyring-backend os \
  --node tcp://localhost:26657 -y

4.10 自动解禁脚本

#!/bin/bash
# auto_unjail.sh — 自动检测并解禁 (建议 crontab 每 5 分钟执行)
KEY_NAME="validator"
VALOPER=$(msgd keys show "$KEY_NAME" --bech val -a --keyring-backend os)
JAILED=$(msgd query staking validator "$VALOPER" --node tcp://localhost:26657 -o json | \
  jq -r '.validator.jailed')

if [ "$JAILED" = "true" ]; then
  echo "[$(date)] 验证者被监禁,正在解禁..."
  msgd tx slashing unjail --from "$KEY_NAME" --gas auto --gas-prices 1000000000attoMSG \
    --chain-id msg-chain-1 --keyring-backend os --node tcp://localhost:26657 -y
fi

# crontab: */5 * * * * /bin/bash $HOME/auto_unjail.sh >> $HOME/unjail.log 2>&1

五、委托操作

5.1 委托 MSG 代币

# 委托 MSG 给验证者
./build/msgd tx staking delegate \
  msgvaloper1qypqxpq9kcrn2c9afea5lq35ef37c5x7xyzabc \
  1000000000000000000umsg \
  --from delegator \
  --gas auto --gas-prices 1000000000attoMSG \
  --gas-adjustment 1.3 \
  --chain-id msg-chain-1 \
  --keyring-backend os \
  --node tcp://localhost:26657 -y

# 查询委托状态
./build/msgd query staking delegation \
  $(./build/msgd keys show delegator -a --keyring-backend os) \
  msgvaloper1... --node tcp://localhost:26657 -o json

5.2 解委托代币

# 解委托 (等待 21 天解绑期)
./build/msgd tx staking unbond \
  msgvaloper1qypqxpq9kcrn2c9afea5lq35ef37c5x7xyzabc \
  500000000000000000umsg \
  --from delegator \
  --gas auto --gas-prices 1000000000attoMSG \
  --chain-id msg-chain-1 \
  --keyring-backend os -y

# 查询解绑进度
./build/msgd query staking unbonding-delegation \
  $(./build/msgd keys show delegator -a --keyring-backend os) \
  msgvaloper1... --node tcp://localhost:26657 -o json

5.3 重新委托代币

# 重新委托 (立即转移,无需等待解绑期)
./build/msgd tx staking redelegate \
  msgvaloper1source... \
  msgvaloper1target... \
  300000000000000000umsg \
  --from delegator \
  --gas auto --gas-prices 1000000000attoMSG \
  --gas-adjustment 1.3 \
  --chain-id msg-chain-1 \
  --keyring-backend os -y

# 注意: 每 7 天可重新委托一次

5.4 查询委托和奖励

# 查询所有委托
./build/msgd query staking delegations \
  $(./build/msgd keys show delegator -a --keyring-backend os) \
  --node tcp://localhost:26657 -o json

# 查询未领取奖励
./build/msgd query distribution rewards \
  $(./build/msgd keys show delegator -a --keyring-backend os) \
  --node tcp://localhost:26657 -o json

# 查询指定验证者奖励
./build/msgd query distribution rewards \
  $(./build/msgd keys show delegator -a --keyring-backend os) \
  msgvaloper1... --node tcp://localhost:26657 -o json

# 查询佣金奖励 (验证者)
./build/msgd query distribution validator-commission \
  msgvaloper1... --node tcp://localhost:26657 -o json

5.5 领取奖励

# 领取所有奖励
./build/msgd tx distribution withdraw-all-rewards \
  --from delegator \
  --gas auto --gas-prices 1000000000attoMSG \
  --chain-id msg-chain-1 \
  --keyring-backend os -y

# 领取特定验证者奖励
./build/msgd tx distribution withdraw-rewards \
  msgvaloper1... \
  --from delegator \
  --gas auto --gas-prices 1000000000attoMSG \
  --chain-id msg-chain-1 \
  --keyring-backend os -y

# 验证者领取佣金 (添加 --commission)
./build/msgd tx distribution withdraw-rewards \
  $(./build/msgd keys show validator --bech val -a --keyring-backend os) \
  --from validator --commission \
  --gas auto --gas-prices 1000000000attoMSG \
  --chain-id msg-chain-1 --keyring-backend os -y

5.6 设置奖励提取地址

# 设置奖励自动发送到另一地址
./build/msgd tx distribution set-withdraw-addr \
  msg1reward_destination_address... \
  --from delegator \
  --gas auto --gas-prices 1000000000attoMSG \
  --chain-id msg-chain-1 \
  --keyring-backend os -y

5.7 委托操作总结

操作 命令 等待期 说明
委托 tx staking delegate 无 立即生效
解委托 tx staking unbond 21 天 等待期后释放
重新委托 tx staking redelegate 无 (7 天限制) 立即转移委托
领取奖励 tx distribution withdraw-rewards 无 立即到账

六、DAR 共识参与

6.1 什么是 DAR (Dilithium-AR)

DAR (Dilithium-Aggregated Round-robin) 是 MSG Chain 的共识扩展机制:

  1. Dilithium-5 聚合签名: 使用后量子签名技术进行区块签名聚合
  2. Round-Robin 出块: 验证者按顺序轮流获得出块权
  3. 评分权重: DAR 评分影响出块概率分布

6.2 DAR 评分系统 (dar_rating_v1)

# 查询 DAR 评分 (通过自定义 RPC)
curl -X POST http://localhost:26657 \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "/msgchain.dar.v1.Query/DarRatings",
    "params": {}
  }' | jq '.result.ratings'

# 查询单个验证者 DAR 评分
VALOPER=$(./build/msgd keys show validator --bech val -a --keyring-backend os)
curl -X POST http://localhost:26657 \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "/msgchain.dar.v1.Query/DarRating",
    "params": {
      "validator_address": "'$VALOPER'"
    }
  }' | jq '.result.rating'

6.3 DAR 评分影响出块选择

出块概率公式:
  P(validator_i) = (stake_i × DAR_score_i) / Σ(stake_j × DAR_score_j)

DAR 评分因子:
  - 出块参与率 (40%): 实际生产的区块比例
  - 签名及时性 (25%): 预投票/预提交延迟
  - 网络质量 (20%): 对等节点连接稳定性
  - 历史表现 (15%): 评分趋势

6.4 提高 DAR 评分

# 1. 确保节点 24/7 在线
sudo systemctl enable msgd

# 2. 优化网络 (选择靠近主要节点的数据中心)

# 3. 检查出块状态
curl -s http://localhost:26657/consensus_state | \
  jq '.result.round_state.height_vote_set[0].prevotes_bit_array'

# 4. 保持节点版本更新
./build/msgd version

# 5. 使用哨兵节点架构

6.5 DAR 聚合签名过程

1. Proposer 生成区块并使用 Dilithium-5 签名
       │
2. 其他验证者验证并生成 Dilithium-5 预投票签名
       │
3. DAR 聚合器收集签名
       │
4. 聚合为单个 Dilithium-AR 聚合签名
       │
5. 区块提交 (包含聚合签名)

6.6 DAR 故障排查

# 检查 DAR 是否启用
grep -E "dar_enabled|round_robin_proposer" ~/.msgd/config/config.toml

# 检查出块时间
curl -s http://localhost:1317/api/v1/chain/info | jq '.block_time'

# 检查是否在活跃验证者集
./build/msgd query staking validators --status BOND_STATUS_BONDED \
  --node tcp://localhost:26657 -o json | jq '.validators[].operator_address'

七、Dilithium-5 密钥管理

7.1 Dilithium-5 概述

Dilithium-5 是 CRYSTALS-Dilithium 的第三个安全级别:

MSG Chain 使用 Dilithium-5 作为:

  1. 账户密钥 (交易签名)
  2. 共识密钥 (区块签名)
  3. DAR 聚合签名

7.2 生成 Dilithium-5 密钥

# 生成 Dilithium-5 密钥
./build/msgd keys add mykey \
  --algo dilithium5 \
  --keyring-backend os

# 从助记词恢复
./build/msgd keys add mykey-restored \
  --recover \
  --algo dilithium5 \
  --keyring-backend os

# 验证密钥类型
./build/msgd keys show mykey -p --keyring-backend os | jq '.@type'
# 预期: "/cosmos.crypto.dilithium.PubKey"

7.3 导出导入密钥

# 导出密钥 (加密 ASCII)
./build/msgd keys export mykey \
  --keyring-backend os \
  2> /backup/mykey.asc

# 导入密钥
./build/msgd keys import mykey-imported \
  /backup/mykey.asc \
  --keyring-backend os

7.4 备份关键文件

# 备份验证者私钥 (最关键!)
cp ~/.msgd/config/priv_validator_key.json /backup/secure/

# 备份节点密钥
cp ~/.msgd/config/node_key.json /backup/secure/

# 备份密钥环
tar -czf msgd_keyring_backup_$(date +%Y%m%d).tar.gz ~/.msgd/keyring-file/

7.5 验证 Dilithium-5 签名

# 通过自定义 RPC 验证签名
curl -X POST http://localhost:26657 \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "/msgchain.dilithium.v1.Query/VerifySignature",
    "params": {
      "public_key": "base64-encoded-pk",
      "signature": "base64-encoded-sig",
      "message": "base64-encoded-msg",
      "algorithm": "Dilithium5"
    }
  }'

7.6 密钥管理最佳实践

创建:
  ☐ 离线/安全环境创建密钥
  ☐ 使用 --algo dilithium5
  ☐ 使用操作系统密钥环 (--keyring-backend os)
  ☐ 立即备份助记词 (纸质 + 钢制)

备份:
  ☐ 助记词: 离线钢制备份 (至少 2 份)
  ☐ priv_validator_key.json: 加密备份
  ☐ node_key.json: 备份

权限:
  ☐ chmod 600 priv_validator_key.json
  ☐ chmod 600 node_key.json

八、Gas 费与收益

8.1 Gas 价格配置

# Gas 价格步进:
#   low:      0.01 umsg
#   average:  0.025 umsg
#   high:     0.04 umsg

# 配置最低 Gas 价格
sed -i 's/minimum-gas-prices = ""/minimum-gas-prices = "1000000000attoMSG"/' ~/.msgd/config/app.toml

# 交易时指定 Gas 价格
./build/msgd tx bank send ... --gas-prices 1000000000attoMSG

8.2 Gas 费分配

Gas 费分配 (gas_fee_distribution_v2):
  40% → 区块提议者 (验证者)
  30% → 开发者基金
  20% → 燃烧 (通缩)
  10% → 基金会金库 (Foundation Treasury)

8.3 查询 Gas 费分配

# 查询 Gas 分配合约
curl -X POST http://localhost:26657/cosmwasm.wasm.v1.Query/SmartContractState \
  -H "Content-Type: application/json" \
  -d '{
    "address": "msg1...gas_fee_distribution",
    "query_data": "'$(echo -n '{"get_distribution_params":{}}' | base64 -w0)'"
  }'

8.4 查询发行参数

# 查询当前发行速率
curl -s http://localhost:1317/api/v1/emission/rate | jq

# 查询 Staking 池
./build/msgd query staking pool --node tcp://localhost:26657 -o json

8.5 查询验证者收益

# 查询待领取奖励
VALOPER=$(./build/msgd keys show validator --bech val -a --keyring-backend os)
./build/msgd query distribution validator-outstanding-rewards "$VALOPER" \
  --node tcp://localhost:26657 -o json

# 查询佣金
./build/msgd query distribution validator-commission "$VALOPER" \
  --node tcp://localhost:26657 -o json

8.6 收益管理脚本

#!/bin/bash
# reward_manager.sh — 收益自动管理
KEY_NAME=${1:-"validator"}
CHAIN_ID="msg-chain-1"
VALOPER=$(msgd keys show "$KEY_NAME" --bech val -a --keyring-backend os)

echo "[$(date)] 领取所有奖励..."
msgd tx distribution withdraw-all-rewards --from "$KEY_NAME" \
  --gas auto --gas-prices 1000000000attoMSG --gas-adjustment 1.5 \
  --chain-id "$CHAIN_ID" --keyring-backend os --node tcp://localhost:26657 -y

echo "[$(date)] 领取佣金..."
msgd tx distribution withdraw-rewards "$VALOPER" --from "$KEY_NAME" --commission \
  --gas auto --gas-prices 1000000000attoMSG --chain-id "$CHAIN_ID" \
  --keyring-backend os --node tcp://localhost:26657 -y

echo "[$(date)] 完成"

九、节点安全

9.1 哨兵节点架构

                    Internet
                        |
               Sentry 1     Sentry 2
              (public)     (public)
                    \       /
                  Firewall
                      |
                  Validator
                  (private)

验证者 config.toml:

[p2p]
pex = false
persistent_peers = "sentry1_id@sentry1_ip:26656,sentry2_id@sentry2_ip:26656"
laddr = "tcp://127.0.0.1:26656"
private_peer_ids = "validator_node_id"
unconditional_peer_ids = "sentry1_id,sentry2_id"

哨兵 config.toml:

[p2p]
pex = true
seeds = "seed1.msgchain.org:26656,seed2.msgchain.org:26656"
private_peer_ids = "validator_node_id"
unconditional_peer_ids = "validator_node_id"
laddr = "tcp://0.0.0.0:26656"

9.2 防火墙配置

# UFW 配置
sudo ufw default deny incoming
sudo ufw default allow outgoing

# 验证者 (仅 SSH)
sudo ufw allow 22/tcp

# 哨兵 (SSH + P2P)
# sudo ufw allow 22/tcp
# sudo ufw allow 26656/tcp

sudo ufw enable

9.3 SSH 安全

# /etc/ssh/sshd_config 配置
# Port 2222
# PermitRootLogin no
# PasswordAuthentication no
# PubkeyAuthentication yes

sudo systemctl restart sshd

9.4 操作系统安全

# 创建专用用户
sudo useradd -m -s /bin/bash msgd

# 自动安全更新
sudo apt-get install -y unattended-upgrades

# 内核优化
cat >> /etc/sysctl.conf << 'EOF'
net.core.somaxconn = 1024
vm.swappiness = 10
fs.file-max = 65536
EOF
sudo sysctl -p

# 审计关键文件
sudo apt-get install -y auditd
sudo auditctl -w /home/msgd/.msgd/config/priv_validator_key.json -p wa -k msgd_key

9.5 DDoS 防护

# Nginx 反代 + 速率限制
sudo apt-get install -y nginx
cat > /etc/nginx/sites-available/msgd-rpc << 'EOF'
server {
    listen 443 ssl http2;
    server_name rpc.validator.example.com;
    limit_req_zone $binary_remote_addr zone=rpc:10m rate=100r/s;
    limit_conn_zone $binary_remote_addr zone=addr:10m;
    location / {
        proxy_pass http://127.0.0.1:26657;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}
EOF

# fail2ban
sudo apt-get install -y fail2ban

9.6 密钥文件权限

chmod 600 ~/.msgd/config/priv_validator_key.json
chmod 600 ~/.msgd/config/node_key.json
chmod 700 ~/.msgd/config/

十、监控与告警

10.1 Prometheus 配置

启用节点 Prometheus:

sed -i 's/prometheus = false/prometheus = true/' ~/.msgd/config/config.toml
sudo systemctl restart msgd

# 验证指标端点
curl -s http://localhost:26660/metrics | head -10

完整 Prometheus scrape 配置:

# /etc/prometheus/prometheus.yml
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: "msgd-node"
    scrape_interval: 10s
    static_configs:
      - targets: ["localhost:26660"]
        labels:
          group: "validator"

  - job_name: "node-exporter"
    scrape_interval: 30s
    static_configs:
      - targets: ["localhost:9100"]

10.2 告警规则

# /etc/prometheus/rules/msgd_alerts.yml
groups:
  - name: msgd-validator
    interval: 30s
    rules:
      - alert: NodeDown
        expr: up{job="msgd-node"} == 0
        for: 1m
        labels: { severity: critical }
        annotations:
          summary: "MSG Chain 节点离线"

      - alert: NodeCatchingUp
        expr: msgd_tendermint_sync_mode > 0
        for: 30m
        labels: { severity: warning }
        annotations:
          summary: "节点正在同步超过 30 分钟"

      - alert: BlockHeightStalled
        expr: increase(msgd_tendermint_block_height[5m]) == 0
        for: 10m
        labels: { severity: critical }
        annotations:
          summary: "区块高度停滞"

      - alert: ValidatorJailed
        expr: msgd_validator_jailed == 1
        for: 0m
        labels: { severity: critical }
        annotations:
          summary: "验证者被监禁!"

      - alert: DiskSpaceLow
        expr: (1 - node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100 > 80
        for: 5m
        labels: { severity: warning }
        annotations:
          summary: "磁盘使用率超过 80%"

      - alert: DiskSpaceCritical
        expr: (1 - node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100 > 95
        for: 1m
        labels: { severity: critical }
        annotations:
          summary: "磁盘使用率超过 95%"

      - alert: LowPeerCount
        expr: msgd_tendermint_p2p_peers < 5
        for: 5m
        labels: { severity: warning }
        annotations:
          summary: "对等节点数少于 5"

      - alert: MempoolFull
        expr: msgd_tendermint_mempool_size > 3000
        for: 5m
        labels: { severity: warning }
        annotations:
          summary: "Mempool 交易数超过 3000"

10.3 Grafana 仪表板 JSON

{
  "dashboard": {
    "title": "MSG Chain 验证者监控",
    "tags": ["msg-chain", "validator"],
    "panels": [
      {
        "title": "区块高度",
        "type": "stat",
        "targets": [{
          "expr": "msgd_tendermint_block_height",
          "legendFormat": "{{instance}}"
        }]
      },
      {
        "title": "对等节点数",
        "type": "stat",
        "targets": [{
          "expr": "msgd_tendermint_p2p_peers",
          "legendFormat": "{{instance}}"
        }],
        "thresholds": [
          { "color": "red", "value": null },
          { "color": "yellow", "value": 5 },
          { "color": "green", "value": 15 }
        ]
      },
      {
        "title": "同步状态",
        "type": "stat",
        "targets": [{
          "expr": "msgd_tendermint_sync_mode"
        }],
        "mappings": [
          { "type": "value", "value": "0", "text": "已同步" },
          { "type": "value", "value": "1", "text": "同步中" }
        ]
      },
      {
        "title": "磁盘使用率",
        "type": "gauge",
        "targets": [{
          "expr": "100 - (node_filesystem_avail_bytes{mountpoint=\"/\"} / node_filesystem_size_bytes{mountpoint=\"/\"} * 100)"
        }],
        "thresholds": [
          { "color": "green", "value": null },
          { "color": "yellow", "value": 80 },
          { "color": "red", "value": 95 }
        ]
      },
      {
        "title": "验证者状态",
        "type": "stat",
        "targets": [{
          "expr": "msgd_validator_jailed"
        }],
        "mappings": [
          { "type": "value", "value": "0", "text": "正常" },
          { "type": "value", "value": "1", "text": "被监禁!" }
        ]
      },
      {
        "title": "区块出块速率",
        "type": "timeseries",
        "targets": [{
          "expr": "rate(msgd_tendermint_block_height[1m])"
        }]
      },
      {
        "title": "Mempool 大小",
        "type": "timeseries",
        "targets": [{
          "expr": "msgd_tendermint_mempool_size"
        }]
      },
      {
        "title": "内存使用",
        "type": "timeseries",
        "targets": [{
          "expr": "100 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100)"
        }]
      }
    ]
  }
}

10.4 Alertmanager 通知

# /etc/alertmanager/alertmanager.yml
global:
  smtp_smarthost: 'smtp.example.com:587'
  smtp_from: 'alert@validator.example.com'
route:
  group_by: ['alertname', 'severity']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  receiver: 'admin-email'
  routes:
    - match: { severity: critical }
      receiver: 'pager-duty'
      repeat_interval: 1h
receivers:
  - name: 'admin-email'
    email_configs:
      - to: 'admin@validator.example.com'
  - name: 'pager-duty'
    webhook_configs:
      - url: 'https://hooks.pagerduty.com/integration/...'

10.5 Telegram 通知脚本

#!/bin/bash
# alert-telegram.sh
TELEGRAM_BOT_TOKEN="your_bot_token"
TELEGRAM_CHAT_ID="your_chat_id"
MESSAGE="$1"
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
  -d "chat_id=${TELEGRAM_CHAT_ID}" -d "text=${MESSAGE}" > /dev/null

10.6 日志管理

# 实时日志
journalctl -u msgd -f

# 查看错误日志
journalctl -u msgd -p err --since "24 hours ago"

# 配置日志轮转
cat > /etc/logrotate.d/msgd << 'EOF'
/var/log/msgd/msgd.log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    copytruncate
    maxsize 500M
}
EOF

十一、备份与恢复

11.1 关键文件备份

# 需要备份的文件列表:
#   1. priv_validator_key.json — 验证者共识私钥 (最关键!)
#   2. node_key.json           — P2P 身份密钥
#   3. keyring-*               — 密钥环 (账户密钥)
#   4. genesis.json            — 创世文件
#   5. config.toml / app.toml  — 配置文件
#   6. data/                   — 区块链数据 (可选)

# 完整备份脚本
#!/bin/bash
# backup_msgd.sh
BACKUP_DIR="/backup/msgd/$(date +%Y%m%d_%H%M%S)"
mkdir -p "$BACKUP_DIR"

echo "=== MSG Chain 备份 ==="

# 备份密钥
cp ~/.msgd/config/priv_validator_key.json "$BACKUP_DIR/"
cp ~/.msgd/config/node_key.json "$BACKUP_DIR/"
echo "密钥已备份"

# 备份密钥环
if [ -d ~/.msgd/keyring-file ]; then
  cp -r ~/.msgd/keyring-file "$BACKUP_DIR/"
fi
if [ -d ~/.msgd/keyring-test ]; then
  cp -r ~/.msgd/keyring-test "$BACKUP_DIR/"
fi
echo "密钥环已备份"

# 备份配置文件
cp ~/.msgd/config/genesis.json "$BACKUP_DIR/"
cp ~/.msgd/config/app.toml "$BACKUP_DIR/"
cp ~/.msgd/config/config.toml "$BACKUP_DIR/"
cp ~/.msgd/config/client.toml "$BACKUP_DIR/"
echo "配置文件已备份"

# 备份 addrbook
cp ~/.msgd/config/addrbook.json "$BACKUP_DIR/" 2>/dev/null || true

# 加密备份
tar -czf "${BACKUP_DIR}.tar.gz" -C /backup/msgd "$(basename $BACKUP_DIR)"
gpg --symmetric --cipher-algo AES256 "${BACKUP_DIR}.tar.gz"
rm -rf "$BACKUP_DIR" "${BACKUP_DIR}.tar.gz"

echo "加密备份: ${BACKUP_DIR}.tar.gz.gpg"
echo "完成"

11.2 从备份恢复

# 恢复步骤
# 1. 停止节点
sudo systemctl stop msgd

# 2. 解密备份
gpg --decrypt backup_file.tar.gz.gpg > backup_file.tar.gz
tar -xzf backup_file.tar.gz

# 3. 恢复密钥
cp backup_dir/priv_validator_key.json ~/.msgd/config/
cp backup_dir/node_key.json ~/.msgd/config/
chmod 600 ~/.msgd/config/priv_validator_key.json
chmod 600 ~/.msgd/config/node_key.json

# 4. 恢复配置
cp backup_dir/genesis.json ~/.msgd/config/
cp backup_dir/app.toml ~/.msgd/config/
cp backup_dir/config.toml ~/.msgd/config/

# 5. 恢复密钥环
cp -r backup_dir/keyring-file ~/.msgd/ 2>/dev/null || true

# 6. 重新启动
sudo systemctl start msgd

11.3 快照创建和恢复

# 创建数据快照 (压缩 data 目录)
sudo systemctl stop msgd

cd ~/.msgd
tar -czf /backup/msgd/snapshot_$(date +%Y%m%d).tar.gz data/

sudo systemctl start msgd

# 从快照恢复
sudo systemctl stop msgd
rm -rf ~/.msgd/data/
tar -xzf /backup/msgd/snapshot_通用维护记录.tar.gz -C ~/.msgd/
sudo systemctl start msgd

11.4 状态同步 (快速恢复)

# 配置状态同步 (用于快速追块)
# config.toml [statesync] 部分
# enable = true
# rpc_servers = "https://rpc.msgchain.org:26657,https://rpc2.msgchain.org:26657"
# trust_height = 12345
# trust_hash = "ABC..."
# trust_period = "168h"

# 重置数据并启用状态同步
./build/msgd tendermint unsafe-reset-all --keep-addr-book

# 重启节点将自动启用状态同步
sudo systemctl restart msgd

11.5 灾难恢复流程

# 场景 1: 验证者私钥丢失
# 解决: 从助记词恢复密钥,创建新验证者
# 注意: 恢复后验证者地址会变更,需要重新委托

# 场景 2: 数据损坏
# 解决: 从快照恢复,或使用状态同步重新同步

# 场景 3: 服务器完全故障
# 解决: 在新服务器上搭建节点,恢复密钥和快照

# 场景 4: 双签 (sign equivocation)
# 警告: 如果使用相同 priv_validator_key 在不同机器上同时签名
# 会导致双签惩罚 (slashing)
# 解决方案: 使用 TMKMS 管理签名,避免私钥复制

十二、升级流程

12.1 软件升级提案

MSG Chain 升级通过治理提案完成:

# 提交软件升级提案
./build/msgd tx gov submit-proposal software-upgrade upgrade-v2 \
  --title "MSG Chain v2.0 升级" \
  --description "升级说明" \
  --upgrade-height 1000000 \
  --deposit 1000000000000000000umsg \
  --from validator \
  --gas auto --gas-prices 1000000000attoMSG \
  --chain-id msg-chain-1 \
  --keyring-backend os -y

# 查询提案状态
./build/msgd query gov proposal 1 --node tcp://localhost:26657

# 对提案投票
./build/msgd tx gov vote 1 yes \
  --from validator \
  --gas auto --gas-prices 1000000000attoMSG \
  --chain-id msg-chain-1 \
  --keyring-backend os -y

12.2 Cosmovisor 自动升级

# Cosmovisor 目录结构:
# ~/.msgd/cosmovisor/
# ├── genesis/bin/msgd      # 原始版本
# ├── current -> genesis/   # 当前使用版本
# └── upgrades/
#     └── upgrade-v2/
#         └── bin/msgd      # 升级版本

# 1. 编译新版本
git pull
make build-linux

# 2. 创建升级目录
mkdir -p ~/.msgd/cosmovisor/upgrades/upgrade-v2/bin

# 3. 放置新二进制
cp ./build/msgd ~/.msgd/cosmovisor/upgrades/upgrade-v2/bin/

# 4. 验证
~/.msgd/cosmovisor/upgrades/upgrade-v2/bin/msgd version

# 5. 到达升级高度时,Cosmovisor 自动:
#    - 停止当前节点
#    - 备份数据
#    - 切换 current symlink
#    - 用新二进制重启

# 验证升级
cosmovisor version

12.3 手动升级

# 1. 监控升级高度
# 等待节点在 upgrade-height 处暂停

# 2. 节点自动暂停后
# 日志会显示: "UPGRADE \"upgrade-v2\" NEEDED at height: 1000000"

# 3. 备份旧数据
cp ~/.msgd/data/ ~/.msgd/data_backup_$(date +%Y%m%d) -r

# 4. 替换二进制
cp ./build/msgd ~/.msgd/cosmovisor/genesis/bin/
# 或更新 current 链接

# 5. 重启节点
sudo systemctl restart msgd

# 6. 验证升级
./build/msgd version
journalctl -u msgd -n 50 --no-pager | grep -i upgrade

12.4 升级回滚

# 如果需要回滚升级:

# 1. 停止节点
sudo systemctl stop msgd

# 2. 恢复旧二进制
# 使用之前备份的二进制替换

# 3. 回滚数据 (恢复升级前的数据)
./build/msgd rollback

# 注意: 只能回滚一个区块
# 对于大范围回滚,需要从备份快照恢复

# 4. 启动节点
sudo systemctl start msgd

12.5 升级检查清单

升级前:
  ☐ 阅读升级提案和变更日志
  ☐ 备份配置文件和密钥
  ☐ 备份数据目录 (快照)
  ☐ 编译并测试新版本
  ☐ 确认 upgrade-height
  ☐ 通知委托人

升级中:
  ☐ 监控节点暂停
  ☐ 替换二进制
  ☐ 重启节点
  ☐ 检查日志

升级后:
  ☐ 验证区块生产
  ☐ 检查对等节点连接
  ☐ 验证 DAR 共识
  ☐ 确认验证者状态
  ☐ 更新监控告警配置

十三、附录

13.1 端口速查表

端口 用途 配置文件
26656 P2P 通信 config.toml p2p.laddr
26657 RPC config.toml rpc.laddr
26660 Prometheus config.toml instrumentation.prometheus_listen_addr
1317 REST API app.toml api.address
9090 gRPC app.toml grpc.address
9091 gRPC Web app.toml grpc-web.address

13.2 Make 命令速查

命令 说明
make deps 安装依赖
make build-linux 编译 Linux 二进制
make build-all 编译所有平台
make test 运行测试
make test-quantum 运行后量子测试
make lint 代码检查
make ci-contracts CI 合约编译测试

13.3 密钥管理速查

msgd keys add <name> --algo dilithium5              # 创建密钥
msgd keys add <name> --recover --algo dilithium5     # 恢复密钥
msgd keys list                                       # 列出密钥
msgd keys show <name> -a                             # 查看地址
msgd keys show <name> -p                             # 查看公钥
msgd keys show <name> --bech val -a                  # 查看 valoper 地址
msgd keys export <name>                              # 导出密钥
msgd keys import <name> <file>                       # 导入密钥
msgd keys delete <name>                              # 删除密钥

13.4 查询命令速查

msgd query bank balances <addr>                      # 余额
msgd query staking validators                        # 验证者列表
msgd query staking validator <valoper>                # 验证者详情
msgd query staking delegations <addr>                # 委托列表
msgd query distribution rewards <addr>               # 奖励
msgd query distribution commission <valoper>         # 佣金
msgd query tx <hash>                                 # 交易详情
msgd query wasm list-code                            # 合约代码列表
msgd query wasm contract-state smart <addr> '<msg>'  # 合约查询

13.5 Tendermint RPC 速查

curl http://localhost:26657/status                   # 节点状态
curl http://localhost:26657/health                    # 健康检查
curl http://localhost:26657/net_info                  # 网络信息
curl http://localhost:26657/validators                # 验证者集
curl http://localhost:26657/block?height=1            # 区块
curl http://localhost:26657/consensus_state           # 共识状态
curl http://localhost:26657/unconfirmed_txs           # 未确认交易

13.6 REST API 速查

curl http://localhost:1317/cosmos/bank/v1beta1/balances/<addr>
curl http://localhost:1317/cosmos/staking/v1beta1/validators
curl http://localhost:1317/cosmos/distribution/v1beta1/delegators/<addr>/rewards
curl http://localhost:1317/api/v1/chain/info
curl http://localhost:1317/api/v1/emission/rate
curl http://localhost:1317/api/v1/validator/set
curl http://localhost:1317/api/v1/staking/pool

13.7 常用环境变量

export DAEMON_NAME=msgd
export DAEMON_HOME=$HOME/.msgd
export DAEMON_RESTART_AFTER_UPGRADE=true
export DAEMON_ALLOW_DOWNLOAD_BINARIES=false
export CHAIN_ID=msg-chain-1
export KEYRING_BACKEND=os
export GAS_PRICES=1000000000attoMSG
export NODE=tcp://localhost:26657

13.8 排查工具脚本

#!/bin/bash
# health_check.sh — MSG Chain 节点健康检查
NODE=${1:-"http://localhost:26657"}
REST=${2:-"http://localhost:1317"}
echo "=== MSG Chain 节点健康检查 ==="
echo ""
echo "--- 基本信息 ---"
curl -s $NODE/status | jq '{moniker: .result.node_info.moniker, network: .result.node_info.network, version: .result.node_info.version}'
echo ""
echo "--- 同步状态 ---"
curl -s $NODE/status | jq '{height: .result.sync_info.latest_block_height, catching_up: .result.sync_info.catching_up}'
echo ""
echo "--- 网络 ---"
curl -s $NODE/net_info | jq '{n_peers: .result.n_peers}'
echo ""
echo "--- 共识 ---"
curl -s $NODE/consensus_state | jq '{round: .result.round_state.height_round_step}'
echo ""
echo "--- 健康 ---"
curl -s $NODE/health && echo " OK" || echo " FAIL"
echo ""
echo "--- REST API ---"
curl -s $REST/cosmos/base/tendermint/v1beta1/node_info | jq '{node_info: .default_node_info.network}' 2>/dev/null || echo "REST API 不可达"

本文档基于 MSG Chain 代码库核实的技术事实。
白皮书系统: https://msgchain.org/whitepaper/