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带宽