2.9 KiB
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)