> For the complete documentation index, see [llms.txt](https://www.docszh.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://www.docszh.com/berachain-docs/nodes/berachain-nodes/run-node-quickstart.md).

# 节点运行快速入门

本节将演示部署一个`bArtio`测试网RPC归档节点，该节点包含`beacond`共识客户端和`reth`执行客户端。

{% hint style="info" %}
注意：目前，测试网验证节点需被列入等候白名单，并在网络需要时运行。
{% endhint %}

### 先决条件

开始之前，请确保你的本地设备上满足以下条件：

* [Golang](https://go.dev/dl/) `v1.22.0`或更高版本
* 满足最低硬件要求
* 已安装[Foundry](https://book.getfoundry.sh/getting-started/installation) (用于测试)

#### 最低硬件要求

运行执行客户端和共识客户端均需要满足以下要求。建议在同一台设备运行这两个客户端，以实现两者之间的低延迟通信。

* 支持的系统：Linux / MacOS
* CPU架构：AMD64，ARM64或ARM64 Darwin
* CPU性能：8核
* 内存：48GB
* 硬盘：1TB

{% hint style="info" %}
如果以Docker容器运行，请确保每个Docker容器有足够的资源，以满足总需求。
{% endhint %}

### 源代码构建和运行

本节快速入门文档，将从源头构建共识客户端。

{% hint style="info" %}
注意：请勿在Vscode中运行执行客户端或共识客户端，容易造成崩溃，请使用专业的Shell终端。
{% endhint %}

#### 复制代码库并验证binary文件

首先，复制[BeaconKit代码库](https://github.com/berachain/beacon-kit)，创建binary文件。

```bash
git clone https://github.com/berachain/beacon-kit;
cd beacon-kit;
make build;

# [Expected Output]:
# mkdir -p /path/to/beacon-kit/build/bin/
# Variables
# Building beacond/cmd
# ...
# go: downloading github.com/berachain/cosmos-sdk v0.46.0-beta2.0.20240624014538-75ba469b1881
```

这将创建一个位于`./build/bin/beacond`的本地binary文件。

接下来，运行以下代码，测试其是否正常工作：

```bash
# FROM: ./beacon-kit

./build/bin/beacond version;

# [Expected Output]:
# v0.2.0-alpha.1-172-g071b95a5
```

### 配置共识客户端

以下将演示配置一个`BeaconKit`共识客户端。

#### 第 1 步：初始化信标节点

首先，为配置创建一个临时文件夹目录。此步骤可省略，但为了后续便利，创建临时文件夹以保存所有配置和数据库数据。

```bash
# FROM: ./beacon-kit

mkdir build/bin/config;
mkdir build/bin/config/beacond;
mkdir build/bin/config/reth;
```

接下来，使用所有标准数据初始化节点。

```bash
# FROM: ./beacon-kit

# Replace <YOUR_MONIKER_NAME> with a name of your choice.
MONIKER_NAME=<YOUR_NODE_MONIKER>; # Ex: MONIKER_NAME=BingBongNode
./build/bin/beacond init $MONIKER_NAME --chain-id bartio-beacon-80084 --consensus-key-algo bls12_381 --home ./build/bin/config/beacond;
# Ex: ./build/bin/beacond init BingBongNode --chain-id bartio-beacon-80084 --consensus-key-algo bls12_381 --home ./build/bin/config/beacond;

# [Expected Output]:
# {
#  "moniker": "BingBongNode", // <YOUR_MONIKER_NAME>
#  "chain_id": "bartio-beacon-80084",
#  "node_id": "72e2e6f9d667898d32ede54de9b9299eb567f692",
#  "gentxs_dir": "",
# ...
```

现在，应该能够在`./build/bin/config`文件夹中看到新创建的文件。

{% hint style="danger" %}
**重要提示**：运行验证器节点，务必安全备份`priv_validator_key.json`文件。该文件包含验证器的私钥，用于验证器对区块进行签名。如果丢失该文件，无人能提供帮助，你将永远无法恢复验证器及提取资产。
{% endhint %}

```bash
# FROM: ./beacon-kit

tree build/bin/config/beacond;

# [Expected Output]:
# build/bin/config/beacond
# ├── config
# │   ├── app.toml
# │   ├── client.toml
# │   ├── config.toml
# │   ├── genesis.json
# │   ├── node_key.json
# │   └── priv_validator_key.json <---- BACK THIS UP
# └── data
#     └── priv_validator_state.json
```

#### 第 2 步：添加配置文件

首先，通过下载到`config`文件夹中的文件，恢复源文件：

```bash
# FROM: ./beacon-kit

curl -o "./build/bin/config/beacond/config/genesis.json" "https://raw.githubusercontent.com/berachain/beacon-kit/main/testing/networks/80084/genesis.json";

# [Expected Output]:
# % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
#                                  Dload  Upload   Total   Spent    Left  Speed
# 100 46860  100 46860    0     0   295k      0 --:--:-- --:--:-- --:--:--  293k
```

仔细检查源文件，确保类似于以下形式：

```bash
# FROM: ./beacon-kit

cat ./build/bin/config/beacond/config/genesis.json;

# [Expected Output]:
# {
#   "app_name": "beacond",
#   "app_version": "v0.2.0-alpha.0",
#   "genesis_time": "2024-06-05T14:00:00Z",
#   "chain_id": "bartio-beacon-80084",
#   "initial_height": 1,
#   "app_hash": null,
#   "app_state": {
# ...
```

接下来，恢复kzg可信设置：

```bash
# FROM: ./beacon-kit

curl -o "./build/bin/config/beacond/kzg-trusted-setup.json" "https://raw.githubusercontent.com/berachain/beacon-kit/main/testing/networks/80084/kzg-trusted-setup.json";

# [Expected Output]:
#   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
#                                  Dload  Upload   Total   Spent    Left  Speed
# 100  436k  100  436k    0     0  2744k      0 --:--:-- --:--:-- --:--:-- 2747k
```

然后，从[BeaconKit testnet repo](https://github.com/berachain/beacon-kit/tree/main/testing/networks/80084)恢复`app.toml`和`config.toml`数据：

```bash
# FROM: ./beacon-kit

# app.toml
curl -o "./build/bin/config/beacond/config/app.toml" "https://raw.githubusercontent.com/berachain/beacon-kit/main/testing/networks/80084/app.toml";

# config.toml
curl -o "./build/bin/config/beacond/config/config.toml" "https://raw.githubusercontent.com/berachain/beacon-kit/main/testing/networks/80084/config.toml";
```

通过添加moniker name和peers以修改配置。

{% hint style="info" %}
如果你的设备不是MacOS系统，请将下方代码中的`-i ''`替换为`-i` 。
{% endhint %}

```bash
# FROM: ./beacon-kit

# Rename the moniker
MONIKER_NAME=<YOUR_NODE_MONIKER>; # Ex: MONIKER_NAME=BingBongNode
sed -i '' "s/^moniker = \".*\"/moniker = \"$MONIKER_NAME\"/" "$PWD/build/bin/config/beacond/config/config.toml";

# set jwt.hex path
JWT_PATH=$PWD/build/bin/config/beacond/jwt.hex; # generating in next step
sed -i '' "s|^jwt-secret-path = \".*\"|jwt-secret-path = \"$JWT_PATH\"|" "$PWD/build/bin/config/beacond/config/app.toml";

# seeds
# - Comma separated list of seeds
seeds_url="https://raw.githubusercontent.com/berachain/beacon-kit/main/testing/networks/80084/cl-seeds.txt";
seeds=$(curl -s "$seeds_url" | tail -n +2 | tr '\n' ',' | sed 's/,$//');
sed -i '' "s/^seeds = \".*\"/seeds = \"$seeds\"/" "$PWD/build/bin/config/beacond/config/config.toml";

# persistent peers
# - Comma separated list of nodes to keep persistent connections to
sed -i '' "s/^persistent_peers = \".*\"/persistent_peers = \"$seeds\"/" "$PWD/build/bin/config/beacond/config/config.toml";
```

#### 第 3 步：生成JWT令牌

这将创建一个JSON Web令牌，以允许BeaconKit共识客户端与EVM执行客户端通信。

运行以下代码，创建JWT令牌：

```bash
# FROM: ./beacon-kit

./build/bin/beacond jwt generate -o ./build/bin/config/beacond/jwt.hex;

# [Expected Output]:
# Successfully wrote new JSON-RPC authentication secret to: ./build/bin/config/jwt.hex
```

这将创建一个`jwt.hex`文件，可以使用`-o`标签指定可选路径。如果不指定输出位置，则在beacond配置目录中生成，例如`/root/.beacond/config/jwt.hex`。

#### 第 4 步：下载快照 (推荐操作)

强烈建议执行此步骤，以避免后续等待较长的同步时间。

{% hint style="danger" %}
从源资源库同步节点可能需要几小时，甚至几天，具体取决于带宽速度和peers数量。
{% endhint %}

参阅此处，获取快照链接列表：[Berachain bArtio V2 Snapshots](https://github.com/berachain/beacon-kit/blob/main/testing/networks/80084/snapshots.md)

运行以下代码，创建快照文件夹并下载快照文件：

```bash
# FROM: ./beacon-kit

mkdir snapshots;
curl -L EXAMPLE_SNAPSHOT_FILE.tar.lz4 > ./snapshots/EXAMPLE_SNAPSHOT_FILE.tar.lz4;

# [Example Output]:
#   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
#                                  Dload  Upload   Total   Spent    Left  Speed
#   0 43.0G    0 78.1M    0     0  18.7M      0  0:39:07  0:00:04  0:39:03 18.7M
```

下载完成，解压快照文件并验证数据：

```bash
# FROM: ./beacon-kit

# make a directory and download snapshots
mkdir snapshots/tmp;
mkdir snapshots/tmp/beacond;
mkdir snapshots/tmp/reth;
# curl ...

# unzip
# - beacond
lz4 -dc < ./snapshots/EXAMPLE_SNAPSHOT_BEACOND.tar.lz4 | tar xvf - -C ./snapshots/tmp/beacond;
# [Expected Output]:
# ...
# x data/application.db/012580.sst
# x data/application.db/012780.sst
# x data/application.db/012421.sst
# x data/application.db/012420.sst

# - reth
lz4 -dc < ./snapshots/EXAMPLE_SNAPSHOT_RETH.tar.lz4 | tar xvf - -C ./snapshots/tmp/reth;
# [Expected Output]:
# ...
# x static_files/static_file_transactions_0_499999
# x static_files/static_file_receipts_1000000_1499999.off
# x static_files/static_file_headers_0_499999
```

快照文件应包含以下`beacond`和`reth`所需内容 (或相应EVM执行客户端所需内容)：

```bash
# ./snapshots/tmp/beacond - (needed folders & files)
# └── data
#     ├── application.db
#     ├── blobs
#     ├── blockstore.db
#     ├── cs.wal
#     ├── deposits.db
#     ├── evidence.db
#     ├── snapshots.db
#     ├── state.db
#     ├── tx_index.db
#     └── priv_validator_state.json
#
# ./snapshots/tmp/reth - (needed folders & files)
# ├── blobstore
# ├── db
# └── static_files
```

快照文件夹和快照文件验证完成后，将快照数据移入相应的配置文件夹。

```bash
# FROM: ./beacon-kit

# beacond
mv ./snapshots/tmp/beacond/data ./build/bin/config/beacond/data;

# reth
mv ./snapshots/tmp/reth/blobstore ./build/bin/config/reth/blobstore;
mv ./snapshots/tmp/reth/db ./build/bin/config/reth/db;
mv ./snapshots/tmp/reth/static_files ./build/bin/config/reth/static_files;
```

#### 第 5 步：运行Beacon

配置好`config.toml`和`app.toml`文件后，运行以下代码，启动Beacon：

```bash
# FROM: ./beacon-kit

./build/bin/beacond start --home ./build/bin/config/beacond;

# [Expected Output]:
# ...
# INFO Starting service type=validator-updates-broker
# INFO Starting service type=engine-client
# INFO Initializing connection to the execution client... service=engine.client dial_url=http://localhost:8551
# INFO Waiting for execution client to start... 🍺🕔 service=engine.client dial_url=http://localhost:8551
# INFO Waiting for execution client to start... 🍺🕔 service=engine.client dial_url=http://localhost:8551
```

现在，你的BeaconKit共识客户端已配置完成，接下来配置执行客户端。

### 配置执行客户端

接下来，需要将执行客户端与`beacond`配对。

{% hint style="info" %}
注意：所有基于以太坊的执行客户端均受支持！

然而，有些客户端可能需要更复杂的配置和微调，才能达到出块时间要求。因此，目前最推荐以下客户端：

* [Reth](https://github.com/paradigmxyz/reth)
* [Geth](https://github.com/ethereum/go-ethereum)
* [Erigon](https://github.com/ledgerwatch/erigon)
* [Besu](https://github.com/hyperledger/besu)
* [Nethermind](https://github.com/NethermindEth/nethermind)
* [EthereumJS](https://github.com/ethereumjs/ethereumjs-monorepo)
  {% endhint %}

下述示例中，将使用[Reth](https://reth.rs/)作为执行客户端。

首先，新建一个终端会话，下载MacOS (基于苹果电脑芯片的操作系统) 的binary文件：

{% hint style="danger" %}
**警告**：本快速入门演示了如何在MacOS系统上运行节点，仅用于测试目的，不建议真实生产环境中在MacOS系统上运行节点。
{% endhint %}

```bash
# FROM: ./beacon-kit

curl -L https://github.com/paradigmxyz/reth/releases/download/v1.0.3/reth-v1.0.3-x86_64-apple-darwin.tar.gz > reth-v1.0.3-x86_64-apple-darwin.tar.gz;
tar -xzvf reth-v1.0.3-x86_64-apple-darwin.tar.gz;

# # [Expected Output]:
#   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
#                                  Dload  Upload   Total   Spent    Left  Speed
#   0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
# 100 20.6M  100 20.6M    0     0  47.5M      0 --:--:-- --:--:-- --:--:-- 47.5M
# x reth
```

运行以下代码，检查`reth`客户端是否正常工作：

```bash
# FROM: ./beacon-kit

./reth --version;

# [Expected Output]:
# reth Version: 1.0.0
# Commit SHA: 31e2470
# Build Timestamp: 2024-06-24T10:26:24.880668000Z
# Build Features: jemalloc
# Build Profile: maxperf
```

#### 第 1 步：配置源文件

首先，从BeaconKit代码库下载eth创世源文件。

```bash
# FROM: ./beacon-kit

curl -o "./build/bin/config/reth/eth-genesis.json" "https://raw.githubusercontent.com/berachain/beacon-kit/main/testing/networks/80084/eth-genesis.json";

# [Expected Output]:
#   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
#                                  Dload  Upload   Total   Spent    Left  Speed
# 100  7232  100  7232    0     0  42532      0 --:--:-- --:--:-- --:--:-- 42792
```

仔细检查源文件，确保类似于以下形式：

```bash
# FROM: ./beacon-kit

cat ./build/bin/config/reth/eth-genesis.json;

# [Expected Output]:
# {
#   "config": {
#     "chainId": 80084,
#     "homesteadBlock": 0,
#     "daoForkBlock": 0,
#     "daoForkSupport": true,
# ...
```

#### 第 2 步：启动Reth

运行以下代码，完成剩余reth文件配置：

```bash
# FROM: ./beacon-kit

./reth init --datadir ./build/bin/config/reth --chain=./build/bin/config/reth/eth-genesis.json;
```

#### 第 3 步：运行Reth客户端

```bash
# retrieve bootnode
bootnodes_url="https://raw.githubusercontent.com/berachain/beacon-kit/main/testing/networks/80084/el-bootnodes.txt";
bootnodes=$(curl -s "$bootnodes_url" | grep '^enode://' | tr '\n' ',' | sed 's/,$//');

# run reth
./reth node --authrpc.jwtsecret=./build/bin/config/beacond/jwt.hex \
--chain=./build/bin/config/reth/eth-genesis.json \
--datadir=./build/bin/config/reth \
--port=30303 \
--http \
--http.addr=0.0.0.0 \
--http.api="eth,net,web3,txpool,debug" \
--http.port=8545 \
--http.corsdomain="*" \
--bootnodes=$bootnodes \
--trusted-peers=$bootnodes \
--ws \
--ws.addr=0.0.0.0 \
--ws.port=8546 \
--ws.origins="*" \
--authrpc.addr=0.0.0.0 \
--authrpc.port=8551 \
--log.file.directory=./build/bin/config/reth/logs \
--metrics=0.0.0.0:6060;

# [Expected Output]:
# INFO Initialized tracing, debug log directory: ./build/bin/config/reth/logs/80084
# INFO Starting reth version="1.0.0 (31e2470)"
# INFO Opening database path="./build/bin/config/reth/db"
# INFO Configuration loaded path="./build/bin/config/reth/reth.toml"
# INFO Adding trusted nodes
# INFO Verifying storage consistency.
# INFO Database opened
# INFO Starting metrics endpoint addr=0.0.0.0:6060
# ...
```

### 检查同步状态

新建一个终端会话，并运行以下代码：

```bash
# Don't have jq? `brew install jq`;
./build/bin/beacond --home=./build/bin/config/beacond status | jq;

# [Expected Output]:
# {
#   "node_info": {
#     "protocol_version": {
#       "p2p": "9",
#       "block": "11",
#       "app": "0"
#     },
#     "id": "3078798f76b4db03aca9c71dd3264c252e06dfbf",
#     "listen_addr": "tcp://0.0.0.0:26656",
#     "network": "bartio-beacon-80084",
#     "version": "1.0.0-rc1",
#     "channels": "40202122233038606100",
#     "moniker": "BingBongNode",
#     "other": {
#       "tx_index": "off",
#       "rpc_address": "tcp://127.0.0.1:26657"
#     }
#   },
#   "sync_info": {
#     "latest_block_hash": "A72E1C5BD31B0E14604BB6DBA5A313F5B17F78FEE482453D9ED703E49D0C059B",
#     "latest_app_hash": "FC649179895650C9B6EB4320A096F46D8882CAD3AAFEE1B0D997B338BDF31618",
#     "latest_block_height": "1126228",<---- CURRENT NETWORK BLOCK
#     "latest_block_time": "2024-07-05T03:50:15.349853738Z",
#     "earliest_block_hash": "F10DEBCEF3E370F813E93BD8BBFA3DAC0392E6C3E9A8A63871E932ACDE44EE1F",
#     "earliest_app_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
#     "earliest_block_height": "1",
#     "earliest_block_time": "2024-06-05T14:00:00Z",
#     "catching_up": false<---- IF `true` = STILL SYNCING
#   },
#   "validator_info": {
#     "address": "74F0F7AC6C37306E765487F8C43F01059EE28391",
#     "pub_key": {
#       "type": "cometbft/PubKeyBls12_381",
#       "value": "i/z8e0Fz1+EiW1YGe9wdqCuAM9sny3r8s4gpjLlDHGFQfv36Vffq/+KoCJKuGRT8"
#     },
#     "voting_power": "0"
#   }
# }
```

### 测试本地RPC节点

现在，通过以下步骤来验证当前网络是否正常运行，需要执行一些RPC请求，并部署一个合约。

{% hint style="info" %}
先决条件：在此之前，请确保节点同步已完成。
{% endhint %}

#### 获取当前区块高度

```bash
curl --location 'http://localhost:8545' \
--header 'Content-Type: application/json' \
--data '{
	"jsonrpc":"2.0",
	"method":"eth_blockNumber",
	"params":[],
	"id":83
}';

# [Expected Output]:
# {
#     "jsonrpc": "2.0",
#     "result": "0xfae90",
#     "id": 83
# }
```
