From this link What are the keys used in the blockchain levelDB (ie what are the key:value pairs)?, to get the block hash I use the obfuscation key and xor it with the result I get from the db. So I look up the block hash I got on blockchain.com, but the block hash doesn't exist. So I check if I'm xoring right by using the website http://xor.pw/#. My xored value matched the website.

Then I look back to the example on How does Bitcoin read from/write to LevelDB and xored their example 26c326d7353661dc7005d274976f458691f24f0f05d141335f4ad5927e41 and 27c78118b731610527c78118b731610527c78118b731610527c78118b731 on http://xor.pw/# and I got 104a7cf820700d957c2536c205e2483b635ce17b2e02036788d548ac970 not 01028820010b2a00367244680f6da18acd861a08f0a89cb3b49ab50e.

Me and and the website can't get the same result and be wrong right? What am I missing?

import plyvel

def get_xor_key(o_key, result):
    xor_key = ''
    while len(xor_key) < len(result):
        if len(xor_key) + len(o_key) <= len(result): xor_key += o_key
        else: xor_key += o_key[:len(result)-len(xor_key)]
    return xor_key
def xor_two_str(s, t): return hex(int(s, 16) ^ int(t, 16))

db = plyvel.DB('/home/chris/.bitcoin/chainstate')
o_key = db.get(b'\x0e\x00obfuscate_key')
print('o_key', o_key.encode('hex')) # my o_key is 0899b9c2314a85c9b6

result = db.get(b'B')
result_hex = result.encode('hex')
print('result_hex', result_hex) # b6c9854a31c2b999b6da5ee266a8047f3c8c5fc82479ab03af9272a3a57372a2
xor_key = get_xor_key(o_key, result)
xored = xor_two_str(xor_key.encode('hex'), result_hex)
block_hash = xored[2:-1].decode('hex')[::-1].encode('hex')
print(block_hash) # 870b3cd33974701cfceb9c5bffa0b2b6b9c66e0a9de0a3b56617389267caebaa
  • Can you explain to me why in the answer for bitcoin.stackexchange.com/questions/51387/… it says 26c326d7353661dc7005d274976f458691f24f0f05d141335f4ad5927e41 xor 27c78118b731610527c78118b731610527c78118b731610527c78118b731 is equal to 104a7cf820700d957c2536c205e2483b635ce17b2e02036788d548ac970 and not 01028820010b2a00367244680f6da18acd861a08f0a89cb3b49ab50e? Jun 14, 2019 at 1:01
  • Oh, I see what's going on. Your answer is mathematically right, but you have dropped a leading zero so it is harder to see. It's more clear if written as 0104a7cf820700d957c2536c205e2483b635ce17b2e02036788d548ac970. However, I don't understand either where the 010288... answer comes from. It's not even the right number of bytes. Jun 14, 2019 at 1:57
  • The author of bitcoin.stackexchange.com/questions/51387/… has acknowledged that their result seems to be in error. Jun 14, 2019 at 19:16
  • Hmm. Then I wonder what I'm doing wrong. Jun 15, 2019 at 7:33
  • What information you trying to get from blockchain that you need to work with 'leveldb'? Jun 15, 2019 at 13:00

2 Answers 2


This is a bit late, but I've been struggling with this myself so hopefully I can help out anyone who comes across this thread with a similar question:

Looks like the chainstate obfuscation key begins with an 08, which probably refers to the length of the key. If you remove the 08, you get an obfuscation key of (for the above example) 99b9c2314a85c9b6, which you'll note is the reverse endian-ness of the beginning of result_hex (as it should, since the beginning of block hashes are zeros).

So to get these pieces of data to match endian-ness, you can reverse the key above and you'll get b6c9854a31c2b999. Per this answer, to de-obfuscate data you need to append the obfuscation key to itself until it matches the length of the data, leaving us with:

result_hex = b6c9854a31c2b999b6da5ee266a8047f3c8c5fc82479ab03af9272a3a57372a2
xor_key    = b6c9854a31c2b999b6c9854a31c2b999b6c9854a31c2b999b6c9854a31c2b999

If you enter those two values on https://xor.pw/# (as the OP did) you get 13dba8576abde68a45da8215bb129a195bf7e994b1cb3b, which you'll notice is quite a bit shorter than the inputs. This is because that site omits leading zeros. Add the missing zeros in and you get 00000000000000000013dba8576abde68a45da8215bb129a195bf7e994b1cb3b, which is a block hash from around the time this question was asked.


Your logic of xoring obfuscation key with the key seems to be causing an issue. Key and level DB value should be first made the same length. The result block hash should start with zeros. Feel free to copy code from this repo which is in working state

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.