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: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 is info. 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 settingmodule:log_level is how this can work.
Example:
In config.toml:
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