RPC
===

Coming soon: RPC docs powered by `slate <https://github.com/lord/slate>`__. Until then, read on.

Tendermint supports the following RPC protocols:

-  URI over HTTP
-  JSONRPC over HTTP
-  JSONRPC over websockets

Tendermint RPC is build using `our own RPC
library <https://github.com/tendermint/tendermint/tree/master/rpc/lib>`__.
Documentation and tests for that library could be found at
``tendermint/rpc/lib`` directory.

Configuration
~~~~~~~~~~~~~

Set the ``laddr`` config parameter under ``[rpc]`` table in the
$TMHOME/config/config.toml file or the ``--rpc.laddr`` command-line flag to the
desired protocol://host:port setting. Default: ``tcp://0.0.0.0:46657``.

Arguments
~~~~~~~~~

Arguments which expect strings or byte arrays may be passed as quoted
strings, like ``"abc"`` or as ``0x``-prefixed strings, like
``0x616263``.

URI/HTTP
~~~~~~~~

Example request:

.. code:: bash

    curl -s 'http://localhost:46657/broadcast_tx_sync?tx="abc"' | jq .

Response:

.. code:: json

    {
      "error": "",
      "result": {
        "hash": "2B8EC32BA2579B3B8606E42C06DE2F7AFA2556EF",
        "log": "",
        "data": "",
        "code": 0
      },
      "id": "",
      "jsonrpc": "2.0"
    }

The first entry in the result-array (``96``) is the method this response
correlates with. ``96`` refers to "ResultTypeBroadcastTx", see
`responses.go <https://github.com/tendermint/tendermint/blob/master/rpc/core/types/responses.go>`__
for a complete overview.

JSONRPC/HTTP
~~~~~~~~~~~~

JSONRPC requests can be POST'd to the root RPC endpoint via HTTP (e.g.
``http://localhost:46657/``).

Example request:

.. code:: json

    {
      "method": "broadcast_tx_sync",
      "jsonrpc": "2.0",
      "params": [ "abc" ],
      "id": "dontcare"
    }

JSONRPC/websockets
~~~~~~~~~~~~~~~~~~

JSONRPC requests can be made via websocket. The websocket endpoint is at
``/websocket``, e.g. ``http://localhost:46657/websocket``. Asynchronous
RPC functions like event ``subscribe`` and ``unsubscribe`` are only
available via websockets.

Endpoints
~~~~~~~~~

An HTTP Get request to the root RPC endpoint (e.g.
``http://localhost:46657``) shows a list of available endpoints.

::

    Available endpoints:
    http://localhost:46657/abci_info
    http://localhost:46657/dump_consensus_state
    http://localhost:46657/genesis
    http://localhost:46657/net_info
    http://localhost:46657/num_unconfirmed_txs
    http://localhost:46657/health
    http://localhost:46657/status
    http://localhost:46657/unconfirmed_txs
    http://localhost:46657/unsafe_flush_mempool
    http://localhost:46657/unsafe_stop_cpu_profiler
    http://localhost:46657/validators

    Endpoints that require arguments:
    http://localhost:46657/abci_query?path=_&data=_&prove=_
    http://localhost:46657/block?height=_
    http://localhost:46657/blockchain?minHeight=_&maxHeight=_
    http://localhost:46657/broadcast_tx_async?tx=_
    http://localhost:46657/broadcast_tx_commit?tx=_
    http://localhost:46657/broadcast_tx_sync?tx=_
    http://localhost:46657/commit?height=_
    http://localhost:46657/dial_seeds?seeds=_
    http://localhost:46657/dial_peers?peers=_&persistent=_
    http://localhost:46657/subscribe?event=_
    http://localhost:46657/tx?hash=_&prove=_
    http://localhost:46657/unsafe_start_cpu_profiler?filename=_
    http://localhost:46657/unsafe_write_heap_profile?filename=_
    http://localhost:46657/unsubscribe?event=_

tx
~~

Returns a transaction matching the given transaction hash.

**Parameters**

1. hash - the transaction hash
2. prove - include a proof of the transaction inclusion in the block in
   the result (optional, default: false)

**Returns**

-  ``proof``: the ``types.TxProof`` object
-  ``tx``: ``[]byte`` - the transaction
-  ``tx_result``: the ``abci.Result`` object
-  ``index``: ``int`` - index of the transaction
-  ``height``: ``int`` - height of the block where this transaction was
   in

**Example**

.. code:: bash

    curl -s 'http://localhost:46657/broadcast_tx_commit?tx="abc"' | jq .
    # {
    #   "error": "",
    #   "result": {
    #     "hash": "2B8EC32BA2579B3B8606E42C06DE2F7AFA2556EF",
    #     "log": "",
    #     "data": "",
    #     "code": 0
    #   },
    #   "id": "",
    #   "jsonrpc": "2.0"
    # }

    curl -s 'http://localhost:46657/tx?hash=0x2B8EC32BA2579B3B8606E42C06DE2F7AFA2556EF' | jq .
    # {
    #   "error": "",
    #   "result": {
    #     "proof": {
    #       "Proof": {
    #         "aunts": []
    #       },
    #       "Data": "YWJjZA==",
    #       "RootHash": "2B8EC32BA2579B3B8606E42C06DE2F7AFA2556EF",
    #       "Total": 1,
    #       "Index": 0
    #     },
    #     "tx": "YWJjZA==",
    #     "tx_result": {
    #       "log": "",
    #       "data": "",
    #       "code": 0
    #     },
    #     "index": 0,
    #     "height": 52
    #   },
    #   "id": "",
    #   "jsonrpc": "2.0"
    # }

More Examples
~~~~~~~~~~~~~

See the various bash tests using curl in ``test/``, and examples using
the ``Go`` API in ``rpc/client/``.
