75 lines
2.9 KiB
Markdown
75 lines
2.9 KiB
Markdown
# Data storage in RocksDB
|
|
|
|
**Blockbook** stores data the key-value store RocksDB. Each index is stored in its own column family.
|
|
|
|
>Database content is described in golang pseudo types in the form *(name type)*.
|
|
>
|
|
>Operators used in the description:
|
|
>- -> mapping from key to value.
|
|
>- \+ concatenation,
|
|
>- [] array
|
|
>
|
|
>Types used in the description:
|
|
>- []byte - array of bytes
|
|
>- uint32 - unsigned integer, stored as array of 4 bytes in big endian*
|
|
>- vint, vuint - variable length signed/unsigned int
|
|
>- addrDesc - address descriptor, abstraction of an address. In all bitcoin like coins it is output script. Stored as variable length array of bytes.
|
|
>- bigInt - unsigned big integer, stored as length of array (1 byte) followed by array of bytes of big int, i.e. *(int_len byte)+(int_value []byte)*. Zero is stored as one byte containing 0.
|
|
|
|
**Column families:**
|
|
|
|
- **default**
|
|
|
|
stores internal state in json format, under the key *internalState*.
|
|
|
|
Most important internal state values are:
|
|
- coin - which coin is indexed in DB
|
|
- data format version - currently 3
|
|
- dbState - closed, open, inconsistent
|
|
|
|
Blockbook is on startup checking these values and does not allow to run against wrong coin, data format version and in inconsistent state.
|
|
|
|
- **height**
|
|
|
|
maps *block height* to *block hash* and additional data about block
|
|
```
|
|
(height uint32) -> (hash [32]byte)+(time uint32)+(nr_txs vuint)+(size vuint)
|
|
```
|
|
|
|
- **addresses**
|
|
|
|
maps *addrDesc+block height* to *array of outpoints* (array of transactions with input/output index). Input/output is recognized by the sign of the number, output is positive, input is negative, with operation bitwise complement ^ performed on the number.
|
|
```
|
|
(addrDesc []byte)+(height uint32) -> []((txid [32]byte)+(index vint))
|
|
```
|
|
|
|
- **addressBalance**
|
|
|
|
maps *addrDesc* to *number of transactions*, *sent amount* and *total balance* of given address
|
|
```
|
|
(addrDesc []byte) -> (nr_txs vuint)+(sent_amount bigInt)+(balance bigInt)
|
|
```
|
|
|
|
- **txAddresses**
|
|
|
|
maps *txid* to *block height* and array of *input addrDesc* with *amounts* and array of *output addrDesc* with *amounts*, with flag if output is spent. In case of spent output, *addrDesc_len* is negative (negative sign is achieved by bitwise complement ^).
|
|
```
|
|
(txid []byte) -> (height vuint)+
|
|
(nr_inputs vuint)+[]((addrDesc_len vuint)+(addrDesc []byte)+(amount bigInt))+
|
|
(nr_outputs vuint)+[]((addrDesc_len vint)+(addrDesc []byte)+(amount bigInt))
|
|
```
|
|
|
|
- **blockTxs**
|
|
|
|
maps *block height* to an array of *txids* and *input points* in the block - only last 300 (by default) blocks are kept, the column is used in case of rollback.
|
|
```
|
|
(height uint32) -> []((txid [32]byte)+(nr_inputs vuint)+[]((txid [32]byte)+(index vint)))
|
|
```
|
|
|
|
- **transactions**
|
|
|
|
transaction cache, *txdata* is generated by coin specific parser function PackTx
|
|
```
|
|
(txid []byte) -> (txdata []byte)
|
|
```
|