blockbook/docs/rocksdb.md

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)