130 lines
4.5 KiB
Markdown
130 lines
4.5 KiB
Markdown
# 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__:<br/>
|
|
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__:<br/>
|
|
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__:<br/>
|
|
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__:<br/>
|
|
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__:<br/>
|
|
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__:<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.
|
|
|
|
#### InitChain
|
|
* __Arguments__:
|
|
* `Validators ([]Validator)`: Initial genesis validators
|
|
* __Usage__:<br/>
|
|
Called once upon genesis
|
|
|
|
#### BeginBlock
|
|
* __Arguments__:
|
|
* `Height (uint64)`: The block height that is starting
|
|
* __Usage__:<br/>
|
|
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__:<br/>
|
|
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.
|