从源代码或 Docker 运行公共全节点(PFN)
您可以运行自己的公共全节点(PFN)以同步 Aptos 区块链的状态并保持为最新状态。PFN 通过与其他 Aptos VFN 和 PFN 同步来复制整个区块链的状态。任何人都可以运行 PFN。本教程解释了如何部署 PFN 并连接到 Aptos 网络。
我必须运行PFN吗?
如果您不想运行 PFN,但仍想与 Aptos 区块链交互,您可以使用 Aptos Labs 提供的 REST API(见Aptos API)。但请注意,Aptos Labs 提供的 PFN 有速率限制,这可能会妨碍您的开发。如果您想避免这样的速率限制,您可以部署自己的 PFN 并与 Aptos 区块链直接同步。
硬件要求
对于运行生产级的 PFN,我们建议您的硬件与验证器或 VFN 的配置相同。您可以在这里查看这些节点的硬件要求:验证器和 VFN 的硬件要求。
如果您只想为开发或测试运行 PFN,可以使用较低的硬件规格。但是,它不应该在生产环境使用。例如:
- CPU: 8 核,16 线程(Intel Xeon Skylake 或更新版本)。
- 内存: 32GB RAM。
最低硬件要求
如果您的 PFN 没有达到生产环境所必需的最低硬件标准,那么在面对高负荷工作时,PFN 很可能会出现运行缓慢和稳定性方面的问题。
网络要求和端口
运行 PFN 的时候,您必须开放节点的网络端口,这样其他节点(对等节点,Peers)才可以连接到您的节点。Aptos 网络有多种类型,每种类型都使用不同的端口。不过,PFN 使用的是公共网络类型,使得各个 PFN 与 VFN(验证器全节点)之间能够互相连接。
您可以配置 PFN,以便公共网络能在您的节点上使用特定的端口。您可以使用节点配置 YAML 文件配置端口设置。这里是一个 PFN 的示例配置文件,配置公共网络时,使用的端口是 6180
。
端口设置
以下建议是基于 PFN (公共全节点)使用默认端口设置的前提提出的。如果您已经在配置文件中修改了默认的端口设置,那么你需要根据实际情况来适当调整这些建议中的描述,以使其适用于您的配置。
暴露端口
除特别指明的情况外,我们建议您在运行 PFN(公共全节点)时,不要开放任何非必需的其他网络端口。这样做的原因是,额外开放的端口可能会增大您节点的面临的风险,从而让节点更容易受到潜在风险引起的攻击。
运行 PFN:
假设使用了默认端口,以下是 PFN 应配置的:
- 打开以下 TCP 端口:
6182
– 公共网络:打开此端口,并公开以允许其他 PFN 连接到您的 PFN。
- 关闭以下 TCP 端口:
9101
– 检查服务:关闭此端口以防止未经授权的指标检查。9102
– 管理服务:关闭此端口以防止未经授权的管理服务交互。80/8080
REST API:关闭此端口以防止未经授权的 REST API 访问。
暴露服务
请注意,对于您的内部网络而言,如应用开发和调试,检查服务端口(9101)、管理服务端口(9102)以及 REST API 端口(80 或 8080)可能会很有帮助。然而,检查服务端口和管理服务端口绝对不能公开到外网,因为很容易被滥用。同样地,如果您决定将 REST API 端点公开到外网,您应当部署额外的安全措施,比如认证机制或流量限制,以避免被滥用。
默认网络设置
您可能还需要在 fullnode.yaml
配置文件中,把 listen_address
和 API 列表的 address
字段的值从 127.0.0.1 修改为 0.0.0.0。
存储要求
Aptos 存储的数据总量由两大部分组成:区块链的账本历史长度以及链上状态的数量,后者包括账户和资源等信息。这两部分的规模受到多个因素的影响,其中包括区块链的使用时间、交易频率的平均水平,以及账本数据裁剪器的具体配置。
请注意,由于存档节点负责保存区块链的全部历史记录,这意味着存档节点的数据库大小会持续不断地增长。因此,对于存档节点的存储容量大小,我们无法给出一个固定的推荐值。
Devnet 区块链存储
Aptos devnet 目前每周重置一次。如果您正在部署 devnet PFN,这意味着存储每周都会重置(即,清除)。请参阅 Aptos Discord 上的 #devnet-release
频道。
部署 PFN
您可以通过以下两种方式之一部署 PFN:(1) 构建并运行 aptos-core 源代码;或 (2) 使用 Docker。本文档描述了如何使用这两种方法部署您的 PFN。
方法 1: 从源代码构建并运行
首先,请参阅从源代码构建 Aptos 了解如何下载 aptos-core
仓库并构建二进制文件。
然后,按照以下步骤操作:
-
确保您当前的工作目录是
aptos-core
。 -
使用
git checkout --track origin/mainnet
切换到mainnet
分支;记住,如果您希望在不同的网络中运行您的 PFN,您也可以使用devnet
或testnet
。 -
接下来,为您的 PFN 将要连接的网络下载
genesis.blob
和waypoint.txt
文件:-
运行此命令下载创世区块(对于主网):
Terminalcurl -O https://raw.githubusercontent.com/aptos-labs/aptos-networks/main/mainnet/genesis.blob
-
运行此命令下载路标文件(对于主网):
Terminalcurl -O https://raw.githubusercontent.com/aptos-labs/aptos-networks/main/mainnet/waypoint.txt
⚠️不想连接到主网?
如果您想连接到其他的网络,如开发网(devnet)和测试网(testnet),您可以通过这个链接找到它们的genesis.blob
(创世区块)和waypoint.txt
(路标文件):https://github.com/aptos-labs/aptos-networks 。记得为这些网络分别下载genesis.blob
和waypoint.txt
文件,而不是直接使用前面提到的curl
命令中的链接地址。 -
-
接下来,运行下面的命令创建 PFN 配置 YAML 模板的副本:
Terminalcp config/src/config/test_data/public_full_node.yaml fullnode.yaml
-
最后,编辑
fullnode.yaml
配置文件以确保您的 PFN:(1) 包含您刚刚下载的创世区块和路标文件;(2) 将同步的区块链数据保存到您选择的位置(在您的本地机器上)。为此:-
通过编辑
fullnode.yaml
配置中的execution.genesis_file_location
来指定您刚刚下载的genesis.blob
的正确路径。默认情况下,它指向当前工作目录中的genesis.blob
。fullnode.yamlexecution: genesis_file_location: "./genesis.blob"
-
通过编辑
fullnode.yaml
配置中的base.waypoint.from_file
来指定您刚刚下载的waypoint.txt
的正确路径。默认情况下,它指向当前工作目录中的waypoint.txt
。例如:fullnode.yamlbase: waypoint: from_file: "./waypoint.txt"
-
通过编辑
fullnode.yaml
配置中的base.data_dir
来指定您希望在本地机器上存储区块链数据库的目录。例如,您可以在您的主目录中创建一个目录my-full-node/data
并指定它为:fullnode.yamlbase: data_dir: "</path/to/my/homedir/my-full-node/data>"
-
-
通过运行以下命令启动您的本地公共全节点:
cargo run -p aptos-node --release -- -f ./fullnode.yaml
您现在已经成功配置并开始在 Aptos 主网上运行 PFN。
调试?
上面的命令将在:aptos-core/target/release/aptos-node
构建 aptos-node
的二进制发行文件。二进制发行文件通常比二进制调试文件快得多,但缺乏对开发有用的调试信息。要构建二进制调试文件,请从上面的命令中省略 --release
标志。
方法 2: 使用 Docker
本节描述了如何使用 Docker 配置和运行您的 PFN。
仅支持 x86-64 CPU
目前,仅支持 x86-64 CPU 通过 Docker 运行 aptos-core。如果您有 Apple M1/M2(ARM64)Mac,请使用上面介绍的 aptos-core 源代码编译的方法。如果对 M1 / M2 的支持对您很重要,请在此问题下发表您的讨论:https://github.com/aptos-labs/aptos-core/issues/1412
- 首先,安装 Docker。
- 接下来,执行下面的脚本,以便为主网配置您的本地环境和准备数据存储目录。这一过程将下载
fullnode.yaml
配置文件、您的公开全节点(PFN)的genesis.blob
和waypoint.txt
文件,并且会创建一个用于保存主网区块链数据的目录:
mkdir mainnet && cd mainnet
mkdir data && \
curl -O https://raw.githubusercontent.com/aptos-labs/aptos-core/mainnet/docker/compose/aptos-node/fullnode.yaml && \
curl -O https://raw.githubusercontent.com/aptos-labs/aptos-networks/main/mainnet/waypoint.txt && \
curl -O https://raw.githubusercontent.com/aptos-labs/aptos-networks/main/mainnet/genesis.blob
不想连接到主网?
要连接到其他网络(例如 devnet
和 testnet
),您可以在此处找到创世区块和路标文件 ➜ https://github.com/aptos-labs/aptos-networks 。
请确保下载这些网络的 genesis.blob
和 waypoint.txt
,而不是使用上面 curl
命令下载创世区块和路标文件。
- 接下来,确保您上面下载的
fullnode.yaml
配置文件只包含以下内容。 这将确保此配置是用于 PFN 而不是其他节点类型(例如,验证器或 VFN):
base:
role: "full_node"
data_dir: "/opt/aptos/data"
waypoint:
from_file: "/opt/aptos/etc/waypoint.txt"
execution:
genesis_file_location: "/opt/aptos/etc/genesis.blob"
full_node_networks:
- network_id: "public"
discovery_method: "onchain"
listen_address: "/ip4/0.0.0.0/tcp/6182"
api:
enabled: true
address: "0.0.0.0:8080"
不想允许传入连接?
如果您不希望其他 PFN 连接到您的节点,请覆盖以下内容:listen_address: "/ip4/127.0.0.1/tcp/6182"
。另见下面的注释。
- 接下来,运行以下
docker
命令:
docker run --pull=always \
--rm -p 8080:8080 \
-p 9101:9101 -p 6180:6180 \
-v $(pwd):/opt/aptos/etc -v $(pwd)/data:/opt/aptos/data \
--workdir /opt/aptos/etc \
--name=aptos-fullnode aptoslabs/validator:mainnet aptos-node \
-f /opt/aptos/etc/fullnode.yaml
需要 sudo 访问
注意:根据您的配置,您可能需要在 docker 命令前加上 sudo
。
Docker标签
mainnet
标签始终指向最新的官方 Docker 镜像标签。您可以在以下位置找到最新的哈希值进行比较:
https://github.com/aptos-labs/aptos-networks/tree/main/mainnet
验证您的 PFN 的正确性
验证初始同步
在 PFN 最开始的同步阶段,将会涉及传输大量的数据(详情见状态同步指南了解其工作机制)。通过查询指标端口,您可以监控状态同步的进展情况,确认您的节点当前同步到的版本。您可以执行下面的命令示例,查看节点目前的同步版本:
curl 127.0.0.1:9101/metrics 2> /dev/null | grep "aptos_state_sync_version{.*\"synced\"}" | awk '{print $2}'
该命令将输出节点当前同步的版本。例如:
71000
请将命令返回的同步版本号(如 71000
)与 Aptos explorer 页面上显示的最新版本号进行比较。如果您的节点版本正在迅速接近最新版本,说明它的同步是正常的。浏览器页面上的版本号与您的节点相差几个版本是正常现象,因为浏览器节点本身可能存在一定的同步延迟。
使用快速同步?
如果您的节点正在进行快速同步,该命令可能在最终更新到最新版本之前一直显示0
。要验证节点是否正在进行快速同步,请运行以下命令:
curl 127.0.0.1:9101/metrics 2> /dev/null | grep "aptos_state_sync_version{.*\"synced_states\"}" | awk '{print $2}'
这应该显示同步状态数量的增加。您的节点可能需要几个小时才能快速同步到最新版本。最终,一旦快速同步完成,aptos_state_sync_version{.*"synced"}
命令将返回节点当前同步的版本。
您可以在此处阅读有关快速同步的更多信息:状态同步引导。
(可选)验证出站网络连接
如果您愿意,您还可以检查您的 PFN 的出站网络连接。出站网络连接的数量应该大于0
,以表明 PFN 是健康的。运行以下命令:
curl 127.0.0.1:9101/metrics 2> /dev/null | grep "aptos_connections{direction=\"outbound\""
上面的命令将输出节点的出站网络连接数量。例如:
curl 127.0.0.1:9101/metrics 2> /dev/null | grep "aptos_connections{direction=\"outbound\""
aptos_connections{direction="outbound",network_id="Public",peer_id="aabd651f",role_type="full_node"} 3
如果返回的出站连接数量为0
,则意味着您的节点无法连接到 Aptos 区块链。如果遇到这种情况,请按照以下步骤解决问题:
- 按照更新您的 PFN中的描述,更新您的节点到最新版本。
- 从配置文件中删除可能已添加的任何
seed
对等节点(Peers)。这些seed
可能阻碍您连接到网络。seed
对等节点在连接到种子对等节点部分中有讨论。 - 确保您的网络使用了正确的
genesis.blob
和waypoint.txt
文件。这是一个容易犯错的地方。
(可选)检查 Docker 账本大小
如果您使用 Docker 来运行您的 PFN,可以通过进入 Docker 容器并查询文件大小,来监控区块链账本占用的存储空间。这样,您便可了解到当前区块链账本所占用的存储空间。
- 首先,在终端上运行
docker container ls
,并复制 NAME 字段的输出。这将是一个类似于public_full_node_fullnode_1
的字符串。 - 接下来,运行这些命令以检查账本占用的存储空间大小,使用您在上一步中复制的 NAME 字段替换
public_full_node_fullnode_1
:
# 获取容器 ID:
id=$(docker container ls | grep public_full_node_fullnode_1 | grep -oE "^[0-9a-zA-Z]+")
# 进入容器:
docker exec -it $id /bin/bash
# 观察卷(账本)大小:
du -cs -BM /opt/aptos/data