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).