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