github.com/badrootd/nibiru-cometbft@v0.37.5-0.20240307173500-2a75559eee9b/docs/core/using-cometbft.md (about) 1 --- 2 order: 2 3 --- 4 5 # Using CometBFT 6 7 This is a guide to using the `cometbft` program from the command line. 8 It assumes only that you have the `cometbft` binary installed and have 9 some rudimentary idea of what CometBFT and ABCI are. 10 11 You can see the help menu with `cometbft --help`, and the version 12 number with `cometbft version`. 13 14 ## Directory Root 15 16 The default directory for blockchain data is `~/.cometbft`. Override 17 this by setting the `CMTHOME` environment variable. 18 19 ## Initialize 20 21 Initialize the root directory by running: 22 23 ```sh 24 cometbft init 25 ``` 26 27 This will create a new private key (`priv_validator_key.json`), and a 28 genesis file (`genesis.json`) containing the associated public key, in 29 `$CMTHOME/config`. This is all that's necessary to run a local testnet 30 with one validator. 31 32 For more elaborate initialization, see the testnet command: 33 34 ```sh 35 cometbft testnet --help 36 ``` 37 38 ### Genesis 39 40 The `genesis.json` file in `$CMTHOME/config/` defines the initial 41 CometBFT state upon genesis of the blockchain ([see 42 definition](https://github.com/cometbft/cometbft/blob/v0.37.x/types/genesis.go)). 43 44 #### Fields 45 46 - `genesis_time`: Official time of blockchain start. 47 - `chain_id`: ID of the blockchain. **This must be unique for 48 every blockchain.** If your testnet blockchains do not have unique 49 chain IDs, you will have a bad time. The ChainID must be less than 50 symbols. 50 - `initial_height`: Height at which CometBFT should begin at. If a blockchain is conducting a network upgrade, 51 starting from the stopped height brings uniqueness to previous heights. 52 - `consensus_params` ([see spec](https://github.com/cometbft/cometbft/blob/v0.37.x/spec/core/data_structures.md#consensusparams)) 53 - `block` 54 - `max_bytes`: Max block size, in bytes. 55 - `max_gas`: Max gas per block. 56 - `evidence` 57 - `max_age_num_blocks`: Max age of evidence, in blocks. The basic formula 58 for calculating this is: MaxAgeDuration / {average block time}. 59 - `max_age_duration`: Max age of evidence, in time. It should correspond 60 with an app's "unbonding period" or other similar mechanism for handling 61 [Nothing-At-Stake 62 attacks](https://github.com/ethereum/wiki/wiki/Proof-of-Stake-FAQ#what-is-the-nothing-at-stake-problem-and-how-can-it-be-fixed). 63 - `max_bytes`: This sets the maximum size in bytes of evidence that can be committed 64 in a single block and should fall comfortably under the max block bytes. 65 - `validator` 66 - `pub_key_types`: Public key types validators can use. 67 - `version` 68 - `app_version`: ABCI application version. 69 - `validators`: List of initial validators. Note this may be overridden entirely by the 70 application, and may be left empty to make explicit that the 71 application will initialize the validator set upon `InitChain`. 72 - `pub_key`: The first element specifies the key type, 73 using the declared `PubKeyName` for the adopted 74 [key type](https://github.com/cometbft/cometbft/blob/v0.37.x/crypto/ed25519/ed25519.go#L36). 75 The second element are the pubkey bytes. 76 - `power`: The validator's voting power. 77 - `name`: Name of the validator (optional). 78 - `app_hash`: The expected application hash (as returned by the 79 `ResponseInfo` ABCI message) upon genesis. If the app's hash does 80 not match, CometBFT will panic. 81 - `app_state`: The application state (e.g. initial distribution 82 of tokens). 83 84 > :warning: **ChainID must be unique to every blockchain. Reusing old chainID can cause issues** 85 86 #### Sample genesis.json 87 88 ```json 89 { 90 "genesis_time": "2023-01-21T11:17:42.341227868Z", 91 "chain_id": "test-chain-ROp9KF", 92 "initial_height": "0", 93 "consensus_params": { 94 "block": { 95 "max_bytes": "22020096", 96 "max_gas": "-1", 97 }, 98 "evidence": { 99 "max_age_num_blocks": "100000", 100 "max_age_duration": "172800000000000", 101 "max_bytes": 51200, 102 }, 103 "validator": { 104 "pub_key_types": [ 105 "ed25519" 106 ] 107 } 108 }, 109 "validators": [ 110 { 111 "address": "B547AB87E79F75A4A3198C57A8C2FDAF8628CB47", 112 "pub_key": { 113 "type": "tendermint/PubKeyEd25519", 114 "value": "P/V6GHuZrb8rs/k1oBorxc6vyXMlnzhJmv7LmjELDys=" 115 }, 116 "power": "10", 117 "name": "" 118 } 119 ], 120 "app_hash": "" 121 } 122 ``` 123 124 ## Run 125 126 To run a CometBFT node, use: 127 128 ```bash 129 cometbft node 130 ``` 131 132 By default, CometBFT will try to connect to an ABCI application on 133 `tcp://127.0.0.1:26658`. If you have the `kvstore` ABCI app installed, run it in 134 another window. If you don't, kill CometBFT and run an in-process version of 135 the `kvstore` app: 136 137 ```bash 138 cometbft node --proxy_app=kvstore 139 ``` 140 141 After a few seconds, you should see blocks start streaming in. Note that blocks 142 are produced regularly, even if there are no transactions. See [No Empty 143 Blocks](#no-empty-blocks), below, to modify this setting. 144 145 CometBFT supports in-process versions of the `counter`, `kvstore`, and `noop` 146 apps that ship as examples with `abci-cli`. It's easy to compile your app 147 in-process with CometBFT if it's written in Go. If your app is not written in 148 Go, run it in another process, and use the `--proxy_app` flag to specify the 149 address of the socket it is listening on, for instance: 150 151 ```bash 152 cometbft node --proxy_app=/var/run/abci.sock 153 ``` 154 155 You can find out what flags are supported by running `cometbft node --help`. 156 157 ## Transactions 158 159 To send a transaction, use `curl` to make requests to the CometBFT RPC 160 server, for example: 161 162 ```sh 163 curl http://localhost:26657/broadcast_tx_commit?tx=\"abcd\" 164 ``` 165 166 We can see the chain's status at the `/status` end-point: 167 168 ```sh 169 curl http://localhost:26657/status | json_pp 170 ``` 171 172 and the `latest_app_hash` in particular: 173 174 ```sh 175 curl http://localhost:26657/status | json_pp | grep latest_app_hash 176 ``` 177 178 Visit `http://localhost:26657` in your browser to see the list of other 179 endpoints. Some take no arguments (like `/status`), while others specify 180 the argument name and use `_` as a placeholder. 181 182 183 > TIP: Find the RPC Documentation [here](https://docs.cometbft.com/v0.37/rpc/) 184 185 ### Formatting 186 187 The following nuances when sending/formatting transactions should be 188 taken into account: 189 190 With `GET`: 191 192 To send a UTF8 string byte array, quote the value of the tx parameter: 193 194 ```sh 195 curl 'http://localhost:26657/broadcast_tx_commit?tx="hello"' 196 ``` 197 198 which sends a 5 byte transaction: "h e l l o" \[68 65 6c 6c 6f\]. 199 200 Note the URL must be wrapped with single quotes, else bash will ignore 201 the double quotes. To avoid the single quotes, escape the double quotes: 202 203 ```sh 204 curl http://localhost:26657/broadcast_tx_commit?tx=\"hello\" 205 ``` 206 207 Using a special character: 208 209 ```sh 210 curl 'http://localhost:26657/broadcast_tx_commit?tx="€5"' 211 ``` 212 213 sends a 4 byte transaction: "€5" (UTF8) \[e2 82 ac 35\]. 214 215 To send as raw hex, omit quotes AND prefix the hex string with `0x`: 216 217 ```sh 218 curl http://localhost:26657/broadcast_tx_commit?tx=0x01020304 219 ``` 220 221 which sends a 4 byte transaction: \[01 02 03 04\]. 222 223 With `POST` (using `json`), the raw hex must be `base64` encoded: 224 225 ```sh 226 curl --data-binary '{"jsonrpc":"2.0","id":"anything","method":"broadcast_tx_commit","params": {"tx": "AQIDBA=="}}' -H 'content-type:text/plain;' http://localhost:26657 227 ``` 228 229 which sends the same 4 byte transaction: \[01 02 03 04\]. 230 231 Note that raw hex cannot be used in `POST` transactions. 232 233 ## Reset 234 235 > :warning: **UNSAFE** Only do this in development and only if you can 236 afford to lose all blockchain data! 237 238 239 To reset a blockchain, stop the node and run: 240 241 ```sh 242 cometbft unsafe_reset_all 243 ``` 244 245 This command will remove the data directory and reset private validator and 246 address book files. 247 248 ## Configuration 249 250 CometBFT uses a `config.toml` for configuration. For details, see [the 251 config specification](./configuration.md). 252 253 Notable options include the socket address of the application 254 (`proxy_app`), the listening address of the CometBFT peer 255 (`p2p.laddr`), and the listening address of the RPC server 256 (`rpc.laddr`). 257 258 Some fields from the config file can be overwritten with flags. 259 260 ## No Empty Blocks 261 262 While the default behavior of `cometbft` is still to create blocks 263 approximately once per second, it is possible to disable empty blocks or 264 set a block creation interval. In the former case, blocks will be 265 created when there are new transactions or when the AppHash changes. 266 267 To configure CometBFT to not produce empty blocks unless there are 268 transactions or the app hash changes, run CometBFT with this 269 additional flag: 270 271 ```sh 272 cometbft node --consensus.create_empty_blocks=false 273 ``` 274 275 or set the configuration via the `config.toml` file: 276 277 ```toml 278 [consensus] 279 create_empty_blocks = false 280 ``` 281 282 Remember: because the default is to _create empty blocks_, avoiding 283 empty blocks requires the config option to be set to `false`. 284 285 The block interval setting allows for a delay (in time.Duration format [ParseDuration](https://golang.org/pkg/time/#ParseDuration)) between the 286 creation of each new empty block. It can be set with this additional flag: 287 288 ```sh 289 --consensus.create_empty_blocks_interval="5s" 290 ``` 291 292 or set the configuration via the `config.toml` file: 293 294 ```toml 295 [consensus] 296 create_empty_blocks_interval = "5s" 297 ``` 298 299 With this setting, empty blocks will be produced every 5s if no block 300 has been produced otherwise, regardless of the value of 301 `create_empty_blocks`. 302 303 ## Broadcast API 304 305 Earlier, we used the `broadcast_tx_commit` endpoint to send a 306 transaction. When a transaction is sent to a CometBFT node, it will 307 run via `CheckTx` against the application. If it passes `CheckTx`, it 308 will be included in the mempool, broadcasted to other peers, and 309 eventually included in a block. 310 311 Since there are multiple phases to processing a transaction, we offer 312 multiple endpoints to broadcast a transaction: 313 314 ```md 315 /broadcast_tx_async 316 /broadcast_tx_sync 317 /broadcast_tx_commit 318 ``` 319 320 These correspond to no-processing, processing through the mempool, and 321 processing through a block, respectively. That is, `broadcast_tx_async`, 322 will return right away without waiting to hear if the transaction is 323 even valid, while `broadcast_tx_sync` will return with the result of 324 running the transaction through `CheckTx`. Using `broadcast_tx_commit` 325 will wait until the transaction is committed in a block or until some 326 timeout is reached, but will return right away if the transaction does 327 not pass `CheckTx`. The return value for `broadcast_tx_commit` includes 328 two fields, `check_tx` and `deliver_tx`, pertaining to the result of 329 running the transaction through those ABCI messages. 330 331 The benefit of using `broadcast_tx_commit` is that the request returns 332 after the transaction is committed (i.e. included in a block), but that 333 can take on the order of a second. For a quick result, use 334 `broadcast_tx_sync`, but the transaction will not be committed until 335 later, and by that point its effect on the state may change. 336 337 Note the mempool does not provide strong guarantees - just because a tx passed 338 CheckTx (ie. was accepted into the mempool), doesn't mean it will be committed, 339 as nodes with the tx in their mempool may crash before they get to propose. 340 For more information, see the [mempool 341 write-ahead-log](./running-in-production.md#mempool-wal) 342 343 ## CometBFT Networks 344 345 When `cometbft init` is run, both a `genesis.json` and 346 `priv_validator_key.json` are created in `~/.cometbft/config`. The 347 `genesis.json` might look like: 348 349 ```json 350 { 351 "validators" : [ 352 { 353 "pub_key" : { 354 "value" : "h3hk+QE8c6QLTySp8TcfzclJw/BG79ziGB/pIA+DfPE=", 355 "type" : "tendermint/PubKeyEd25519" 356 }, 357 "power" : 10, 358 "name" : "" 359 } 360 ], 361 "app_hash" : "", 362 "chain_id" : "test-chain-rDlYSN", 363 "genesis_time" : "0001-01-01T00:00:00Z" 364 } 365 ``` 366 367 And the `priv_validator_key.json`: 368 369 ```json 370 { 371 "last_step" : 0, 372 "last_round" : "0", 373 "address" : "B788DEDE4F50AD8BC9462DE76741CCAFF87D51E2", 374 "pub_key" : { 375 "value" : "h3hk+QE8c6QLTySp8TcfzclJw/BG79ziGB/pIA+DfPE=", 376 "type" : "tendermint/PubKeyEd25519" 377 }, 378 "last_height" : "0", 379 "priv_key" : { 380 "value" : "JPivl82x+LfVkp8i3ztoTjY6c6GJ4pBxQexErOCyhwqHeGT5ATxzpAtPJKnxNx/NyUnD8Ebv3OIYH+kgD4N88Q==", 381 "type" : "tendermint/PrivKeyEd25519" 382 } 383 } 384 ``` 385 386 The `priv_validator_key.json` actually contains a private key, and should 387 thus be kept absolutely secret; for now we work with the plain text. 388 Note the `last_` fields, which are used to prevent us from signing 389 conflicting messages. 390 391 Note also that the `pub_key` (the public key) in the 392 `priv_validator_key.json` is also present in the `genesis.json`. 393 394 The genesis file contains the list of public keys which may participate 395 in the consensus, and their corresponding voting power. Greater than 2/3 396 of the voting power must be active (i.e. the corresponding private keys 397 must be producing signatures) for the consensus to make progress. In our 398 case, the genesis file contains the public key of our 399 `priv_validator_key.json`, so a CometBFT node started with the default 400 root directory will be able to make progress. Voting power uses an int64 401 but must be positive, thus the range is: 0 through 9223372036854775807. 402 Because of how the current proposer selection algorithm works, we do not 403 recommend having voting powers greater than 10\^12 (ie. 1 trillion). 404 405 If we want to add more nodes to the network, we have two choices: we can 406 add a new validator node, who will also participate in the consensus by 407 proposing blocks and voting on them, or we can add a new non-validator 408 node, who will not participate directly, but will verify and keep up 409 with the consensus protocol. 410 411 ### Peers 412 413 #### Seed 414 415 A seed node is a node who relays the addresses of other peers which they know 416 of. These nodes constantly crawl the network to try to get more peers. The 417 addresses which the seed node relays get saved into a local address book. Once 418 these are in the address book, you will connect to those addresses directly. 419 Basically the seed nodes job is just to relay everyones addresses. You won't 420 connect to seed nodes once you have received enough addresses, so typically you 421 only need them on the first start. The seed node will immediately disconnect 422 from you after sending you some addresses. 423 424 #### Persistent Peer 425 426 Persistent peers are people you want to be constantly connected with. If you 427 disconnect you will try to connect directly back to them as opposed to using 428 another address from the address book. On restarts you will always try to 429 connect to these peers regardless of the size of your address book. 430 431 All peers relay peers they know of by default. This is called the peer exchange 432 protocol (PEX). With PEX, peers will be gossiping about known peers and forming 433 a network, storing peer addresses in the addrbook. Because of this, you don't 434 have to use a seed node if you have a live persistent peer. 435 436 #### Connecting to Peers 437 438 To connect to peers on start-up, specify them in the 439 `$CMTHOME/config/config.toml` or on the command line. Use `seeds` to 440 specify seed nodes, and 441 `persistent_peers` to specify peers that your node will maintain 442 persistent connections with. 443 444 For example, 445 446 ```sh 447 cometbft node --p2p.seeds "f9baeaa15fedf5e1ef7448dd60f46c01f1a9e9c4@1.2.3.4:26656,0491d373a8e0fcf1023aaf18c51d6a1d0d4f31bd@5.6.7.8:26656" 448 ``` 449 450 Alternatively, you can use the `/dial_seeds` endpoint of the RPC to 451 specify seeds for a running node to connect to: 452 453 ```sh 454 curl 'localhost:26657/dial_seeds?seeds=\["f9baeaa15fedf5e1ef7448dd60f46c01f1a9e9c4@1.2.3.4:26656","0491d373a8e0fcf1023aaf18c51d6a1d0d4f31bd@5.6.7.8:26656"\]' 455 ``` 456 457 Note, with PEX enabled, you 458 should not need seeds after the first start. 459 460 If you want CometBFT to connect to specific set of addresses and 461 maintain a persistent connection with each, you can use the 462 `--p2p.persistent_peers` flag or the corresponding setting in the 463 `config.toml` or the `/dial_peers` RPC endpoint to do it without 464 stopping CometBFT instance. 465 466 ```sh 467 cometbft node --p2p.persistent_peers "429fcf25974313b95673f58d77eacdd434402665@10.11.12.13:26656,96663a3dd0d7b9d17d4c8211b191af259621c693@10.11.12.14:26656" 468 469 curl 'localhost:26657/dial_peers?persistent=true&peers=\["429fcf25974313b95673f58d77eacdd434402665@10.11.12.13:26656","96663a3dd0d7b9d17d4c8211b191af259621c693@10.11.12.14:26656"\]' 470 ``` 471 472 ### Adding a Non-Validator 473 474 Adding a non-validator is simple. Just copy the original `genesis.json` 475 to `~/.cometbft/config` on the new machine and start the node, 476 specifying seeds or persistent peers as necessary. If no seeds or 477 persistent peers are specified, the node won't make any blocks, because 478 it's not a validator, and it won't hear about any blocks, because it's 479 not connected to the other peer. 480 481 ### Adding a Validator 482 483 The easiest way to add new validators is to do it in the `genesis.json`, 484 before starting the network. For instance, we could make a new 485 `priv_validator_key.json`, and copy it's `pub_key` into the above genesis. 486 487 We can generate a new `priv_validator_key.json` with the command: 488 489 ```sh 490 cometbft gen_validator 491 ``` 492 493 Now we can update our genesis file. For instance, if the new 494 `priv_validator_key.json` looks like: 495 496 ```json 497 { 498 "address" : "5AF49D2A2D4F5AD4C7C8C4CC2FB020131E9C4902", 499 "pub_key" : { 500 "value" : "l9X9+fjkeBzDfPGbUM7AMIRE6uJN78zN5+lk5OYotek=", 501 "type" : "tendermint/PubKeyEd25519" 502 }, 503 "priv_key" : { 504 "value" : "EDJY9W6zlAw+su6ITgTKg2nTZcHAH1NMTW5iwlgmNDuX1f35+OR4HMN88ZtQzsAwhETq4k3vzM3n6WTk5ii16Q==", 505 "type" : "tendermint/PrivKeyEd25519" 506 }, 507 "last_step" : 0, 508 "last_round" : "0", 509 "last_height" : "0" 510 } 511 ``` 512 513 then the new `genesis.json` will be: 514 515 ```json 516 { 517 "validators" : [ 518 { 519 "pub_key" : { 520 "value" : "h3hk+QE8c6QLTySp8TcfzclJw/BG79ziGB/pIA+DfPE=", 521 "type" : "tendermint/PubKeyEd25519" 522 }, 523 "power" : 10, 524 "name" : "" 525 }, 526 { 527 "pub_key" : { 528 "value" : "l9X9+fjkeBzDfPGbUM7AMIRE6uJN78zN5+lk5OYotek=", 529 "type" : "tendermint/PubKeyEd25519" 530 }, 531 "power" : 10, 532 "name" : "" 533 } 534 ], 535 "app_hash" : "", 536 "chain_id" : "test-chain-rDlYSN", 537 "genesis_time" : "0001-01-01T00:00:00Z" 538 } 539 ``` 540 541 Update the `genesis.json` in `~/.cometbft/config`. Copy the genesis 542 file and the new `priv_validator_key.json` to the `~/.cometbft/config` on 543 a new machine. 544 545 Now run `cometbft node` on both machines, and use either 546 `--p2p.persistent_peers` or the `/dial_peers` to get them to peer up. 547 They should start making blocks, and will only continue to do so as long 548 as both of them are online. 549 550 To make a CometBFT network that can tolerate one of the validators 551 failing, you need at least four validator nodes (e.g., 2/3). 552 553 Updating validators in a live network is supported but must be 554 explicitly programmed by the application developer. See the [application 555 developers guide](../app-dev/abci-cli.md) for more details. 556 557 ### Local Network 558 559 To run a network locally, say on a single machine, you must change the `_laddr` 560 fields in the `config.toml` (or using the flags) so that the listening 561 addresses of the various sockets don't conflict. Additionally, you must set 562 `addr_book_strict=false` in the `config.toml`, otherwise CometBFT's p2p 563 library will deny making connections to peers with the same IP address. 564 565 ### Upgrading 566 567 See the 568 [UPGRADING.md](https://github.com/cometbft/cometbft/blob/v0.37.x/UPGRADING.md) 569 guide. You may need to reset your chain between major breaking releases. 570 Although, we expect CometBFT to have fewer breaking releases in the future 571 (especially after 1.0 release).