Aztec全节点RPC Geth+prysm

Geth+prysm实现RPC自由,

前置条件:

  • 服务器要求,根据节点的多少 10个节点以内 4核8G 1TB硬盘(也可以700GB)10M带宽,
    50节点大约需要 8核32GB 40M带宽
  • 节点与RPC服务器同在一个地区 实现内网访问 仅需要10M带宽 内网带宽为1-2GB, 8核64GB理论上可以500节点以上
腾讯CVM价格

新加坡为例

配置4核8G

¥

619.9

/月

  • 4vcpu 8GB内存 324.8 元/月
  • 1000GB硬盘 ¥350.00元/月
  • 10M带宽 565.00元/月

8核32GB

¥

2294.5

/月

  • 8vcpu 32GB内存 974.4 元/月
  • 1000GB硬盘 ¥350.00元/月
  • 40M带宽 3265.00元/月

8核64GB

¥

1245.1

/月

  • 8vcpu 64GB内存 1575.2 元/月
  • 1000GB硬盘 ¥350.00元/月
  • 10M带宽 565.00元/月
脚本如下,基于腾讯云ubuntu24.04 

#!/bin/bash
# 检查是否以root用户运行脚本
if [ "$(id -u)" != "0" ]; then
    echo "此脚本需要以root用户权限运行。"
    echo "请尝试使用 'sudo -i' 命令切换到root用户,然后再次运行此脚本。"
    exit 1
fi

# 设置日志颜色
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

log_step() {
    echo -e "${BLUE}[STEP]${NC} $1"
}

# 检查命令是否执行成功
check_command() {
    if [ $? -ne 0 ]; then
        log_error "$1失败,退出安装"
        exit 1
    else
        log_info "$1成功"
    fi
}

# 创建数据目录
ETH_DATA_DIR="/home/ubuntu/ethereum"
GETH_DATA_DIR="${ETH_DATA_DIR}/geth"
PRYSM_DATA_DIR="${ETH_DATA_DIR}/prysm"

# 设置数据目录
setup_data_directories() {
    log_step "设置数据目录"
    
    # 创建数据目录
    mkdir -p $GETH_DATA_DIR $PRYSM_DATA_DIR
    check_command "创建数据目录"
    
    # 设置权限
    chown -R ubuntu:ubuntu $ETH_DATA_DIR
    check_command "设置目录权限"
}

# 安装依赖
install_dependencies() {
    log_step "更新系统并安装依赖"
    apt update && apt upgrade -y
    check_command "系统更新"
    
    apt install -y curl iptables build-essential git wget lz4 jq make gcc nano automake autoconf tmux htop nvme-cli libgbm1 pkg-config libssl-dev libleveldb-dev tar clang bsdmainutils ncdu unzip libleveldb-dev
    check_command "安装基础依赖"
}

# 安装Go (Geth和Prysm的构建需要)
install_go() {
    log_step "安装Go语言环境"
    if command -v go &>/dev/null; then
        GO_VERSION=$(go version | awk '{print $3}')
        log_info "Go已安装,版本: $GO_VERSION"
    else
        wget -q https://go.dev/dl/go1.22.1.linux-amd64.tar.gz -P /tmp/
        check_command "下载Go"
        
        tar -C /usr/local -xzf /tmp/go1.22.1.linux-amd64.tar.gz
        check_command "解压Go"
        
        echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> /etc/profile
        source /etc/profile
        check_command "配置Go环境变量"
        
        log_info "Go安装完成,版本: $(go version)"
    fi
}

# 安装Geth (执行层)
install_geth() {
    log_step "安装Geth (执行层)"
    
    # 添加以太坊PPA
    add-apt-repository -y ppa:ethereum/ethereum
    check_command "添加以太坊PPA"
    
    apt update
    apt install -y ethereum
    check_command "安装Geth"
    
    # 验证安装
    GETH_VERSION=$(geth version | head -n 1)
    log_info "Geth安装完成,版本: $GETH_VERSION"
}

# 安装Prysm (共识层)
install_prysm() {
    log_step "安装Prysm (共识层)"
    
    # 创建安装目录
    mkdir -p /home/ubuntu/prysm
    chown ubuntu:ubuntu /home/ubuntu/prysm
    chmod 755 /home/ubuntu/prysm
    cd /home/ubuntu/prysm
    
    # 下载Prysm二进制文件
    curl -LO https://github.com/prysmaticlabs/prysm/releases/download/v6.0.2/beacon-chain-v6.0.2-linux-amd64
    curl -LO https://github.com/prysmaticlabs/prysm/releases/download/v6.0.2/validator-v6.0.2-linux-amd64
    check_command "下载Prysm二进制文件"
    
    # 设置执行权限和所有权
    chmod +x beacon-chain-v6.0.2-linux-amd64 validator-v6.0.2-linux-amd64
    chown ubuntu:ubuntu beacon-chain-v6.0.2-linux-amd64 validator-v6.0.2-linux-amd64
    check_command "设置Prysm执行权限和所有权"
    
    # 创建符号链接
    ln -sf /home/ubuntu/prysm/beacon-chain-v6.0.2-linux-amd64 /usr/local/bin/beacon-chain
    ln -sf /home/ubuntu/prysm/validator-v6.0.2-linux-amd64 /usr/local/bin/validator
    check_command "创建Prysm符号链接"
    
    # 验证安装
    PRYSM_VERSION=$(beacon-chain --version | head -n 1)
    log_info "Prysm安装完成,版本: $PRYSM_VERSION"
}

# 配置Geth服务
configure_geth_service() {
    log_step "配置Geth服务"
    
    # 确保Geth数据目录结构完整
    mkdir -p $GETH_DATA_DIR/geth/chaindata
    mkdir -p $GETH_DATA_DIR/geth/lightchaindata
    mkdir -p $GETH_DATA_DIR/geth/nodes
    
    # 设置正确的目录权限
    chown -R ubuntu:ubuntu $GETH_DATA_DIR
    chmod -R 755 $GETH_DATA_DIR
    
    # 创建systemd服务文件
    cat > /etc/systemd/system/geth.service << EOF
[Unit]
Description=Ethereum Go Client (Geth)
After=network.target
Wants=network.target

[Service]
User=ubuntu
Group=ubuntu
Type=simple
Restart=always
RestartSec=5
ExecStart=/usr/bin/geth \
  --mainnet \
  --datadir $GETH_DATA_DIR \
  --http \
  --http.addr 0.0.0.0 \
  --http.port 8545 \
  --http.api eth,net,web3,txpool \
  --http.corsdomain "*" \
  --ws \
  --ws.addr 0.0.0.0 \
  --ws.port 8546 \
  --ws.api eth,net,web3,txpool \
  --ws.origins "*" \
  --syncmode snap \
  --authrpc.addr 0.0.0.0 \
  --authrpc.port 8551 \
  --authrpc.vhosts "*" \
  --authrpc.jwtsecret $GETH_DATA_DIR/geth/jwtsecret

[Install]
WantedBy=default.target
EOF
    
    # 重新加载systemd配置
    systemctl daemon-reload
    check_command "创建Geth服务"
}

# 配置Prysm Beacon Chain服务
configure_prysm_beacon_service() {
    log_step "配置Prysm Beacon Chain服务"
    
    # 创建systemd服务文件
    cat > /etc/systemd/system/prysm-beacon.service << EOF
[Unit]
Description=Prysm Ethereum Consensus Client Beacon Chain
Wants=network-online.target
After=network-online.target

[Service]
User=ubuntu
Group=ubuntu
Type=simple
Restart=always
RestartSec=5
ExecStart=/usr/local/bin/beacon-chain \
  --mainnet \
  --datadir=$PRYSM_DATA_DIR \
  --execution-endpoint=http://localhost:8551 \
  --jwt-secret=$GETH_DATA_DIR/geth/jwtsecret \
  --accept-terms-of-use \
  --checkpoint-sync-url=https://beaconstate.ethstaker.cc \
  --genesis-beacon-api-url=https://beaconstate.ethstaker.cc \
  --grpc-gateway-host=0.0.0.0 \
  --grpc-gateway-port=3500 \
  --monitoring-host=0.0.0.0 \
  --p2p-host-ip=$(curl -s https://ipinfo.io/ip) \
  --p2p-tcp-port=13000 \
  --p2p-udp-port=12000

[Install]
WantedBy=multi-user.target
EOF
    
    # 重新加载systemd配置
    systemctl daemon-reload
    check_command "创建Prysm Beacon Chain服务"
}

# 配置防火墙
configure_firewall() {
    log_step "配置防火墙"
    
    # 启用UFW(非交互式)
    echo "y" | ufw enable
    
    # 允许SSH连接
    ufw allow 22/tcp
    
    # Geth P2P端口
    ufw allow 30303/tcp
    ufw allow 30303/udp
    
    # Prysm P2P端口
    ufw allow 13000/tcp
    ufw allow 12000/udp
    
    # Geth HTTP和WebSocket API (可选,仅在需要外部访问时开放)
    ufw allow 8545/tcp
    ufw allow 8546/tcp
    
    # Prysm API (可选,仅在需要外部访问时开放)
    ufw allow 3500/tcp
    
    # 重新加载防火墙规则
    ufw reload
    check_command "配置防火墙"
    
    log_warn "注意:已开放API端口(8545, 8546, 3500)供外网访问。在生产环境中,建议限制这些端口只允许特定IP访问。"
}

# 生成JWT密钥
generate_jwt_secret() {
    log_step "生成JWT密钥"
    
    # 确保目录存在
    mkdir -p $GETH_DATA_DIR/geth
    
    # 设置目录权限
    chown -R ubuntu:ubuntu $GETH_DATA_DIR
    chmod 755 $GETH_DATA_DIR
    chmod 755 $GETH_DATA_DIR/geth
    check_command "设置Geth目录权限"
    
    # 生成随机32字节的JWT密钥
    openssl rand -hex 32 | tr -d "\n" > $GETH_DATA_DIR/geth/jwtsecret
    check_command "生成JWT密钥"
    
    # 设置权限
    chown ubuntu:ubuntu $GETH_DATA_DIR/geth/jwtsecret
    chmod 600 $GETH_DATA_DIR/geth/jwtsecret
    check_command "设置JWT密钥权限"
}

# 启动服务
start_services() {
    log_step "启动以太坊节点服务"
    
    # 再次确保数据目录权限正确
    log_info "确保数据目录权限正确..."
    chown -R ubuntu:ubuntu $ETH_DATA_DIR
    chmod -R 755 $ETH_DATA_DIR
    chmod 755 $GETH_DATA_DIR/geth
    
    # 确保JWT密钥权限正确
    if [ -f "$GETH_DATA_DIR/geth/jwtsecret" ]; then
        chown ubuntu:ubuntu $GETH_DATA_DIR/geth/jwtsecret
        chmod 600 $GETH_DATA_DIR/geth/jwtsecret
        log_info "JWT密钥权限设置正确"    
    else
        log_error "JWT密钥文件不存在,请先运行generate_jwt_secret函数"
        exit 1
    fi
    
    # 启动Geth
    systemctl enable geth
    systemctl start geth
    check_command "启动Geth服务"
    
    # 等待Geth初始化
    log_info "等待Geth初始化 (10秒)..."
    sleep 10
    
    # 启动Prysm Beacon Chain
    systemctl enable prysm-beacon
    systemctl start prysm-beacon
    check_command "启动Prysm Beacon Chain服务"
}

# 显示节点状态
show_node_status() {
    log_step "以太坊节点状态"
    
    # 检查服务状态
    echo -e "Geth服务状态:"
    systemctl status geth --no-pager
    
    echo -e "\nPrysm Beacon Chain服务状态:"
    systemctl status prysm-beacon --no-pager
    
    # 显示同步状态
    echo -e "\n执行层(Geth)同步状态:"
    curl -s -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}' http://localhost:8545
    
    echo -e "\n共识层(Prysm)同步状态:"
    curl -s http://localhost:3500/eth/v1/node/syncing | jq
    
    # 显示节点信息
    echo -e "\n节点外部访问信息:"
    EXTERNAL_IP=$(curl -s https://ipinfo.io/ip)
    echo "外部IP地址: $EXTERNAL_IP"
    echo "l1-rpc-urls: http://$EXTERNAL_IP:8545"
    echo "l1-consensus-host-urls: http://$EXTERNAL_IP:3500"

   # 显示内网访问信息
    echo -e "\n节点内网访问信息:"
    # 获取第一个非127.0.0.1的内网IP地址
    INTERNAL_IP=$(ip -4 addr | grep -v '127.0.0.1' | grep -o 'inet [0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' | head -1 | awk '{print $2}')
    echo "内网IP地址: $INTERNAL_IP"
    echo "l1-rpc-urls: http://$INTERNAL_IP:8545"
    echo "l1-consensus-host-urls: http://$INTERNAL_IP:3500"
    
    # 检查服务是否正常运行
    if ! systemctl is-active --quiet geth; then
        log_warn "Geth服务未正常运行,请检查日志: journalctl -u geth -f"
    fi
    
    if ! systemctl is-active --quiet prysm-beacon; then
        log_warn "Prysm Beacon Chain服务未正常运行,请检查日志: journalctl -u prysm-beacon -f"
    fi
}

# 主函数
main() {
    log_step "开始安装以太坊全节点 (Geth + Prysm)"
    
    # 安装步骤
    install_dependencies
    install_go
    setup_data_directories
    install_geth
    install_prysm
    generate_jwt_secret
    configure_geth_service
    configure_prysm_beacon_service
    configure_firewall
    # 确保JWT密钥存在且权限正确
    if [ ! -f "$GETH_DATA_DIR/geth/jwtsecret" ]; then
        log_error "JWT密钥文件不存在,重新生成"
        generate_jwt_secret
    fi
    start_services
    
    # 显示节点状态
    show_node_status
    
    log_info "以太坊全节点安装完成!"
    log_info "可以使用以下命令查看日志:"
    log_info "  - Geth日志: journalctl -u geth -f"
    log_info "  - Prysm Beacon Chain日志: journalctl -u prysm-beacon -f"
}

# 执行主函数
main

同步时间约24小时 根据网络情况,

# 停止Geth服务(执行层)
systemctl stop geth

# 停止Prysm Beacon Chain服务(共识层)
systemctl stop prysm-beacon

# 禁用Geth服务
systemctl disable geth

# 禁用Prysm Beacon Chain服务
systemctl disable prysm-beacon

Aztec节点,最低要求 2核 8GB 100GB 1M带宽