# Tendermint Socket Protocol (TMSP) 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. For more information on TMSP, motivations, and tutorials, please visit [our blog post](http://tendermint.com/posts/tendermint-socket-protocol/). Other implementations: * [cpp-tmsp](https://github.com/mdyring/cpp-tmsp) by Martin Dyring-Andersen * [js-tmsp](https://github.com/tendermint/js-tmsp) ## 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...`. ## Message types TMSP requests/responses are simple Protobuf messages. Check out the [schema file](https://github.com/tendermint/tmsp/blob/master/types/types.proto). #### AppendTx * __Arguments__: * `Data ([]byte)`: The request transaction bytes * __Returns__: * `Code (uint32)`: Response code * `Data ([]byte)`: Result bytes, if any * `Log (string)`: Debug or error message * __Usage__:
Append and run a transaction. If the transaction is valid, returns CodeType.OK #### CheckTx * __Arguments__: * `Data ([]byte)`: The request transaction bytes * __Returns__: * `Code (uint32)`: Response code * `Data ([]byte)`: Result bytes, if any * `Log (string)`: Debug or error message * __Usage__:
Validate a transaction. This message should not mutate the state. Transactions are first run through CheckTx before broadcast to peers in the mempool layer. 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. #### Commit * __Returns__: * `Data ([]byte)`: The Merkle root hash * `Log (string)`: Debug or error message * __Usage__:
Return a Merkle root hash of the application state. #### Query * __Arguments__: * `Data ([]byte)`: The query request bytes * __Returns__: * `Code (uint32)`: Response code * `Data ([]byte)`: The query response bytes * `Log (string)`: Debug or error message #### Flush * __Usage__:
Flush the response queue. Applications that implement `types.Application` need not implement this message -- it's handled by the project. #### Info * __Returns__: * `Data ([]byte)`: The info bytes * __Usage__:
Return information about the application state. Application specific. #### SetOption * __Arguments__: * `Key (string)`: Key to set * `Value (string)`: Value to set for key * __Returns__: * `Log (string)`: Debug or error message * __Usage__:
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. #### InitChain * __Arguments__: * `Validators ([]Validator)`: Initial genesis validators * __Usage__:
Called once upon genesis #### BeginBlock * __Arguments__: * `Height (uint64)`: The block height that is starting * __Usage__:
Signals the beginning of a new block. Called prior to any AppendTxs. #### EndBlock * __Arguments__: * `Height (uint64)`: The block height that ended * __Returns__: * `Validators ([]Validator)`: Changed validators with new voting powers (0 to remove) * __Usage__:
Signals the end of a block. Called prior to each Commit after all transactions ## Changelog ##### Mar 26h, 2016 * Introduce BeginBlock ##### Mar 6th, 2016 * Added InitChain, EndBlock ##### Feb 14th, 2016 * s/GetHash/Commit/g * Document Protobuf request/response fields ##### Jan 23th, 2016 * Added CheckTx/Query TMSP message types * Added Result/Log fields to AppendTx/CheckTx/SetOption * Removed Listener messages * Removed Code from ResponseSetOption and ResponseGetHash * Made examples BigEndian ##### Jan 12th, 2016 * Added "RetCodeBadNonce = 0x06" return code ##### Jan 8th, 2016 * Tendermint/TMSP now comes to consensus on the order first before AppendTx.