本文详细介绍了如何设置和运行一个Forta扫描节点,包括服务器的购买要求、基本设置、安全保护、组件安装及Forta的初始化和注册步骤。作者还提供了丰富的代码示例和操作步骤,适合对区块链监控网络有兴趣的技术人员。文中也涉及到Erigon节点的设置和监控,内容结构清晰,信息量丰富。
作者: Evgeny Pleskach
MixBytes 的安全研究员
Forta 是一个用于区块链活动的安全与操作监控的实时检测网络。
作为一个去中心化的监控网络,Forta 能够即时检测 DeFi、NFT、治理、桥接和其他 Web3 系统的威胁和异常。它帮助协议和投资者快速应对,以消除威胁并通过及时和相关的警报,防止或最小化资金的损失。
Forta 拥有一个去中心化的扫描节点网络;任何人都可以参与这个网络并运行自己的扫描节点。
在本文中,我们想要描述运行一个扫描节点所需的所有步骤,以及一些安全建议和最佳实践。
官方文档: https://docs.forta.network/en/latest/scanner-quickstart/
根据文档,要求如下:
你可以选择任何云服务,例如,选择了具有以下参数的 DigitalOcean:
用户设置
## 以 root 用户登录并创建一个新用户
adduser bastion
passwd bastion
## 在系统上安装编辑器
apt install mc nano -y
## 授予用户 root 权限,向文件中添加一行
## 通过 mcedit 打开 /etc/sudoers
mcedit /etc/sudoers
## 向文件中添加这一行并关闭文件
bastion ALL=(ALL:ALL) NOPASSWD:ALL
## 切换到用户
su - bastion
## 创建目录和文件以存储
mkdir .ssh && nano .ssh/authorized_keys
## 这里应该放置一个公开的 ssh 密钥
## 更改目录和文件的权限
chown -R bastion:bastion /home/bastion/.ssh/ && chmod 700 /home/bastion/.ssh/ && chmod 600 /home/bastion/.ssh/authorized_keys
## 远程禁用 root 用户
sudo mcedit /etc/ssh/sshd_config
## 在文件 /etc/ssh/sshd_config 中添加一行
PermitRooLogin no
## 重启 ssh 服务
sudo systemctl restart sshd
在上一步中,我们远程禁用了 root 用户,并且需要配置防火墙以访问 22 端口上的服务器。
以下是在 DigitalOcean 云中采取措施的示例步骤:
1. 去管理面板: https://cloud.digitalocean.com/ 2. 查找你的服务器并进入其设置。
3. 找到防火墙部分并进入(默认没有防火墙,你需要创建它并将其添加到所需服务器)。
4. 更改规则。
4.1. 我们建议允许所有端口访问管理 IP 地址,并禁止除了用于 Forta 操作的端口以外的所有端口。
5. 添加服务器,等待规则应用。
为了在警报中生成正确的时间戳并避免在发布警报时出现授权问题,你必须始终确保系统时间是正确的。如果系统时间不正确,你的节点将无法发布警报,可能因此而无法获得奖励。
我们建议使用 systemd-timesyncd,它广泛可用并且作为时间同步守护程序足够。启用后,它会定期在后台同步系统时间。
要启用 systemd-timesyncd 并检查结果,你可以按如下方式操作:
$ sudo systemctl enable systemd-timesyncd
$ sudo systemctl start systemd-timesyncd
$ timedatectl status
本地时间: Tue 2022-01-01 17:00:00 -03
协调世界时: Tue 2022-01-01 20:00:00 UTC
RTC 时间: Tue 2022-01-01 20:00:00
时区: America/Argentina/Buenos_Aires (-03, -0300)
系统钟同步: 是
NTP 服务: 活动 <------------------- (工作正常)
RTC 在本地时区: 否
官方指南: https://docs.docker.com/engine/install/
我们必须添加网络参数以便 Docker 工作。
在你的 /etc/docker 目录中添加一个名为 daemon.json 的文件,以下内容:
{
"default-address-pools": [\
{\
"base":"172.17.0.0/12",\
"size":16\
},\
{\
"base":"192.168.0.0/16",\
"size":20\
},\
{\
"base":"10.99.0.0/16",\
"size":24\
}\
]
}
要应用更改,我们必须运行:
systemctl restart docker
Forta 扫描节点软件适用于流行的 64 位 Linux 发行版,使用官方的 Forta 仓库。包安装方法是可验证的(在安装期间自动验证)并帮助你安装所需的依赖项。
$ sudo curl https://dist.forta.network/pgp.public -o /usr/share/keyrings/forta-keyring.asc -s
$ echo 'deb [signed-by=/usr/share/keyrings/forta-keyring.asc] https://dist.forta.network/repositories/apt stable main' | sudo tee -a /etc/apt/sources.list.d/forta.list
$ sudo apt-get update
$ sudo apt-get install forta
初始化创建一个将签署你的扫描节点警报的私钥。你必须设置 FORTA_PASSPHRASE 环境变量或向 init 命令提供 --passphrase 标志。
使用 forta init 命令初始化 Forta:
$ forta init --passphrase <your_passphrase>
此命令生成一个配置目录,一个私钥,并输出你的地址。
示例输出:
Scanner address: 0xAAA8C491232cB65a65FBf7F36b71220B3E695AAA
成功初始化于 /yourname/.forta
如果 Forta 停止运行,它必须被重启。如果你使用了包安装方法,则可以启用 Forta systemd 服务,并用你的密码短语和配置目录环境变量覆盖它。
请不要修改原始的 forta.service 文件,而是 prefer 希望的这里推荐的覆盖。这是因为原始文件会在你通过 yum 或 apt 更新 Forta 时被替换。
要覆盖 systemd 服务环境,你可以在 /etc/systemd/system/forta.service.d/env.conf 中设置变量,如下所示:
[Service]
Environment="FORTA_DIR=<your_forta_config_dir>"
Environment="FORTA_PASSPHRASE=<your_forta_passphrase>"
编辑配置
mcedit .forta/config.yml
chainId: 1
scan:
jsonRpc:
# 你可以在下面阅读有关设置自己的 erigon 节点的更多信息
url: http://your-node-erigon:8545
trace:
jsonRpc:
url: http://your-node-erigon:8545
## 默认使用扫描节点 URL,因为未设置 - 在运行节点时的最佳选项
## jsonRpcProxy:
## jsonRpc:
## url: http://your-node-erigon:8545
然后你需要将进程添加到自动加载和服务启动。
sudo systemctl daemon-reload
sudo systemctl enable forta
sudo systemctl start forta
forta status
docker ps
示例输出
root@forta-prod:~# forta status
forta.container.forta-inspector.summary
⬤ ok
forta.container.forta-json-rpc.summary
⬤ ok
forta.container.forta-scanner.summary
⬤ ok: at block 15933557.
forta.container.forta-supervisor.summary
⬤ ok: all 6 service containers are running.
forta.container.forta-updater.summary
⬤ ok
你可以用下面的命令找到你的扫描节点地址
forta account address
你的扫描节点有一个以太坊地址,这使两个主要功能成为可能:
虽然这个地址作为主身份,但必须由不同的钱包拥有。注册后,扫描节点作为 NFT(ERC721)铸造并转移给这个拥有者。你可以在这里查看智能合约文档:
https://docs.forta.network/en/latest/smart-contracts/
未来,拥有者钱包将允许你远程禁用扫描节点,并在你进行维护(短暂时间内)或在你决定完全关闭节点时避免削减。目前,你可以使用 forta disable 和 forta enable 命令,使用扫描节点私钥进行相同操作。
要将你的节点注册到注册合约,你可以运行
forta register --owner-address <address>
在执行此操作之前,请确保你已在 config.yml 中正确设置了 chainId。你的扫描节点只能注册一次,并且只能扫描特定链。拥有者钱包地址需要与你的扫描节点地址不同。
有关质押,你可以在这里阅读: https://docs.forta.network/en/latest/stake-on-scan-node/
检查 forta 工作情况:
https://api.forta.network/stats/sla/scanner/YOUR_NODE_ADDRESS
https://github.com/ledgerwatch/erigon#system-requirements
我们建议以相同的方式购买满足要求的服务器,在任何云服务中。
例如,在 hetzner:
类似于 Forta 的文章:Forta 的基本服务器设置
Erigon 的基本服务器保护
类似于 Forta 的文章:Forta 的基本服务器保护
设置 Erigon 的工作组件
apt install git make supervisor build-essential software-properties-common
## 安装 prysm
mkdir ethereum
cd ethereum/
mkdir consensus
cd consensus/
mkdir prysm
cd prysm/
curl https://raw.githubusercontent.com/prysmaticlabs/prysm/master/prysm.sh --output prysm.sh && chmod +x prysm.sh
mcedit /root/.bashrc
## 添加一行,强制指示 prysm 版本并关闭文件
export USE_PRYSM_VERSION=v3.1.1
## 生成 JWT Token
cd ethereum/consensus/prysm/
./prysm.sh beacon-chain generate-auth-secret
## 创建一个清单以启动 prysm
cd /etc/supervisor/conf.d/
mcedit prysm.conf
## 添加到 prysm.conf 文件
---
[program:beacon_eth]
command=/root/ethereum/consensus/prysm/prysm.sh beacon-chain --execution-endpoint=http://localhost:8551 --jwt-secret=/root/ethereum/consensus/prysm/jwt.hex --verbosity=debug
user=root
numprocs=1
autostart=true
autorestart=true
stderr_logfile=/var/log/prysm.log
---
## 关闭文件并调用下一个命令
systemctl restart supervisor
## 检查服务是否已启动
supervisorctl
## 命令输出的示例
supervisorctl
beacon_eth 运行中 pid 383637, uptime 30 days, 5:52:02
supervisor>
Go 安装按照文档进行: https://go.dev/doc/install
设置服务器时间:
systemctl enable systemd-timesyncd
sudo systemctl start systemd-timesyncd
timedatectl status
git clone --recurse-submodules https://github.com/ledgerwatch/erigon.git
cd erigon
git checkout alpha
make erigon
make rpcdaemon
设置服务:
## 创建服务
mcedit /etc/systemd/system/erigon.service
---
[Unit]
Description=Erigon Node
After=network.target network-online.target
Wants=network-online.target
[Service]
WorkingDirectory=/root/erigon/
ExecStart=/root/erigon/build/bin/erigon --datadir=/erigon --private.api.addr=localhost:9090 --metrics --metrics.addr=localhost --metrics.port=6060 --http=false --authrpc.jwtsecret /root/ethereum/consensus/prysm/jwt.hex
User=root
Restart=always
RestartSec=5s
## 输出到 syslog
StandardOutput=syslog
StandardError=syslog
## 更改找到应用日志在 /var/log/syslog
SyslogIdentifier=erigon
[Install]
WantedBy=multi-user.target
---
## 创建第二个服务
mcedit /etc/systemd/system/erigon-rpc.service
---
[Unit]
Description=Erigon RPC Daemon
[Service]
WorkingDirectory=/root/erigon/
ExecStart=/root/erigon/build/bin/rpcdaemon --datadir=/erigon --private.api.addr=localhost:9090 --http.vhosts '*' --http.port 8545 --http.addr 0.0.0.0 --http.corsdomain '*' --http.api=eth,erigon,web3,net,debug,trace
User=root
Restart=always
RestartSec=5s
## 输出到 syslog
StandardOutput=syslog
StandardError=syslog
## 更改找到应用日志在 /var/log/syslog
SyslogIdentifier=erigon-rpc
[Install]
WantedBy=multi-user.target
---
sudo systemctl daemon-reload
sudo systemctl enable erigon
sudo systemctl enable erigon-rpc
sudo systemctl start erigon
sudo systemctl start erigon-rpc
curl http://localhost:3500/eth/v1/node/syncing
## 如何检查日志
journalctl -f -u erigon
journalctl -f -u erigon-rpc
tail -f /var/log/prysm.log
Forta/Erigon 的服务器监控
我们建议在两台不同的服务器上运行。
在服务器上安装 prometheus:
mkdir -p /etc/prometheus
sudo mkdir -p /var/lib/prometheus
## 下载 prometheus 压缩包
wget https://github.com/prometheus/prometheus/releases/download/v2.31.0/prometheus-2.31.0.linux-amd64.tar.gz
## 解压缩压缩包
tar -xvf prometheus-2.31.0.linux-amd64.tar.gz
## 将二进制文件移动到系统目录
cd prometheus-2.31.0.linux-amd64/
sudo mv prometheus promtool /usr/local/bin/
sudo mv consoles/ console_libraries/ /etc/prometheus/
sudo mv prometheus.yml /etc/prometheus/prometheus.yml
## promisue 版本检查
prometheus --version
## 创建 prometheus 服务
sudo groupadd --system prometheus
sudo useradd -s /sbin/nologin --system -g prometheus prometheus
sudo chown -R prometheus:prometheus /etc/prometheus/ /var/lib/prometheus/
sudo chmod -R 775 /etc/prometheus/ /var/lib/prometheus/
## 创建服务
mcedit /etc/systemd/system/prometheus.service
----
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Group=prometheus
Restart=always
Type=simple
ExecStart=/usr/local/bin/prometheus \
--config.file=/etc/prometheus/prometheus.yml \
--storage.tsdb.path=/var/lib/prometheus/ \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries \
--web.listen-address=0.0.0.0:9090
[Install]
WantedBy=multi-user.target
----
## 启动服务,添加到启动,检查服务状态
sudo systemctl start prometheus
sudo systemctl enable prometheus
sudo systemctl status prometheus
## 在浏览器中检查可用性
http://IP:9090
## 向配置文件添加参数
mcedit /etc/prometheus/prometheus.yml
## 添加到 targets(本地节点导出器)
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
- job_name: 'servers'
static_configs:
- targets: ['127.0.0.1:9100']
sudo systemctl restart prometheus
## 下载依赖项
sudo apt-get install -y gnupg2 curl software-properties-common
## 安装 Grafana
curl https://packages.grafana.com/gpg.key | sudo apt-key add -
sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"
apt-get -y install grafana
## 添加到启动并检查服务状态
systemctl enable --now grafana-server
systemctl status grafana-server.service
## 在浏览器中检查可用性
http://IP:3000
## 默认授权为 admin/admin
添加 Prometheus 数据源 http://localhost:9090
## 导入 ID=10180 的仪表板
在本地安装节点导出器
## 创建用户以运行服务
useradd --no-create-home --shell /bin/false node_exporter
## 下载压缩包以进行后续工作
wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz
## 解压缩压缩包
tar xvf node_exporter-1.3.1.linux-amd64.tar.gz
## 复制二进制文件到系统中,赋予必要权限
cp node_exporter-1.3.1.linux-amd64/node_exporter /usr/local/bin
chown node_exporter:node_exporter /usr/local/bin/node_exporter
mkdir -p /prometheus/metrics
chown node_exporter:node_exporter /prometheus/metrics
## 创建服务
mcedit /lib/systemd/system/node_exporter.service
---
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=node_exporter
Group=node_exporter
ExecStart=/usr/local/bin/node_exporter --collector.textfile.directory=/prometheus/metrics --web.listen-address=0.0.0.0:9100
Restart=always
RestartSec=10s
NotifyAccess=all
[Install]
WantedBy=multi-user.target
---
systemctl enable node_exporter
systemctl start node_exporter
systemctl status node_exporter
## 在浏览器中检查可用性
http://IP:9100
## 添加到文件 /etc/prometheus/prometheus.yml
mcedit /etc/prometheus/prometheus.yml
- job_name: erigon
metrics_path: /debug/metrics/prometheus
static_configs:
- targets:
- "127.0.0.1:6060"
将仪表板导入 Grafana:
下载 https://github.com/ledgerwatch/erigon/blob/devel/cmd/prometheus/dashboards/erigon.json 并设置下载的文件。
MixBytes 是一个由专家组成的区块链审计和安全研究团队,专门为 EVM 兼容和 Substrate 基于项目提供全面的智能合约审计和技术咨询服务。请在 X 上关注我们,以便随时了解行业最新趋势和洞察。
- 原文链接: mixbytes.io/blog/how-to-...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!