All pages
Powered by GitBook
1 of 7

快速入门

这一部分帮助节点操作员和验证者运行、升级和维护他们的哨兵/验证节点。

和节点交互

与节点互动有多种方式:CLI、gRPC或REST端点。

使用 CLI

您可以使用injectived CLI与节点互动。如果您在本地私有网络中与节点互动,请确保在使用CLI之前,节点在终端中已运行。 有关如何使用injectived的更多详细信息,请访问 使用 injectived

使用 gRPC

Protobuf生态系统开发了适用于不同用例的工具,包括从*.proto文件生成各种语言的代码。这些工具使得客户端的构建变得非常简单。通常,客户端连接(即传输)可以非常容易地插拔和替换。让我们来探索一种流行的传输方法,gRPC。 由于代码生成库在很大程度上依赖于您自己的技术栈,我们将仅介绍两种替代方案:

  • grpcurl用于通用调试和测试。

  • 通过Go、Python或TS以编程方式实现。

grpcurl

grpcurl类似于curl,但用于gRPC。它也可作为Go库使用,但我们将在此仅将其用作CLI命令进行调试和测试。请按照前述链接中的说明进行安装。

假设您有一个本地节点正在运行(无论是本地网络还是连接到实时网络),您可以运行以下命令来列出可用的Protobuf服务。您可以将localhost:9000替换为另一个节点的gRPC服务器端点,该端点在app.toml文件的grpc.address字段中配置:

grpcurl -plaintext localhost:9090 list

您应当会看到一个gRPC服务列表,例如cosmos.bank.v1beta1.Query。这被称为反射(reflection),它是一个Protobuf端点,返回所有可用端点的描述。每个端点代表一个不同的Protobuf服务,而每个服务又公开多个可供查询的RPC方法。

要获取某个服务的描述,您可以运行以下命令:

# Service we want to inspect
grpcurl \
    localhost:9090 \
    describe cosmos.bank.v1beta1.Query                  

您还可以执行RPC调用来查询节点信息:

grpcurl \
    -plaintext
    -d '{"address":"$MY_VALIDATOR"}' \
    localhost:9090 \
    cosmos.bank.v1beta1.Query/AllBalances

使用grpcurl查询历史状态。

您还可以通过向查询传递一些 gRPC 元数据来查询历史数据:x-cosmos-block-height 元数据应包含要查询的区块。使用与上述相同的 grpcurl 命令,如下所示:

grpcurl \
    -plaintext \
    -H "x-cosmos-block-height: 279256" \
    -d '{"address":"$MY_VALIDATOR"}' \
    localhost:9090 \
    cosmos.bank.v1beta1.Query/AllBalances

如果该区块的状态尚未被节点裁剪,此查询应返回非空响应。

编程方式

以下示例使用 Go 编写,但也可以使用 Python 和 TypeScript SDK 以编程方式与节点/Injective 交互。

  • TypeScript 示例

  • Python 示例

以下代码片段展示了如何在 Go 程序中使用 gRPC 查询状态。其核心思路是创建 gRPC 连接,并使用 Protobuf 生成的客户端代码查询 gRPC 服务器。

import (
    "context"
    "fmt"

	"google.golang.org/grpc"

    sdk "github.com/cosmos/cosmos-sdk/types"
	"github.com/cosmos/cosmos-sdk/types/tx"
)

func queryState() error {
    myAddress, err := sdk.AccAddressFromBech32("inj...")
    if err != nil {
        return err
    }

    // Create a connection to the gRPC server.
    grpcConn := grpc.Dial(
        "127.0.0.1:9090", // your gRPC server address.
        grpc.WithInsecure(), // The SDK doesn't support any transport security mechanism.
    )
    defer grpcConn.Close()

    // This creates a gRPC client to query the x/bank service.
    bankClient := banktypes.NewQueryClient(grpcConn)
    bankRes, err := bankClient.Balance(
        context.Background(),
        &banktypes.QueryBalanceRequest{Address: myAddress, Denom: "inj"},
    )
    if err != nil {
        return err
    }

    fmt.Println(bankRes.GetBalance()) // Prints the account balance

    return nil
}

使用 Go 查询历史状态

通过在 gRPC 请求中添加区块高度元数据,可以查询历史区块。

import (
    "context"
    "fmt"

    "google.golang.org/grpc"
    "google.golang.org/grpc/metadata"

    grpctypes "github.com/cosmos/cosmos-sdk/types/grpc"
	"github.com/cosmos/cosmos-sdk/types/tx"
)

func queryState() error {
    // --snip--

    var header metadata.MD
    bankRes, err = bankClient.Balance(
        metadata.AppendToOutgoingContext(context.Background(), grpctypes.GRPCBlockHeightHeader, "12"), // Add metadata to request
        &banktypes.QueryBalanceRequest{Address: myAddress, Denom: denom},
        grpc.Header(&header), // Retrieve header from response
    )
    if err != nil {
        return err
    }
    blockHeight = header.Get(grpctypes.GRPCBlockHeightHeader)

    fmt.Println(blockHeight) // Prints the block height (12)

    return nil
}

使用 REST 端点

Cosmos SDK 中的所有 gRPC 服务都可通过 gRPC-Gateway 以 REST 方式进行查询,以提供更便利的访问方式。URL 路径的格式基于 Protobuf 服务方法的全限定名称,但可能会进行一定的调整,以使最终的 URL 更符合 REST 规范。例如,cosmos.bank.v1beta1.Query/AllBalances 方法的 REST 端点为:

GET /cosmos/bank/v1beta1/balances/{address}

请求参数以查询参数的形式传递。

以下示例假设您正在本地私有网络中使用 REST 端点与节点交互。您可以将域名更改为公共网络。

具体示例中,使用 curl 命令请求账户余额如下:

curl \
    -X GET \
    -H "Content-Type: application/json" \
    http://localhost:1317/cosmos/bank/v1beta1/balances/$MY_VALIDATOR

请确保将 localhost:1317 替换为您的节点 REST 端点,该端点在 api.address 配置字段下指定。

所有可用的 REST 端点列表可通过 Swagger 规范文件查看,访问地址为:http://localhost:1317/swagger请确保在 app.toml 文件中,将 api.swagger 字段设置为 true。

使用 REST 查询历史状态

通过使用 HTTP 头 x-cosmos-block-height 可以查询历史状态。例如,curl 命令如下所示:

curl \
    -X GET \
    -H "Content-Type: application/json" \
    -H "x-cosmos-block-height: 279256"
    http://localhost:1317/cosmos/bank/v1beta1/balances/$MY_VALIDATOR

假设该区块的状态尚未被节点裁剪,此查询应返回非空响应。

跨域资源共享 (CORS)

默认情况下,为了安全性,CORS 策略未启用。如果您希望在公共环境中使用 REST 服务器,建议您提供一个反向代理,可以使用 nginx 来实现。对于测试和开发目的,app.toml 文件中有一个 enabled-unsafe-cors 字段。

发送交易

使用 gRPC 和 REST 发送交易需要一些额外的步骤:生成交易、签名交易,最后广播交易。 您可以在 相关文档中了解更多: 交易.。

运行节点

强烈建议在加入公共网络之前,先设置一个本地私有网络。这将帮助您熟悉设置过程,并为测试提供一个环境。

私有网络

  • 通过在本地设置独立网络加入

公共网络

  • 通过公共端点使用网络;或者

  • 通过运行节点加入

任何人都可以设置自己的节点,并通过端点与 Injective 区块链进行通信。为了方便,提供了一些公共端点用于查询链。对于开发和测试目的,推荐使用公共端点。为了最大程度的控制和可靠性,建议运行您自己的节点。

运行节点的准备工作

如果您选择运行节点(无论是设置私有网络还是加入公共网络),您必须设置密钥环。您还可以选择安装 Cosmovisor,它可以帮助进行链升级,以实现最小的停机时间。

与节点交互

一旦节点启动并运行,您可以通过几种方式与节点进行交互,即使用 gRPC 端点、REST 端点或 injectived CLI。您可以在这里了解更多信息:运行节点。

运行节点指南

Cover

设置密钥环

学习如何设置密钥环

Cover

加入网络

学习如何加入网络

Cover

升级您的节点

学习如何升级您的节点

设置密钥环

本文件描述了如何配置和使用密钥环及其不同的后端来为 Injective 节点提供支持。在设置密钥环之前,应先安装 injectived。有关更多信息,请参阅安装 injectived 页面。

密钥环保存用于与节点交互的私钥/公钥对。例如,在运行 Injective 节点之前需要设置验证者密钥,以便正确签名区块。私钥可以存储在不同的位置,这些位置被称为“后端”,例如文件或操作系统本身的密钥存储。

密钥环的可用后端

os 后端

os 后端依赖于操作系统特定的默认设置来安全地处理密钥存储。通常,操作系统的凭据子系统根据用户的密码策略处理密码提示、私钥存储和用户会话。以下是最流行的操作系统及其各自的密码管理器:

  • macOS(自 Mac OS 8.6 起):Keychain

  • Windows:凭据管理 API

  • GNU/Linux:

    • libsecret

    • kwallet

使用 GNOME 作为默认桌面环境的 GNU/Linux 发行版通常配备 Seahorse。基于 KDE 的发行版通常提供 KDE Wallet Manager。前者实际上是 libsecret 的便捷前端,后者是 kwallet 客户端。

由于操作系统的默认凭据管理器旨在满足用户的最常见需求,并提供舒适的体验而不牺牲安全性,因此 os 是默认选项。

对于无头(headless)环境,推荐使用 file 和 pass 后端。

file 后端

file 后端 将密钥环加密存储在应用的配置目录中。每次访问该密钥环时,都会要求输入密码,这可能在单个命令中多次发生,从而导致重复的密码提示。如果使用 bash 脚本通过 file 选项执行命令,您可能希望使用以下格式来处理多个密码提示:

# assuming that KEYPASSWD is set in the environment
yes $KEYPASSWD | injectived keys add me
yes $KEYPASSWD | injectived keys show me
# start injectived with keyring-backend flag
injectived --keyring-backend=file start

第一次向空的密钥环添加密钥时,系统会提示您输入密码两次。

pass 后端

pass 后端 使用 pass 工具来管理密钥敏感数据和元数据的磁盘加密。密钥存储在特定应用目录中的 GPG 加密文件内。pass 可用于最流行的 UNIX 操作系统以及 GNU/Linux 发行版。有关如何下载和安装 pass 的信息,请参阅其手册页。

pass 使用 GnuPG 进行加密。执行时,gpg 会自动调用 gpg-agent 守护进程,后者负责缓存 GnuPG 凭据。有关如何配置缓存参数(如凭据的 TTL 和密码过期时间)的更多信息,请参阅 gpg-agent 手册页。

密码存储在首次使用之前必须进行设置:

pass init <GPG_KEY_ID>

将 <GPG_KEY_ID> 替换为您的 GPG 密钥 ID。您可以使用您的个人 GPG 密钥,或者选择一个您希望专门用于加密密码存储的替代密钥。

kwallet 后端

kwallet 后端 使用 KDE Wallet Manager,它默认安装在以 KDE 为默认桌面环境的 GNU/Linux 发行版中。有关更多信息,请参阅 KWallet 手册。

test 后端

test 后端 是 file 后端的无密码变体。密钥以未加密的形式存储在磁盘上。

仅为测试目的提供。test 后端 不推荐在生产环境中使用。

memory 后端

memory 后端 将密钥存储在内存中。程序退出后,密钥会立即被删除。

仅为测试目的提供。memory 后端 不推荐在生产环境中使用。

向密钥环添加密钥

您可以使用 injectived keys 获取有关 keys 命令的帮助,使用 injectived keys [command] --help 获取有关特定子命令的更多信息。

您还可以通过 injectived completion 命令启用自动补全。例如,在开始一个 bash 会话时,运行 .<(injectived completion),这样所有 injectived 子命令将会自动补全。

要在密钥环中创建新密钥,请使用 add 子命令并提供 <key_name> 参数。为了本教程的目的,我们将仅使用 test 后端,并将新密钥命名为 my_validator。此密钥将在下一节中使用。

$ injectived keys add my_validator --keyring-backend test

# Put the generated address in a variable for later use.
MY_VALIDATOR_ADDRESS=$(injectived keys show my_validator -a --keyring-backend test)

此命令生成一个新的 24 个单词的助记词短语,将其保存到相关的后端,并输出关于密钥对的信息。如果该密钥对将用于持有具有价值的代币,请务必将助记词短语记录在安全的地方!

默认情况下,密钥环生成一个 eth_secp256k1 密钥对。密钥环还支持 ed25519 密钥,可以通过传递 --algo ed25519 标志来创建。密钥环当然可以同时持有这两种类型的密钥。

加入网络

本指南将引导您完成在本地设置独立网络的过程,以及在主网或测试网上运行节点的步骤。 您还可以在各自的标签中找到每个网络的硬件要求。

要轻松设置本地节点,请下载并运行 setup.sh 脚本。此脚本将初始化您的本地 Injective 网络。

wget https://raw.githubusercontent.com/InjectiveLabs/injective-chain-releases/master/scripts/setup.sh
chmod +x ./setup.sh # Make the script executable
./setup.sh

运行以下命令启动节点:

injectived start # Blocks should start coming in after running this

为了更详细地解释该脚本的功能,并提供对设置过程的更精细控制,请继续阅读下文。

I初始化链

在运行 Injective 节点之前,我们需要初始化链,并生成节点的创世文件:

# The <moniker> argument is the custom username of your node. It should be human-readable.
injectived init <moniker> --chain-id=injective-1

上述命令将创建节点运行所需的所有配置文件,以及默认的创世文件(genesis file),该文件定义了网络的初始状态。所有这些配置文件默认存储在 ~/.injectived 目录中,但您可以通过 --home 标志指定不同的位置。

请注意,如果选择使用 ~/.injectived 以外的目录,则每次运行 injectived 命令时,都必须使用 --home 标志指定该目录的位置。如果您已有创世文件,可以使用 --overwrite 或 -o 标志进行覆盖。

~/.injectived 目录的结构如下:

.                                   # ~/.injectived
  |- data                           # Contains the databases used by the node.
  |- config/
      |- app.toml                   # Application-related configuration file.
      |- config.toml                # Tendermint-related configuration file.
      |- genesis.json               # The genesis file.
      |- node_key.json              # Private key to use for node authentication in the p2p protocol.
      |- priv_validator_key.json    # Private key to use as a validator in the consensus protocol.

修改 genesis.json 文件

此时,需要修改 genesis.json 文件:

  • 将 staking bond_denom、crisis denom、gov denom 和 mint denom 的值更改为 "inj",因为 INJ 是 Injective 的原生代币。

可以使用以下命令轻松完成此修改:

cat $HOME/.injectived/config/genesis.json | jq '.app_state["staking"]["params"]["bond_denom"]="inj"' > $HOME/.injectived/config/tmp_genesis.json && mv $HOME/.injectived/config/tmp_genesis.json $HOME/.injectived/config/genesis.json
cat $HOME/.injectived/config/genesis.json | jq '.app_state["crisis"]["constant_fee"]["denom"]="inj"' > $HOME/.injectived/config/tmp_genesis.json && mv $HOME/.injectived/config/tmp_genesis.json $HOME/.injectived/config/genesis.json
cat $HOME/.injectived/config/genesis.json | jq '.app_state["gov"]["deposit_params"]["min_deposit"][0]["denom"]="inj"' > $HOME/.injectived/config/tmp_genesis.json && mv $HOME/.injectived/config/tmp_genesis.json $HOME/.injectived/config/genesis.json
cat $HOME/.injectived/config/genesis.json | jq '.app_state["mint"]["params"]["mint_denom"]="inj"' > $HOME/.injectived/config/tmp_genesis.json && mv $HOME/.injectived/config/tmp_genesis.json $HOME/.injectived/config/genesis.json

上述命令仅适用于默认的 .injectived 目录。

如果使用了自定义目录,则需要修改相应命令以适配该目录,或者手动编辑 genesis.json 文件以应用这些更改。

为验证人账户创建密钥

在启动链之前,您需要至少创建一个账户来填充状态。首先,在密钥存储(keyring)中创建一个名为 my_validator 的新账户,并使用 test 作为密钥存储后端(您可以选择其他名称或后端):

injectived keys add my_validator --keyring-backend=test

# Put the generated address in a variable for later use.
MY_VALIDATOR_ADDRESS=$(injectived keys show my_validator -a --keyring-backend=test)

现在,您已经创建了一个本地账户,接下来需要在链的创世文件中为其分配一定数量的 INJ 代币。这样做可以确保链在启动时就识别该账户的存在,并初始化其余额:

injectived add-genesis-account $MY_VALIDATOR_ADDRESS 100000000000000000000000000inj --chain-id=injective-1

$MY_VALIDATOR_ADDRESS 是一个变量,用于保存 my_validator 密钥在密钥存储中的地址。在 Injective 中,代币采用 {amount}{denom} 格式:amount 是一个精确到 18 位的小数数字,denom 是代币的唯一标识符及其面额(例如:inj)。在这里,我们分配 INJ 代币,因为 INJ 是 Injective 中用于质押的代币标识符。

将验证人添加到链中

现在,您的账户已经有了一些代币,接下来需要将一个验证人添加到链中。验证人是参与共识过程的特殊全节点,负责向链中添加新区块。任何账户都可以声明其成为验证人操作员的意图,但只有那些获得足够委托的账户才能进入活动集(active set)。

在本教程中,您将把本地节点(通过上述 init 命令创建)作为链的验证人添加到链中。验证人可以在链首次启动之前,通过创世文件中包含的特殊交易(称为 gentx)进行声明。

# Create a gentx.
injectived gentx my_validator 1000000000000000000000inj --chain-id=injective-1 --keyring-backend=test

# Add the gentx to the genesis file.
injectived collect-gentxs

gentx 执行了三件事:

  1. 注册您创建的验证人账户作为验证人操作员账户(即控制验证人的账户)。

  2. 自我委托(self-delegates)所提供数量的质押代币。

  3. 将操作员账户与 Tendermint 节点的公钥关联,该公钥将用于签署区块。如果未提供 --pubkey 标志,则默认为通过 injectived init 命令创建的本地节点公钥。

欲了解有关 gentx 的更多信息,请使用以下命令:

injectived gentx --help

使用 app.toml 和 config.toml 配置节点

在 ~/.injectived/config 目录下,自动生成了两个配置文件:

  • config.toml:用于配置 Tendermint(可以在 Tendermint 的文档中了解更多信息),

  • app.toml:由 Cosmos SDK(Injective 是基于 Cosmos SDK 构建的)生成,用于配置状态修剪策略、遥测、gRPC 和 REST 服务器配置、状态同步等。

这两个文件都有大量注释—请直接参考它们以调整您的节点。

一个需要调整的配置示例是 app.toml 中的 minimum-gas-prices 字段,该字段定义了验证人节点愿意接受的最低 gas 价格来处理交易。如果该字段为空,请确保用某个值进行编辑,例如 10inj,否则节点将在启动时停止。对于本教程,我们将最低 gas 价格设置为 0:

 # The minimum gas prices a validator is willing to accept for processing a
 # transaction. A transaction's fees must meet the minimum of any denomination
 # specified in this config (e.g. 0.25token1;0.0001token2).
 minimum-gas-prices = "0inj"

运行本地网络

现在,一切设置完成,您可以最终启动您的节点:

injectived start # Blocks should start coming in after running this

此命令允许您运行一个单节点,这足以通过该节点与链进行交互,但如果您希望查看多个节点之间是如何达成共识的,可以同时运行多个节点。

硬件规格

节点操作员应部署裸金属服务器,以实现最佳性能。此外,验证人节点必须满足推荐的硬件规格,特别是 CPU 要求,以确保高可用性。

最低配置

推荐配置

RAM Memory 128GB

RAM Memory 128GB

CPU 12 cores

CPU 16 cores

CPU base clock 3.7GHz

CPU base clock 4.2GHz

Storage 2TB NVMe

Storage 2TB NVMe

Network 1Gbps+

Network 1Gbps+

安装 injectived 和 peggo

请查看 Injective 的发布仓库,以获取最新的版本。非验证人节点操作员无需安装 peggo。

wget https://github.com/InjectiveLabs/testnet/releases/download/v1.12.9-testnet-1703762556/linux-amd64.zip
unzip linux-amd64.zip
sudo mv peggo /usr/bin
sudo mv injectived /usr/bin
sudo mv libwasmvm.x86_64.so /usr/lib 

初始化一个新的 Injective 链节点

在运行 Injective 节点之前,我们需要初始化链以及节点的创世文件:

# The argument <moniker> is the custom username of your node, it should be human-readable.
export MONIKER=<moniker>
# Injective Testnet has a chain-id of "injective-888"
injectived init $MONIKER --chain-id injective-888

运行 init 命令将会在 ~/.injectived 目录下创建 Injective 默认的配置文件。

准备配置以加入测试网

现在,您应该使用测试网的创世文件(genesis file)和应用配置文件(application config file)更新默认配置,并配置您的持久对等节点(persistent peers)与种子节点(seed nodes)。

git clone https://github.com/InjectiveLabs/testnet.git

# copy genesis file to config directory
aws s3 cp --no-sign-request s3://injective-snapshots/testnet/genesis.json .
mv genesis.json ~/.injectived/config/

# copy config file to config directory
cp testnet/corfu/70001/app.toml  ~/.injectived/config/app.toml
cp testnet/corfu/70001/config.toml ~/.injectived/config/config.toml

您还可以运行命令来验证创世文件的校验和(checksum)。 - a4abe4e1f5511d4c2f821c1c05ecb44b493eec185c0eec13b1dcd03d36e1a779

sha256sum ~/.injectived/config/genesis.json

为 injectived 配置 systemd 服务

编辑位于 /etc/systemd/system/injectived.service 的配置文件:

[Unit]
  Description=injectived

[Service]
  WorkingDirectory=/usr/bin
  ExecStart=/bin/bash -c '/usr/bin/injectived --log-level=error start'
  Type=simple
  Restart=always
  RestartSec=5
  User=root

[Install]
  WantedBy=multi-user.target

启动和重启 systemd 服务

sudo systemctl daemon-reload
sudo systemctl restart injectived
sudo systemctl status injectived

# enable start on system boot
sudo systemctl enable injectived

# To check Logs
journalctl -u injectived -f

同步网络

请参考 Polkachu 指南 以下载快照并与网络同步。

支持

如果有任何进一步的问题,您可以通过 Discord、Telegram 或电子邮件(contact@injectivelabs.org)随时与 Injective 团队联系。

硬件配置

节点操作员应部署裸金属服务器,以实现最佳性能。此外,验证人节点必须满足推荐的硬件规格,特别是 CPU 要求,以确保高可用性。

最低配置

推荐配置

RAM Memory 128GB

RAM Memory 128GB

CPU 12 cores

CPU 16 cores

CPU base clock 3.7GHz

CPU base clock 4.2GHz

Storage 2TB NVMe

Storage 2TB NVMe

Network 1Gbps+

Network 1Gbps+

安装 injectived 和 peggo

请查看 Injective 链的发布仓库,以获取最新版本。非验证人节点操作员无需安装 peggo。

wget https://github.com/InjectiveLabs/injective-chain-releases/releases/download/v1.14.1-1740773301/linux-amd64.zip
unzip linux-amd64.zip
sudo mv peggo /usr/bin
sudo mv injectived /usr/bin
sudo mv libwasmvm.x86_64.so /usr/lib 

初始化新的 Injective 节点

在运行 Injective 节点之前,我们需要初始化链以及节点的创世文件:

# The argument <moniker> is the custom username of your node. It should be human-readable.
export MONIKER=<moniker>
# Injective Mainnet has a chain-id of "injective-1"
injectived init $MONIKER --chain-id injective-1

运行 init 命令将会在 ~/.injectived 目录下创建 Injective 的默认配置文件。

准备配置以加入主网

现在,您应该使用主网的创世文件(genesis file)和应用配置文件(application config file)更新默认配置,并配置您的持久对等节点(persistent peers)与种子节点(seed nodes)。

git clone https://github.com/InjectiveLabs/mainnet-config

# copy genesis file to config directory
cp mainnet-config/10001/genesis.json ~/.injectived/config/genesis.json

# copy config file to config directory
cp mainnet-config/10001/app.toml  ~/.injectived/config/app.toml

您还可以运行命令来验证创世文件的校验和(checksum) - 573b89727e42b41d43156cd6605c0c8ad4a1ce16d9aad1e1604b02864015d528

sha256sum ~/.injectived/config/genesis.json

然后,在 ~/.injectived/config/config.toml 文件中更新 seeds 字段,使用 mainnet-config/10001/seeds.txt 的内容,并将 timeout_commit 设置为 300ms。

cat mainnet-config/10001/seeds.txt
nano ~/.injectived/config/config.toml

为 injectived 配置 systemd 服务

编辑 /etc/systemd/system/injectived.service 配置文件:

[Unit]
  Description=injectived

[Service]
  WorkingDirectory=/usr/bin
  ExecStart=/bin/bash -c '/usr/bin/injectived --log-level=error start'
  Type=simple
  Restart=always
  RestartSec=5
  User=root

[Install]
  WantedBy=multi-user.target

启动和重启 systemd 服务。

sudo systemctl daemon-reload
sudo systemctl restart injectived
sudo systemctl status injectived

# enable start on system boot
sudo systemctl enable injectived

# To check Logs
journalctl -u injectived -f

服务应在快照数据加载到正确目录之前停止,并在加载之后启动。

# to stop the node
sudo systemctl stop injectived

# to start the node
sudo systemctl start injectived

同步网络

选项 1. 状态同步

将很快添加

选项 2. 快照

已修剪

  1. Polkachu.

  2. HighStakes.

  3. AutoStake.

  4. Imperator.

  5. Bware Labs.

或者,您可以使用来自Injective Labs在AWS S3上的已修剪快照。

systemctl stop injectived
injectived tendermint unsafe-reset-all --home $HOME/.injectived
SNAP=$(aws s3 ls --no-sign-request s3://injective-snapshots/mainnet/pruned/ | grep ".tar.lz4" | sort | tail -n 1 | awk '{print $4}')
aws s3 cp --no-sign-request s3://injective-snapshots/mainnet/pruned/$SNAP .
lz4 -c -d $SNAP  | tar -x -C $HOME/.injectived/
rm $SNAP
systemctl start injectived

如果Injective主网配置中的seeds.txt列表无法工作(节点无法同步区块),ChainLayer、Polkachu和Autostake维护对等节点列表(可用于config.toml中的persistent_peers字段)或地址簿(用于更快的对等节点发现)。 存档(>20TB)

systemctl stop injectived
injectived tendermint unsafe-reset-all --home $HOME/.injectived
aws s3 sync --no-sign-request --delete s3://injective-snapshots/mainnet/injectived/data $HOME/.injectived/data
aws s3 sync --no-sign-request --delete s3://injective-snapshots/mainnet/injectived/wasm $HOME/.injectived/wasm
systemctl start injectived

此时,可以使用GEX来监控节点的同步状态。如果快照已正确加载,连接的对等节点数量应从0增加,最新区块应稳定增加,表示节点正在与其对等节点同步。请注意,根据快照的年龄,节点可能需要几个小时或更长时间才能追赶到网络的区块高度。 如果最新区块没有增加且连接的对等节点数量为0或保持较低,seeds.txt中的种子列表可能已过时,可以分别使用验证者的种子或对等节点列表更新seeds或persistent_peers字段,然后再重新启动节点。

go install github.com/cosmos/gex@latest
gex

支持

如果有任何进一步的问题,您可以通过 Discord、Telegram 或电子邮件(contact@injectivelabs.org)随时与 Injective 团队联系。

Cosmovisor

Cosmovisor 是一个为基于 Cosmos SDK 的区块链设计的进程管理器,简化了二进制(链)升级的管理。本文提供了逐步的说明,帮助您为 Injective 网络节点设置 Cosmovisor。

Note: 这些说明假设您已经拥有现有的链二进制文件(例如 injectived)以及一个正常工作的 Go 环境,如果您选择从源代码安装 Cosmovisor。根据您的具体设置,调整名称和路径。


目录

  1. Installation

    • Installing via Go

  2. Environment Variables

  3. Directory Structure

  4. Running Cosmovisor

  5. Handling Chain Upgrades

  6. Running Cosmovisor as a Systemd Service


安装

通过Go安装

如果您已安装 Go,可以使用以下命令安装 Cosmovisor:

go install cosmossdk.io/tools/cosmovisor/cmd/cosmovisor@v1.5.0

Tip: 确保您的 Go 二进制安装路径(通常是 $GOPATH/bin 或 $HOME/go/bin)已添加到系统的 PATH 中。您可以通过运行以下命令来验证安装:

which cosmovisor

环境变量

设置以下环境变量,以便 Cosmovisor 知道要运行哪个二进制文件以及在哪里找到它:

  • DAEMON_NAME 您的链二进制文件的名称(例如,injectived)。

  • DAEMON_HOME 您的节点的主目录(例如,~/.injectived)。

您可以在 shell 配置文件中设置这些变量(如 ~/.bashrc 或 ~/.profile),或者直接在终端会话中导出它们:

export DAEMON_NAME=injectived
export DAEMON_HOME=~/.injectived

目录结构

Cosmovisor 期望在您的节点主目录中具有特定的文件夹结构:

  1. 创建 Genesis 目录 此目录存放初始(genesis)二进制文件。

mkdir -p $DAEMON_HOME/cosmovisor/genesis/bin
  1. 复制当前二进制文件 将当前的链二进制文件(例如,injectived)放入 genesis 文件夹中。确保文件名与 DAEMON_NAME 值匹配(见下节)。

cp $(which injectived) $DAEMON_HOME/cosmovisor/genesis/bin/injectivedcp $(which injectived) $DAEMON_HOME/cosmovisor/genesis/bin/injectived

运行 Cosmovisor

不要直接运行链的二进制文件,而是通过执行以下命令启动您的节点:

cosmovisor run start

Cosmovisor 将会:

  • 在 $DAEMON_HOME/cosmovisor/genesis/bin(或适当的升级文件夹)中查找二进制文件。

  • 使用该二进制文件启动您的节点。

  • 监控任何链上的升级信号,并在需要时自动切换二进制文件。


处理链升级

当链上宣布升级时,准备新二进制文件,以便 Cosmovisor 可以自动切换到它:

  1. 创建升级目录 使用链上提供的升级名称(例如,v1.14.0):

mkdir -p $DAEMON_HOME/cosmovisor/upgrades/<upgrade_name>/bin
  1. 放置新二进制文件 编译或下载新二进制文件,然后将其复制到升级目录中。确保二进制文件名与 DAEMON_NAME 匹配。

cp /path/to/new/injectived $DAEMON_HOME/cosmovisor/upgrades/<upgrade_name>/bin
cp /path/to/new/libwasmvm.x86_64.so $DAEMON_HOME/cosmovisor/upgrades/<upgrade_name>/bin

TIP: 如果您从 GitHub 下载了 injectived 二进制包,我们会将 libwasmvm.x86_64.so 复制到升级 bin 目录。稍后将向 systemd 服务添加一个环境变量,将此目录添加到 LD_LIBRARY_PATH 中。

  1. 升级过程 当达到升级高度时,Cosmovisor 会检测到计划的升级,并自动切换到相应升级文件夹中的二进制文件。

当链上宣布升级时,准备新二进制文件,以便 Cosmovisor 可以自动切换到它。


将 Cosmovisor 作为 Systemd 服务运行

在生产环境中,通常将节点作为 systemd 服务运行。以下是一个示例服务文件。

  1. 创建服务文件

    创建一个文件(例如,/etc/systemd/system/injectived.service),并添加以下内容。根据实际情况调整路径和 <your_username>:

[Unit]
Description=Injective Daemon managed by Cosmovisor
After=network-online.target

[Service]
User=<your_username>
ExecStart=/home/<your_username>/go/bin/cosmovisor run start
Restart=always
RestartSec=3
Environment="DAEMON_NAME=injectived"
Environment="DAEMON_HOME=/home/<your_username>/.injectived"
Environment="PATH=/usr/local/bin:/home/<your_username>/go/bin:$PATH"
Environment="DAEMON_ALLOW_DOWNLOAD_BINARIES=false"
Environment="DAEMON_RESTART_AFTER_UPGRADE=true"
Environment="UNSAFE_SKIP_BACKUP=true"
Environment="LD_LIBRARY_PATH=/home/<your_username>/.injectived/cosmovisor/current/bin"

[Install]
WantedBy=multi-user.target
  1. 启用并启动服务

    sudo systemctl daemon-reload
    sudo systemctl enable injectived.service
    sudo systemctl start injectived.service
  2. 检查日志

    确认您的服务运行顺利:

    journalctl -u injectived.service -f

升级您的节点

链升级

Injective 会定期进行软件升级。当链上升级治理提案通过后,将指定一个区块高度,在该高度时,所有节点将自动停止运行。此时,可以安装升级后的 injectived 二进制文件,并重新启动节点。

请参阅此处以获取最新和历史的链版本。

节点升级指南

总结如下,按以下步骤升级您的节点:

  1. 将您的节点同步到升级治理提案预定的区块高度。

  2. 在预定的升级高度,节点将自动崩溃/停止运行。

  3. 删除旧的二进制文件,并安装新的发布版本二进制文件。

  4. 重新启动节点。

用 Cosmovisor 升级

有关通过 Cosmovisor 管理链升级的信息,请参阅此处。

节点维护(存储管理)

随着 Injective 状态的增长,磁盘空间可能会被占满。建议您定期通过下载新的快照来修剪链数据。除了磁盘占用开销外,当链状态较小时,节点的性能也会更好。

Injective 验证者会每日生成轻量级快照,您可以使用这些快照来清理链状态,该状态每天增长约 10-15GB,而快照通常仅 2-3GB。建议在链数据达到 300-400GB 时进行修剪。

有关快照链接及应用快照/同步节点的说明,请参阅加入主网。