2015-12-03 15:47:20 -08:00
# Tendermint Socket Protocol (TMSP)
2015-11-02 07:39:53 -08:00
2016-07-06 17:01:20 -04:00
[](https://circleci.com/gh/tendermint/tmsp)
2016-01-01 19:09:03 -08:00
Blockchains are a system for creating shared multi-master application state.
**TMSP** is a socket protocol enabling a blockchain consensus engine, running in one process,
to manage a blockchain application state, running in another.
2015-11-02 07:39:53 -08:00
2016-01-01 18:19:58 -08:00
For more information on TMSP, motivations, and tutorials, please visit [our blog post ](http://tendermint.com/posts/tendermint-socket-protocol/ ).
2016-04-15 15:01:05 -07:00
Other implementations:
* [cpp-tmsp ](https://github.com/mdyring/cpp-tmsp ) by Martin Dyring-Andersen
* [js-tmsp ](https://github.com/tendermint/js-tmsp )
2016-07-23 17:37:09 -04:00
## Contents
This repository holds a number of important pieces:
- `types/types.proto`
- the protobuf file definig TMSP message types, and the optional grpc interface.
2016-07-23 18:54:58 -04:00
- use `protoc --go_out=plugins=grpc:. types.proto` to from the `types` dir to generate the `types/types.pb.go` file
2016-07-23 17:37:09 -04:00
- see `protoc --help` and [the grpc docs ](www.grpc.io/docs ) for examples and details of other languages
- golang implementation of TMSP client and server
- two implementations:
- asynchronous, ordered message passing over unix or tcp
- grpc
- TendermintCore runs a client, and the application runs a server
- `cmd/tmsp-cli`
- command line tool wrapping the client for probing/testing a TMSP application
2016-07-23 18:54:58 -04:00
- use `tmsp-cli --version` to get the TMSP version
2016-07-23 17:37:09 -04:00
- examples:
- the `cmd/counter` application, which illustrates nonce checking in txs
- the `cmd/dummy` application, which illustrates a simple key-value merkle tree
2016-05-04 13:37:22 -07:00
## Message format
Since this is a streaming protocol, all messages are encoded with a length-prefix followed by the message encoded in Protobuf3. Protobuf3 doesn't have an official length-prefix standard, so we use our own. The first byte represents the length of the big-endian encoded length.
For example, if the Protobuf3 encoded TMSP message is `0xDEADBEEF` (4 bytes), the length-prefixed message is `0x0104DEADBEEF` . If the Protobuf3 encoded TMSP message is 65535 bytes long, the length-prefixed message would be like `0x02FFFF...` .
2015-11-02 07:39:53 -08:00
## Message types
2016-02-14 12:51:49 -08:00
TMSP requests/responses are simple Protobuf messages. Check out the [schema file ](https://github.com/tendermint/tmsp/blob/master/types/types.proto ).
2015-11-02 07:39:53 -08:00
#### AppendTx
* __Arguments__:
2016-02-14 12:51:49 -08:00
* `Data ([]byte)` : The request transaction bytes
2015-11-02 07:39:53 -08:00
* __Returns__:
2016-03-05 19:18:34 -08:00
* `Code (uint32)` : Response code
2016-02-14 12:51:49 -08:00
* `Data ([]byte)` : Result bytes, if any
* `Log (string)` : Debug or error message
2015-11-02 07:39:53 -08:00
* __Usage__:< br />
2016-02-14 12:51:49 -08:00
Append and run a transaction. If the transaction is valid, returns CodeType.OK
2015-11-02 07:39:53 -08:00
2016-01-08 16:52:02 -08:00
#### CheckTx
* __Arguments__:
2016-02-14 12:51:49 -08:00
* `Data ([]byte)` : The request transaction bytes
2015-11-02 07:39:53 -08:00
* __Returns__:
2016-03-05 19:18:34 -08:00
* `Code (uint32)` : Response code
2016-02-14 12:51:49 -08:00
* `Data ([]byte)` : Result bytes, if any
* `Log (string)` : Debug or error message
2015-11-02 07:39:53 -08:00
* __Usage__:< br />
2016-01-08 16:52:02 -08:00
Validate a transaction. This message should not mutate the state.
2016-02-14 12:51:49 -08:00
Transactions are first run through CheckTx before broadcast to peers in the mempool layer.
2016-03-26 22:35:23 -07:00
You can make CheckTx semi-stateful and clear the state upon `Commit` or `BeginBlock` ,
to allow for dependent sequences of transactions in the same block.
2015-11-02 07:39:53 -08:00
2016-02-14 12:51:49 -08:00
#### Commit
2015-11-02 07:39:53 -08:00
* __Returns__:
2016-02-14 12:51:49 -08:00
* `Data ([]byte)` : The Merkle root hash
* `Log (string)` : Debug or error message
2015-11-02 07:39:53 -08:00
* __Usage__:< br />
2016-02-14 12:51:49 -08:00
Return a Merkle root hash of the application state.
#### Query
* __Arguments__:
* `Data ([]byte)` : The query request bytes
* __Returns__:
2016-03-05 19:18:34 -08:00
* `Code (uint32)` : Response code
2016-02-14 12:51:49 -08:00
* `Data ([]byte)` : The query response bytes
* `Log (string)` : Debug or error message
2015-11-02 07:39:53 -08:00
2015-11-16 15:50:26 -08:00
#### Flush
* __Usage__:< br />
Flush the response queue. Applications that implement `types.Application` need not implement this message -- it's handled by the project.
#### Info
* __Returns__:
2016-02-14 12:51:49 -08:00
* `Data ([]byte)` : The info bytes
2015-11-16 15:50:26 -08:00
* __Usage__:< br />
2016-02-14 12:51:49 -08:00
Return information about the application state. Application specific.
2015-11-16 15:50:26 -08:00
2015-11-27 10:14:46 -08:00
#### SetOption
* __Arguments__:
2016-02-14 12:51:49 -08:00
* `Key (string)` : Key to set
* `Value (string)` : Value to set for key
2015-11-27 10:14:46 -08:00
* __Returns__:
2016-02-14 12:51:49 -08:00
* `Log (string)` : Debug or error message
2015-11-27 10:14:46 -08:00
* __Usage__:< br />
Set application options. E.g. Key="mode", Value="mempool" for a mempool connection, or Key="mode", Value="consensus" for a consensus connection.
Other options are application specific.
2016-01-08 16:52:02 -08:00
2016-03-05 19:18:34 -08:00
#### InitChain
2016-02-28 18:53:24 -08:00
* __Arguments__:
* `Validators ([]Validator)` : Initial genesis validators
* __Usage__:< br />
2016-03-05 19:18:34 -08:00
Called once upon genesis
2016-02-28 18:53:24 -08:00
2016-03-26 22:35:23 -07:00
#### BeginBlock
* __Arguments__:
* `Height (uint64)` : The block height that is starting
* __Usage__:< br />
Signals the beginning of a new block. Called prior to any AppendTxs.
2016-03-05 19:18:34 -08:00
#### EndBlock
2016-03-06 17:57:47 -08:00
* __Arguments__:
* `Height (uint64)` : The block height that ended
2016-02-28 18:53:24 -08:00
* __Returns__:
* `Validators ([]Validator)` : Changed validators with new voting powers (0 to remove)
* __Usage__:< br />
2016-03-05 19:18:34 -08:00
Signals the end of a block. Called prior to each Commit after all transactions
2016-02-28 18:53:24 -08:00
2016-05-04 13:37:22 -07:00
## Changelog
2016-03-26 22:35:23 -07:00
2016-05-04 13:37:22 -07:00
##### Mar 26h, 2016
2016-03-26 22:35:23 -07:00
* Introduce BeginBlock
2016-01-08 16:52:02 -08:00
2016-05-04 13:37:22 -07:00
##### Mar 6th, 2016
2016-02-28 18:53:24 -08:00
2016-03-06 17:57:47 -08:00
* Added InitChain, EndBlock
2016-02-28 18:53:24 -08:00
2016-05-04 13:37:22 -07:00
##### Feb 14th, 2016
2016-02-14 12:51:49 -08:00
* s/GetHash/Commit/g
* Document Protobuf request/response fields
2016-05-04 13:37:22 -07:00
##### Jan 23th, 2016
2016-01-23 20:49:15 -08:00
* Added CheckTx/Query TMSP message types
2016-01-25 08:01:18 -08:00
* Added Result/Log fields to AppendTx/CheckTx/SetOption
2016-01-23 20:49:15 -08:00
* Removed Listener messages
2016-01-25 08:01:18 -08:00
* Removed Code from ResponseSetOption and ResponseGetHash
* Made examples BigEndian
2016-01-23 20:49:15 -08:00
2016-05-04 13:37:22 -07:00
##### Jan 12th, 2016
2016-01-12 14:04:24 -08:00
* Added "RetCodeBadNonce = 0x06" return code
2016-05-04 13:37:22 -07:00
##### Jan 8th, 2016
2016-01-08 16:52:02 -08:00
2016-03-26 22:35:23 -07:00
* Tendermint/TMSP now comes to consensus on the order first before AppendTx.