WIP: Mempool specificationpull/1139/head
@ -0,0 +1,11 @@ | |||||
# Mempool Specification | |||||
This package contains documents specifying the functionality | |||||
of the mempool module. | |||||
Components: | |||||
* [Config](./config.md) - how to configure it | |||||
* [External Messages](./messages.md) - The messages we accept over p2p and rpc interfaces | |||||
* [Functionality](./functionality.md) - high-level description of the functionality it provides | |||||
* [Concurrency Model](./concurrency.md) - What guarantees we provide, what locks we require. |
@ -0,0 +1,8 @@ | |||||
# Mempool Concurrency | |||||
Look at the concurrency model this uses... | |||||
* Receiving CheckTx | |||||
* Broadcasting new tx | |||||
* Interfaces with consensus engine, reap/update while checking | |||||
* Calling the ABCI app (ordering. callbacks. how proxy works alongside the blockchain proxy which actually writes blocks) |
@ -0,0 +1,59 @@ | |||||
# Mempool Configuration | |||||
Here we describe configuration options around mempool. | |||||
For the purposes of this document, they are described | |||||
as command-line flags, but they can also be passed in as | |||||
environmental variables or in the config.toml file. The | |||||
following are all equivalent: | |||||
Flag: `--mempool.recheck_empty=false` | |||||
Environment: `TM_MEMPOOL_RECHECK_EMPTY=false` | |||||
Config: | |||||
``` | |||||
[mempool] | |||||
recheck_empty = false | |||||
``` | |||||
## Recheck | |||||
`--mempool.recheck=false` (default: true) | |||||
`--mempool.recheck_empty=false` (default: true) | |||||
Recheck determines if the mempool rechecks all pending | |||||
transactions after a block was committed. Once a block | |||||
is committed, the mempool removes all valid transactions | |||||
that were successfully included in the block. | |||||
If `recheck` is true, then it will rerun CheckTx on | |||||
all remaining transactions with the new block state. | |||||
If the block contained no transactions, it will skip the | |||||
recheck unless `recheck_empty` is true. | |||||
## Broadcast | |||||
`--mempool.broadcast=false` (default: true) | |||||
Determines whether this node gossips any valid transactions | |||||
that arrive in mempool. Default is to gossip anything that | |||||
passes checktx. If this is disabled, transactions are not | |||||
gossiped, but instead stored locally and added to the next | |||||
block this node is the proposer. | |||||
## WalDir | |||||
`--mempool.wal_dir=/tmp/gaia/mempool.wal` (default: $TM_HOME/data/mempool.wal) | |||||
This defines the directory where mempool writes the write-ahead | |||||
logs. These files can be used to reload unbroadcasted | |||||
transactions if the node crashes. | |||||
If the directory passed in is an absolute path, the wal file is | |||||
created there. If the directory is a relative path, the path is | |||||
appended to home directory of the tendermint process to | |||||
generate an absolute path to the wal directory | |||||
(default `$HOME/.tendermint` or set via `TM_HOME` or `--home``) |
@ -0,0 +1,37 @@ | |||||
# Mempool Functionality | |||||
The mempool maintains a list of potentially valid transactions, | |||||
both to broadcast to other nodes, as well as to provide to the | |||||
consensus reactor when it is selected as the block proposer. | |||||
There are two sides to the mempool state: | |||||
* External: get, check, and broadcast new transactions | |||||
* Internal: return valid transaction, update list after block commit | |||||
## External functionality | |||||
External functionality is exposed via network interfaces | |||||
to potentially untrusted actors. | |||||
* CheckTx - triggered via RPC or P2P | |||||
* Broadcast - gossip messages after a successful check | |||||
## Internal functionality | |||||
Internal functionality is exposed via method calls to other | |||||
code compiled into the tendermint binary. | |||||
* Reap - get tx to propose in next block | |||||
* Update - remove tx that were included in last block | |||||
* ABCI.CheckTx - call ABCI app to validate the tx | |||||
What does it provide the consensus reactor? | |||||
What guarantees does it need from the ABCI app? | |||||
(talk about interleaving processes in concurrency) | |||||
## Optimizations | |||||
Talk about the LRU cache to make sure we don't process any | |||||
tx that we have seen before |
@ -0,0 +1,60 @@ | |||||
# Mempool Messages | |||||
## P2P Messages | |||||
There is currently only one message that Mempool broadcasts | |||||
and receives over the p2p gossip network (via the reactor): | |||||
`TxMessage` | |||||
```go | |||||
// TxMessage is a MempoolMessage containing a transaction. | |||||
type TxMessage struct { | |||||
Tx types.Tx | |||||
} | |||||
``` | |||||
TxMessage is go-wire encoded and prepended with `0x1` as a | |||||
"type byte". This is followed by a go-wire encoded byte-slice. | |||||
Prefix of 40=0x28 byte tx is: `0x010128...` followed by | |||||
the actual 40-byte tx. Prefix of 350=0x015e byte tx is: | |||||
`0x0102015e...` followed by the actual 350 byte tx. | |||||
(Please see the [go-wire repo](https://github.com/tendermint/go-wire#an-interface-example) for more information) | |||||
## RPC Messages | |||||
Mempool exposes `CheckTx([]byte)` over the RPC interface. | |||||
It can be posted via `broadcast_commit`, `broadcast_sync` or | |||||
`broadcast_async`. They all parse a message with one argument, | |||||
`"tx": "HEX_ENCODED_BINARY"` and differ in only how long they | |||||
wait before returning (sync makes sure CheckTx passes, commit | |||||
makes sure it was included in a signed block). | |||||
Request (`POST http://gaia.zone:46657/`): | |||||
```json | |||||
{ | |||||
"id": "", | |||||
"jsonrpc": "2.0", | |||||
"method": "broadcast_sync", | |||||
"params": { | |||||
"tx": "F012A4BC68..." | |||||
} | |||||
} | |||||
``` | |||||
Response: | |||||
```json | |||||
{ | |||||
"error": "", | |||||
"result": { | |||||
"hash": "E39AAB7A537ABAA237831742DCE1117F187C3C52", | |||||
"log": "", | |||||
"data": "", | |||||
"code": 0 | |||||
}, | |||||
"id": "", | |||||
"jsonrpc": "2.0" | |||||
} | |||||
``` |