From 9fdb5acaa84a0045f6ae8fc235926b202dfb431a Mon Sep 17 00:00:00 2001 From: hailin Date: Fri, 20 Feb 2026 08:50:20 -0800 Subject: [PATCH] =?UTF-8?q?feat(chain):=20=E6=B7=BB=E5=8A=A0=20init-fullno?= =?UTF-8?q?de.sh=20=E2=80=94=20=E9=9D=9E=E5=88=9B=E4=B8=96=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E5=88=9D=E5=A7=8B=E5=8C=96=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 全节点只需: genexd init + 复制 genesis.json + 配置 peers 区块数据通过 P2P 从创世节点同步,不需要重新执行 genesis 初始化 Co-Authored-By: Claude Opus 4.6 --- blockchain/init-fullnode.sh | 70 +++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 blockchain/init-fullnode.sh diff --git a/blockchain/init-fullnode.sh b/blockchain/init-fullnode.sh new file mode 100644 index 0000000..68aa150 --- /dev/null +++ b/blockchain/init-fullnode.sh @@ -0,0 +1,70 @@ +#!/bin/bash +set -e + +# ============================================================ +# init-fullnode.sh — 初始化非创世全节点 (从创世节点同步) +# +# 用法: 由 Docker 容器内执行,需要挂载: +# -v :/genesis:ro (创世节点的 .genexd 目录) +# -v :/home/genex/.genexd +# +# 环境变量: +# MONIKER — 节点名称 (必填) +# CHAIN_ID — 链ID (默认: genex-testnet-1) +# PEERS — 持久对等节点列表 (node_id@host:port) +# ============================================================ + +CHAIN_ID="${CHAIN_ID:-genex-testnet-1}" +HOME_DIR="/home/genex/.genexd" +GENESIS_SOURCE="/genesis/config/genesis.json" + +if [ -z "$MONIKER" ]; then + echo "[ERROR] MONIKER environment variable is required" + exit 1 +fi + +echo "[1/4] Initializing node: $MONIKER ..." +genexd init "$MONIKER" --chain-id "$CHAIN_ID" --home "$HOME_DIR" > /dev/null 2>&1 + +echo "[2/4] Copying genesis.json from genesis node..." +if [ ! -f "$GENESIS_SOURCE" ]; then + echo "[ERROR] Genesis file not found at $GENESIS_SOURCE" + exit 1 +fi +cp "$GENESIS_SOURCE" "$HOME_DIR/config/genesis.json" + +echo "[3/4] Configuring node..." +CONFIG_TOML="$HOME_DIR/config/config.toml" +APP_TOML="$HOME_DIR/config/app.toml" + +# Persistent peers +if [ -n "$PEERS" ]; then + sed -i "s/persistent_peers = \"\"/persistent_peers = \"$PEERS\"/" "$CONFIG_TOML" +fi + +# RPC 监听 (允许外部访问) +sed -i "s/laddr = \"tcp:\/\/127.0.0.1:26657\"/laddr = \"tcp:\/\/0.0.0.0:26657\"/" "$CONFIG_TOML" +sed -i "s/cors_allowed_origins = \[\]/cors_allowed_origins = [\"*\"]/" "$CONFIG_TOML" + +# 共识参数 (与创世节点一致) +sed -i 's/timeout_propose = "3s"/timeout_propose = "1500ms"/' "$CONFIG_TOML" +sed -i 's/timeout_propose_delta = "500ms"/timeout_propose_delta = "200ms"/' "$CONFIG_TOML" +sed -i 's/timeout_prevote = "1s"/timeout_prevote = "500ms"/' "$CONFIG_TOML" +sed -i 's/timeout_prevote_delta = "500ms"/timeout_prevote_delta = "200ms"/' "$CONFIG_TOML" +sed -i 's/timeout_precommit = "1s"/timeout_precommit = "500ms"/' "$CONFIG_TOML" +sed -i 's/timeout_precommit_delta = "500ms"/timeout_precommit_delta = "200ms"/' "$CONFIG_TOML" +sed -i 's/timeout_commit = "5s"/timeout_commit = "1s"/' "$CONFIG_TOML" + +# app.toml — 启用 API / JSON-RPC +sed -i "/\[api\]/,/\[/ s/enable = false/enable = true/" "$APP_TOML" +sed -i "/\[json-rpc\]/,/\[/ s/enable = false/enable = true/" "$APP_TOML" +sed -i "s/address = \"127.0.0.1:8545\"/address = \"0.0.0.0:8545\"/" "$APP_TOML" +sed -i "s/ws-address = \"127.0.0.1:8546\"/ws-address = \"0.0.0.0:8546\"/" "$APP_TOML" +sed -i "s/minimum-gas-prices = \"\"/minimum-gas-prices = \"0agnx\"/" "$APP_TOML" +sed -i "s/iavl-cache-size = 781250/iavl-cache-size = 2000000/" "$APP_TOML" + +echo "[4/4] Node initialized!" +echo " Moniker: $MONIKER" +echo " Chain: $CHAIN_ID" +echo " Peers: ${PEERS:-none}" +echo " Home: $HOME_DIR"