概述本节说明如何运行一个区块链节点。本教程使用的应用是
simapp,对应的 CLI 二进制为 simd。前置阅读
- 前置条件 - 设置 Go 并构建
simd二进制 - Cosmos SDK 应用的结构
- 设置 keyring
1. 初始化链
在运行节点之前,先初始化链及其创世文件。使用init 子命令:
Windows 用户:请将
~/.simapp 替换为 %USERPROFILE%\.simapp(或 PowerShell 中的 $HOME\.simapp)。对于本教程中的 jq 和 sed 命令,请通过 Chocolatey 安装(choco install jq sed),或使用 Git Bash/WSL2。~/.simapp 文件夹具有以下结构:
2. 更新配置项(可选)
如需修改配置文件中的字段值(例如genesis.json),可使用 jq(安装 和 文档)以及 sed 命令。下面列出几个示例。
客户端交互
实例化节点时,gRPC 和 REST 默认仅绑定到 localhost,以避免节点在未知情况下暴露给公众。建议不要在没有代理的情况下直接暴露这些端点,代理应能够在节点与公众之间处理负载均衡或身份验证。3. 添加创世账户
在本教程前面,你已经在 keyring 中创建了一个账户,名称为my_validator,使用的是 test keyring backend。
现在,你可以在链的创世文件中为该账户分配一些 stake 代币。这样做也能确保你的链知道这个账户的存在:
$MY_VALIDATOR_ADDRESS 是一个变量,保存了keyring中 my_validator 密钥的地址。还要注意,Cosmos SDK 中的代币采用 {amount}{denom} 格式:amount 是一个 18 位精度的小数值,denom 是带有面额键的唯一代币标识符(例如 atom 或 uatom)。这里分配的是 stake 代币,因为在 simapp 中,stake 是用于质押的代币标识符。对于你自己的链,如果有自己的质押 denom,则应改用对应的代币标识符。
4. 创建创世交易
现在你的账户已经有了一些代币,你需要向链中添加一个验证者。验证者是特殊的全节点,会参与共识过程(由底层共识引擎实现),从而向链中添加新区块。任何账户都可以声明自己想成为验证者运营者,但只有获得足够委托的账户才能进入活跃集合(例如,在 Cosmos Hub 中,只有委托量最高的前 125 个验证者候选人才能成为验证者)。在本指南中,你的本地节点(通过上面的init 命令创建)将被加入为链的一个验证者。链首次启动前,可以通过包含在创世文件中的一种特殊交易 gentx 来声明验证者:
- 创建一个 gentx。
- 将 gentx 添加到创世文件中:
gentx 会完成三件事:
- 将你创建的验证者账户注册为验证者运营者账户(即控制该验证者的账户)。
- 为其自我委托给定
amount数量的质押代币。 - 将运营者账户与一个用于签署区块的 CometBFT 节点公钥关联起来。如果未提供
--pubkey标志,则默认使用上面通过simd init命令创建的本地节点公钥。
gentx 信息,可使用以下命令:
5. 使用 app.toml 和 config.toml 配置节点
Cosmos SDK 会自动在 ~/.simapp/config 中生成两个配置文件:
config.toml:用于配置 CometBFT,更多信息请参阅 CometBFT 文档,app.toml:由 Cosmos SDK 生成,用于配置你的应用,例如状态裁剪策略、遥测、gRPC 和 REST 服务器配置、状态同步等。
app.toml 中的 minimum-gas-prices 字段,它定义了验证者节点愿意接受的处理交易的最低 gas 价格。根据不同链的设置,它可能为空字符串,也可能不是。如果它为空,请务必为该字段设置一个值,例如 10token,否则节点会在启动时停止。出于本教程目的,最低 gas 价格设置为 0:
6. 启动节点
现在一切都已设置完成,你终于可以启动节点了:节点启动时会发生什么
start 命令(定义于 server/start.go)会按以下顺序启动全节点:
- 打开包含最新持久化状态的
db(默认是 LevelDB)。首次启动时,这里是空的。 - 通过
appCreator函数创建一个新的应用实例,该函数就是应用构造函数。 - 使用该应用实例化一个 CometBFT 节点。作为
node.New的一部分,CometBFT 会检查应用的区块高度是否与自身一致。如果应用落后,它会重放区块以追赶进度。如果高度为0,它会调用InitChain根据创世文件初始化状态。 - 一旦同步完成,节点会启动其 RPC 和 P2P 服务器并开始连接对等节点。在握手期间,如果节点落后于其对等节点,它会按顺序查询缺失的区块。追上后,它会等待新的区块提案和验证者签名。
docker-compose.yml。
独立运行的 App/CometBFT
默认情况下,Cosmos SDK 会让 CometBFT 与应用在同一进程内运行。 如果你希望让应用和 CometBFT 分别在不同进程中运行, 请使用--with-comet=false 标志启动应用,
并将 config.toml 中的 rpc.laddr 设置为 CometBFT 节点的 RPC 地址。
日志
日志提供了一种查看节点运行情况的方式。默认日志级别是info。这是一个全局级别,所有 info 日志都会输出到终端。如果你希望输出到终端的是特定日志而不是全部日志,可以通过设置 module:log_level 来实现。
config.toml 中的示例:
详细日志级别
某些操作(例如链升级)会在更高日志级别启用时输出额外日志。你可以通过--verbose_log_level 标志来控制:
状态同步
状态同步是指节点同步区块链最新状态或接近最新状态的过程。这对于不想同步全部历史区块的用户很有用。更多内容请阅读 CometBFT 文档。 状态同步依赖快照机制。你可以在这里了解 SDK 如何处理快照。本地状态同步
本地状态同步与普通状态同步类似,不同之处在于它基于本地状态快照,而不是通过 p2p 网络提供的快照。启动本地状态同步的步骤与普通状态同步相近,但在设计上有一些不同考虑。- 如状态同步文档所述,必须在
config.toml中设置高度和哈希值,并配置若干 RPC 服务器(上面的链接中包含具体说明)。 - 运行
<appd> snapshot restore <height> <format>以恢复本地快照(注意:首先要使用 load 命令从文件中加载它)。 - 在快照导入后引导 Comet 状态,以便启动节点。这可以通过引导命令
<app> comet bootstrap-state完成
快照命令
Cosmos SDK 提供了用于管理快照的命令。 可以在应用中通过以下代码片段将这些命令添加到cmd/<app>/root.go:
<appd> snapshots [command] 下使用以下命令:
- list:列出本地快照
- load:将快照归档文件加载到快照存储中
- restore:从本地快照恢复应用状态
- export:将应用状态导出到快照存储中
- dump:将快照导出为可移植归档格式
- delete:删除本地快照
恭喜!
你的节点现已运行并开始生成区块。你已经成功从零初始化了一条 Cosmos SDK 区块链。后续步骤
SynopsisThis section explains how to run a blockchain node. The application used in this tutorial is
simapp, and its corresponding CLI binary simd.Prerequisite Readings
- Prerequisites - Set up Go and build the
simdbinary - Anatomy of a Cosmos SDK Application
- Setting up the keyring
1. Initialize the chain
Before running the node, initialize the chain and its genesis file. Use theinit subcommand:
Windows users: Replace
~/.simapp with %USERPROFILE%\.simapp (or $HOME\.simapp in PowerShell). For jq and sed commands in this tutorial, install via Chocolatey (choco install jq sed) or use Git Bash/WSL2.~/.simapp folder has the following structure:
2. Update configuration settings (optional)
To change field values in configuration files (for example, genesis.json), usejq (installation & docs) and sed commands. A few examples are listed here.
Client Interaction
When instantiating a node, gRPC and REST are defaulted to localhost to avoid unknown exposure of your node to the public. It is recommended not to expose these endpoints without a proxy that can handle load balancing or authentication set up between your node and the public.3. Add genesis accounts
Earlier in this tutorial, you created an account in the keyring namedmy_validator under the test keyring backend.
Now, you can grant this account some stake tokens in your chain’s genesis file. Doing so will also make sure your chain is aware of this account’s existence:
$MY_VALIDATOR_ADDRESS is a variable that holds the address of the my_validator key in the keyring. Also note that the tokens in the Cosmos SDK have the {amount}{denom} format: amount is an 18-digit-precision decimal number, and denom is the unique token identifier with its denomination key (e.g., atom or uatom). Here, stake tokens are granted, as stake is the token identifier used for staking in simapp. For your own chain with its own staking denom, that token identifier should be used instead.
4. Create genesis transaction
Now that your account has some tokens, you need to add a validator to your chain. Validators are special full-nodes that participate in the consensus process (implemented in the underlying consensus engine) in order to add new blocks to the chain. Any account can declare its intention to become a validator operator, but only those with sufficient delegation get to enter the active set (for example, only the top 125 validator candidates with the most delegation get to be validators in the Cosmos Hub). For this guide, your local node (created via theinit command above) will be added as a validator of your chain. Validators can be declared before a chain is first started via a special transaction included in the genesis file called a gentx:
- Create a gentx.
- Add the gentx to the genesis file:
gentx does three things:
- Registers the validator account you created as a validator operator account (i.e., the account that controls the validator).
- Self-delegates the provided
amountof staking tokens. - Link the operator account with a CometBFT node pubkey that will be used for signing blocks. If no
--pubkeyflag is provided, it defaults to the local node pubkey created via thesimd initcommand above.
gentx, use the following command:
5. Configure the node using app.toml and config.toml
The Cosmos SDK automatically generates two configuration files inside ~/.simapp/config:
config.toml: used to configure the CometBFT, learn more on CometBFT’s documentation,app.toml: generated by the Cosmos SDK, and used to configure your app, such as state pruning strategies, telemetry, gRPC and REST server configuration, state sync…
minimum-gas-prices field inside app.toml, which defines the minimum gas prices the validator node is willing to accept for processing a transaction. Depending on the chain, it might be an empty string or not. If it’s empty, make sure to edit the field with some value, for example 10token, or else the node will halt on startup. For the purposes of this tutorial, the minimum gas price is set to 0:
6. Start the node
Now that everything is set up, you can finally start your node:What happens when the node starts
Thestart command (defined in server/start.go) boots up the full-node in the following sequence:
- It opens the
db(LevelDB by default) containing the latest persisted state. On first start, this is empty. - It creates a new instance of the application via an
appCreatorfunction, which is the application constructor. - It instantiates a CometBFT node using the application. As part of
node.New, CometBFT checks that the application’s block height matches its own. If the application is behind, it replays blocks to catch up. If the height is0, it callsInitChainto initialize state from the genesis file. - Once in sync, the node starts its RPC and P2P servers and begins dialing peers. During the handshake, if the node is behind its peers, it queries missing blocks sequentially. Once caught up, it waits for new block proposals and validator signatures.
docker-compose.yml.
Standalone App/CometBFT
By default, the Cosmos SDK runs CometBFT in-process with the application If you want to run the application and CometBFT in separate processes, start the application with the--with-comet=false flag
and set rpc.laddr in config.toml to the CometBFT node’s RPC address.
Logging
Logging provides a way to see what is going on with a node. The default logging level isinfo. This is a global level and all info logs will be outputted to the terminal. If you would like to filter specific logs to the terminal instead of all, then setting module:log_level is how this can work.
Example in config.toml:
Verbose log level
Some operations, such as chain upgrades, emit additional log messages when a higher log level is active. You can control this with the--verbose_log_level flag:
State Sync
State sync is the act in which a node syncs the latest or close to the latest state of a blockchain. This is useful for users who don’t want to sync all the blocks in history. Read more in CometBFT documentation. State sync works thanks to snapshots. Read how the SDK handles snapshots here.Local State Sync
Local state sync works similarly to normal state sync except that it works off a local snapshot of state instead of one provided via the p2p network. The steps to start local state sync are similar to normal state sync with a few different design considerations.- As mentioned in the state sync documentation, one must set a height and hash in the config.toml along with a few RPC servers (the aforementioned link has instructions on how to do this).
- Run
<appd> snapshot restore <height> <format>to restore a local snapshot (note: first load it from a file with the load command). - Bootstrapping Comet state to start the node after the snapshot has been ingested. This can be done with the bootstrap command
<app> comet bootstrap-state
Snapshots Commands
The Cosmos SDK provides commands for managing snapshots. These commands can be added in an app with the following snippet incmd/<app>/root.go:
<appd> snapshots [command]:
- list: list local snapshots
- load: Load a snapshot archive file into snapshot store
- restore: Restore app state from local snapshot
- export: Export app state to snapshot store
- dump: Dump the snapshot as portable archive format
- delete: Delete a local snapshot
Congratulations!
Your node is now running and producing blocks. You have successfully initialized a Cosmos SDK blockchain from scratch.Next steps
- Interact with the node to send transactions and query state
- Generate and sign transactions to learn advanced transaction workflows