I am trying to use bitcoind's LevelDB block index files (that are stored in
blocks/index) to find the file (e.g.
blk00029.dat) and byte position of specfic blocks.
Thanks to questions What is the database for? and What are the keys used in the blockchain levelDB (ie what are the key:value pairs)? I know where to look, however the contents of the database key for a block puzzles me. Even with the help of the source code I cannot figure out it's format.
For example for the block at height 100,000, which resides under database key
b\x06\xe53\xfd\x1a\xda\x869\x1f?l42\x04\xb0\xd2x\xd4\xaa\xec\x1c\x0b \xaa'\xba\x03\x00\x00\x00\x00\x00 (block's hash string converted to bytes in little endian order), I am getting the following content which I hexlified for readability:
The first 3 bytes (
87c628) seem to be the same for every block that I get from the database. I'm guessing it is some version identifier?
The last 80 bytes (or 160 characters in hex) are the block header:
010000005 ... f2b5710. They match what you get by executing
bitcoin-cli getblock 000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506 false.
The rest is a mystery to me. I know that block 100,000 had 4 transactions, but the byte that holds the value
129 for block #1, which had only a single transaction.
Where can I find out about the format of, at least, the block keys in LevelDB?
Could it be that the format of each key depends on the version of bitcoind that serialized the contents? If so, how do I figure out which format to use?