#!/usr/bin/env bash # 检查是否以 root 用户运行脚本 if [ "$(id -u)" != "0" ]; then echo "此脚本需要以 root 用户权限运行。" echo "请尝试使用 'sudo -i' 命令切换到 root 用户,然后再次运行此脚本。" exit 1 fi # 脚本保存路径 SCRIPT_PATH="$HOME/Ritual.sh" # 主菜单函数 function main_menu() { while true; do clear echo "脚本由大赌社区哈哈哈哈编写,推特 @ferdie_jhovie,免费开源,请勿相信收费" echo "如有问题,可联系推特,仅此只有一个号" echo "感谢严不由衷的代码贡献" echo "================================================================" echo "退出脚本,请按键盘 ctrl + C 退出即可" echo "请选择要执行的操作:" echo "1) 安装 Ritual 节点" echo "2. 查看 Ritual 节点日志" echo "3. 删除 Ritual 节点" echo "4. 退出脚本" read -p "请输入您的选择: " choice case $choice in 1) install_ritual_node ;; 2) view_logs ;; 3) remove_ritual_node ;; 4) echo "退出脚本!" exit 0 ;; *) echo "无效选项,请重新选择。" ;; esac echo "按任意键继续..." read -n 1 -s done } # 修改 docker-compose.yaml 文件端口映射 function modify_docker_compose_ports() { local compose_file="deploy/docker-compose.yaml" echo "修改 $compose_file 文件端口映射..." # 检查文件是否存在 if [ ! -f "$compose_file" ]; then echo "[错误] $compose_file 文件不存在!" return 1 fi # 修改端口映射 sed -i 's/- "0.0.0.0:4000:4000"/- "0.0.0.0:4050:4000"/' "$compose_file" sed -i 's/- "8545:3000"/- "8550:3000"/' "$compose_file" # 验证修改是否成功 if grep -q "0.0.0.0:4050:4000" "$compose_file" && grep -q "8550:3000" "$compose_file"; then echo "[提示] 端口映射修改成功!" else echo "[警告] 端口映射修改可能失败,请检查 $compose_file 文件内容。" fi } # 安装 Ritual 节点函数 function install_ritual_node() { # 系统更新及必要的软件包安装 (包含 Python线索 echo "系统更新及安装必要的包..." sudo apt update && sudo apt upgrade -y sudo apt -qy install curl git jq lz4 build-essential screen python3 python3-pip # 安装或升级 Python 包 echo "[提示] 升级 pip3 并安装 infernet-cli / infernet-client" pip3 install --upgrade pip pip3 install infernet-cli infernet-client # 检查 Docker 安装情况 echo "检查 Docker 是否已安装..." if command -v docker &> /dev/null; then echo " - Docker 已安装,跳过此 。" else echo " - Docker 未安装,正在进行安装..." sudo apt install -y docker.io sudo systemctl enable docker sudo systemctl start docker fi # 检查 Docker Compose 安装情况 echo "检查 Docker Compose 是否已安装..." if ! command -v docker-compose &> /dev/null && ! docker compose version &> /dev/null; then echo " - Docker Compose 未安装,正在进行安装..." sudo curl -L "https://github.com/docker/compose/releases/download/v2.29.2/docker-compose-$(uname -s)-$(uname -m)" \ -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker} mkdir -p $DOCKER_CONFIG/cli-plugins curl -SL https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose else echo " - Docker Compose 已安装,跳过此步骤。" fi echo "[确认] Docker Compose 版本:" docker compose version || docker-compose version # 安装 Foundry 并设置环境变量 echo echo "安装 Foundry " # 如果 anvil 正在运行则停止 if pgrep anvil &>/dev/null; then echo "[警告] anvil 正在运行,正在关闭以更新 Foundry。" pkill anvil sleep 2 fi cd ~ || exit 1 mkdir -p foundry cd foundry curl -L https://foundry.paradigm.xyz | bash # 安装或更新 $HOME/.foundry/bin/foundryup # 将 ~/.foundry/bin 添加到 PATH if [[ ":$PATH:" != *":$HOME/.foundry/bin:"* ]]; then echo 'export PATH="$HOME/.foundry/bin:$PATH"' >> ~/.bashrc export PATH="$HOME/.foundry/bin:$PATH" fi # 修改:验证 Foundry 安装 echo "[确认] forge 版本:" if ! $HOME/.foundry/bin/forge --version; then echo "[错误] 无法找到 forge 命令,Foundry 安装失败。" exit 1 fi # 修改:删除可能冲突的 /usr/bin/forge(ZOE 相关) if [ -f /usr/bin/forge ]; then echo "[提示] 删除 /usr/bin/forge 以避免 ZOE 冲突..." sudo rm /usr/bin/forge fi echo "[提示] Foundry 安装及环境变量配置完成。" cd ~ || exit 1 # 克隆 infernet-container-starter echo echo "克隆 infernet-container-starter..." git clone https://github.com/ritual-net/infernet-container-starter cd infernet-container-starter || { echo "[错误] 进入目录失败"; exit 1; } docker pull ritualnetwork/hello-world-infernet:latest # 在 screen 会话中进行初始部署(make deploy-container) echo " 检查 screen 会话 ritual 是否存在..." # 检查 'ritual' 会话是否存在 if screen -list | grep -q "ritual"; then echo "[提示] 发现 ritual 会话正在运行,正在终止..." screen -S ritual -X quit sleep 1 fi echo "在 screen -S ritual 会话中开始容器部署..." sleep 1 # 启动新的 screen 会话进行部署 screen -S ritual -dm bash -c 'project=hello-world make deploy-container; exec bash' echo "[提示] 部署工作正在后台的 screen 会话 (ritual) 中进行。" # 用户输入 (Private Key) echo echo "配置 Ritual Node 文件..." read -p "请输入您的 Private Key (0x...): " PRIVATE_KEY # 修改 docker-compose.yaml 文件端口映射 modify_docker_compose_ports # 默认设置 RPC_URL="https://mainnet.base.org/" RPC_URL_SUB="https://mainnet.base.org/" # 替换 registry 地址 REGISTRY="0x3B1554f346DFe5c482Bb4BA31b880c1C18412170" SLEEP=3 START_SUB_ID=250000 BATCH_SIZE=50 # 推荐使用公用 RPC TRAIL_HEAD_BLOCKS=3 INFERNET_VERSION="1.4.0" # infernet 镜像标签 # 修改 config.json / Deploy.s.sol / docker-compose.yaml / Makefile # 修改 deploy/config.json sed -i "s|\"registry_address\": \".*\"|\"registry_address\": \"$REGISTRY\"|" deploy/config.json sed -i "s|\"private_key\": \".*\"|\"private_key\": \"$PRIVATE_KEY\"|" deploy/config.json sed -i "s|\"sleep\": [0-9]*|\"sleep\": $SLEEP|" deploy/config.json sed -i "s|\"starting_sub_id\": [0-9]*|\"starting_sub_id\": $START_SUB_ID|" deploy/config.json sed -i "s|\"batch_size\": [0-9]*|\"batch_size\": $BATCH_SIZE|" deploy/config.json sed -i "s|\"trail_head_blocks\": [0-9]*|\"trail_head_blocks\": $TRAIL_HEAD_BLOCKS|" deploy/config.json sed -i 's|"rpc_url": ".*"|"rpc_url": "https://mainnet.base.org"|' deploy/config.json sed -i 's|"rpc_url": ".*"|"rpc_url": "https://mainnet.base.org"|' projects/hello-world/container/config.json # 修改 projects/hello-world/container/config.json sed -i "s|\"registry_address\": \".*\"|\"registry_address\": \"$REGISTRY\"|" projects/hello-world/container/config.json sed -i "s|\"private_key\": \".*\"|\"private_key\": \"$PRIVATE_KEY\"|" projects/hello-world/container/config.json sed -i "s|\"sleep\": [0-9]*|\"sleep\": $SLEEP|" projects/hello-world/container/config.json sed -i "s|\"starting_sub_id\": [0-9]*|\"starting_sub_id\": $START_SUB_ID|" projects/hello-world/container/config.json sed -i "s|\"batch_size\": [0-9]*|\"batch_size\": $BATCH_SIZE|" projects/hello-world/container/config.json sed -i "s|\"trail_head_blocks\": [0-9]*|\"trail_head_blocks\": $TRAIL_HEAD_BLOCKS|" projects/hello-world/container/config.json # 修改 Deploy.s.sol sed -i "s|\(registry\s*=\s*\).*|\1$REGISTRY;|" projects/hello-world/contracts/script/Deploy.s.sol sed -i "s|\(RPC_URL\s*=\s*\).*|\1\"$RPC_URL\";|" projects/hello-world/contracts/script/Deploy.s.sol # 使用 latest node 镜像 sed -i 's|ritualnetwork/infernet-node:[^"]*|ritualnetwork/infernet-node:latest|' deploy/docker-compose.yaml # 修改 Makefile (sender, RPC_URL) MAKEFILE_PATH="projects/hello-world/contracts/Makefile" sed -i "s|^sender := .*|sender := $PRIVATE_KEY|" "$MAKEFILE_PATH" sed -i "s|^RPC_URL := .*|RPC_URL := $RPC_URL|" "$MAKEFILE_PATH" # 修改 deploy/config.json sed -i 's|"rpc_url": ".*"|"rpc_url": "https://base.drpc.org"|' /root/infernet-container-starter/deploy/config.json sed -i 's|"rpc_url": ".*"|"rpc_url": "https://base.drpc.org"|' /root/infernet-container-starter/projects/hello-world/container/config.json sed -i "s|\"batch_size\": [0-9]*|\"batch_size\": $BATCH_SIZE|" /root/infernet-container-starter/deploy/config.json sed -i "s|\"sleep\": [0-9]\+\(\.[0-9]\+\)\?|\"sleep\": $SLEEP|" /root/infernet-container-starter/deploy/config.json sed -i "s|\"sleep\": [0-9]\+\(\.[0-9]\+\)\?|\"sleep\": $SLEEP|" /root/infernet-container-starter/projects/hello-world/container/config.json sed -i "s|\"sync_period\": [0-9]\+\(\.[0-9]\+\)\?|\"sync_period\": 30|" /root/infernet-container-starter/deploy/config.json sed -i "s|\"sync_period\": [0-9]\+\(\.[0-9]\+\)\?|\"sync_period\": 30|" /root/infernet-container-starter/projects/hello-world/container/config.json sed -i "s|\"starting_sub_id\": [0-9]\+\(\.[0-9]\+\)\?|\"starting_sub_id\": $START_SUB_ID|" /root/infernet-container-starter/deploy/config.json sed -i "s|\"starting_sub_id\": [0-9]\+\(\.[0-9]\+\)\?|\"starting_sub_id\": $START_SUB_ID|" /root/infernet-container-starter/projects/hello-world/container/config.json # 修改 projects/hello-world/container/config.json sed -i "s|\"batch_size\": [0-9]*|\"batch_size\": $BATCH_SIZE|" /root/infernet-container-starter/projects/hello-world/container/config.json # 修改 Deploy.s.sol sed -i "s|\(RPC_URL\s*=\s*\).*|\1\"$RPC_URL\";|" /root/infernet-container-starter/projects/hello-world/contracts/script/Deploy.s.sol # 使用 latest node 镜像 # 修改 Makefile (sender, RPC_URL) MAKEFILE_PATH="/root/infernet-container-starter/projects/hello-world/contracts/Makefile" sed -i "s|^RPC_URL := .*|RPC_URL := $RPC_URL|" "$MAKEFILE_PATH" # 重启容器 echo echo "docker compose down & up..." docker compose -f deploy/docker-compose.yaml down docker compose -f deploy/docker-compose.yaml up -d echo echo "[提示] 容器正在后台 (-d) 运行。" echo "使用 docker ps 查看状态。日志查看:docker logs infernet-node" # 安装 Forge 库 (解决冲突) echo echo "安装 Forge (项目依赖)" cd ~/infernet-container-starter/projects/hello-world/contracts || exit 1 rm -rf lib/forge-std rm -rf lib/infernet-sdk # 修改:使用 --no-git 替代 --no-commit forge install --no-git foundry-rs/forge-std forge install --no-git ritual-net/infernet-sdk # 重启容器 echo echo "重启 docker compose..." cd ~/infernet-container-starter || exit 1 docker compose -f deploy/docker-compose.yaml down docker compose -f deploy/docker-compose.yaml up -d echo "[提示] 查看 infernet-node 日志:docker logs infernet-node" # 部署项目合约 echo echo "部署项目合约..." DEPLOY_OUTPUT=$(project=hello-world make deploy-contracts 2>&1) echo "$DEPLOY_OUTPUT" # 提取新部署的合约地址(例如:Deployed SaysHello: 0x...) NEW_ADDR=$(echo "$DEPLOY_OUTPUT" | grep -oP 'Deployed SaysHello:\s+\K0x[0-9a-fA-F]{40}') if [ -z "$NEW_ADDR" ]; then echo "[警告] 未找到新合约地址。可能需要手动更新 CallContract.s.sol." else echo "[提示] 部署的 SaysHello 地址: $NEW_ADDR" # 在 CallContract.s.sol 中替换旧地址为新地址 sed -i "s|SaysGM saysGm = SaysGM(0x[0-9a-fA-F]\+);|SaysGM saysGm = SaysGM($NEW_ADDR);|" \ projects/hello-world/contracts/script/CallContract.s.sol # 执行 call-contract echo echo "使用新地址执行 call-contract..." project=hello-world make call-contract echo "拉取diyujiedian" # 下载 diyujiedian.sh 到 /root 目录 wget -O /root/diyujiedian.sh https://raw.githubusercontent.com/sdohuajia/Ritual/refs/heads/main/diyujiedian.sh wget -O /root/anvil.sh https://raw.githubusercontent.com/sdohuajia/Ritual/refs/heads/main/anvil.sh # 赋予执行权限 chmod +x /root/diyujiedian.sh chmod +x /root/anvil.sh if screen -list | grep -q "diyujiedian"; then echo "[提示] 发现 diyujiedian 会话正在运行,正在终止..." screen -S diyujiedian -X quit sleep 1 fi # 运行脚本 screen -S diyujiedian -dm bash -c '/root/diyujiedian.sh; exec bash' fi echo echo "===== Ritual Node 完成=====" # 提示用户按任意键返回主菜单 read -n 1 -s -r -p "按任意键返回主菜单..." main_menu } # 查看 Ritual 节点日志 function view_logs() { echo "正在查看 Ritual 节点日志..." docker logs -f infernet-node } # 删除 Ritual 节点 function remove_ritual_node() { echo "正在删除 Ritual 节点..." # 停止并移除 Docker 容器 echo "停止并移除 Docker 容器..." cd /root/infernet-container-starter docker compose down # 删除仓库文件 echo "删除相关文件..." rm -rf ~/infernet-container-starter # 删除 Docker 镜像 echo "删除 Docker 镜像..." docker rmi ritualnetwork/hello-world-infernet:latest echo "Ritual 节点已成功删除!" } # 调用主菜单函数 main_menu