MSG Chain 验证者与节点运维完整指南
数据来源:MSG Chain 代码库核实
主网状态: No-Go — 当前 MSGChain 主网裁决为 No-Go,以下内容反映代码实际状态,不代表生产可用。
目录
一、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
节点质押模块,处理验证者注册、委托、解委托、奖励分发。
- 合约地址: 通过 genesis_registry 以 canonical key
candidate_node_staking解析 - 核心功能: 验证者创建、编辑、委托、解委托、重新委托、奖励查询
- 与 Cosmos SDK 关系: 替代标准 staking 模块,增加 MSG 链特定逻辑
validator_qualification_v2
验证者资格和评分管理。
- 合约地址: 通过 canonical key
validator_qualification解析 - 核心功能: 验证者资格认证、评分计算、活跃度跟踪
- 评分因子: 出块率、DAR 评分、网络延迟、历史表现
dar_rating_v1
DAR (Dilithium-AR) 评分系统,影响出块权分配。
- 合约地址: 动态解析 (不在 genesis 中注册)
- 核心功能: DAR 评分更新、查询、聚合验证
- 出块影响: DAR 评分高的验证者有更高的出块概率
gas_fee_distribution_v2
Gas 费用分配模块。
- 合约地址: 通过 canonical key
gas_fee_distribution解析 - 分配比例: 40% 验证者 / 30% 开发者 / 20% 燃烧 / 10% 基金会金库
- 分发方式: 每个区块结束后自动分配
emission_schedule_v2
代币发行计划管理。
- 合约地址: 通过 canonical key
emission_schedule解析 - 核心功能: 区块奖励发行、通胀率控制、发行计划更新
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 链不同:
- Round-Robin 调度: 验证者按顺序轮流获得出块权
- DAR 权重调整: DAR 评分影响轮次中的出块概率,高评分验证者获得更多出块机会
- Dilithium-AR 聚合签名: 每个区块使用 Dilithium-5 聚合签名进行最终确认
- 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 的共识扩展机制:
- Dilithium-5 聚合签名: 使用后量子签名技术进行区块签名聚合
- Round-Robin 出块: 验证者按顺序轮流获得出块权
- 评分权重: 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 的第三个安全级别:
- 安全性: 相当于 AES-256
- 抗量子: 抵抗已知量子攻击
- 密钥大小: 公钥 2592 字节, 私钥 4864 字节, 签名 4595 字节
- 标准: NIST FIPS 204
MSG Chain 使用 Dilithium-5 作为:
- 账户密钥 (交易签名)
- 共识密钥 (区块签名)
- 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/
