0
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 https://bitcoin.stackexchange.com/questions/51387/how-does-bitcoin-read-from-write-to-leveldb/52167#52167 it says
– guest1234312 – 2019-06-14T01:01:51.28326c326d7353661dc7005d274976f458691f24f0f05d141335f4ad5927e41xor27c78118b731610527c78118b731610527c78118b731610527c78118b731is equal to104a7cf820700d957c2536c205e2483b635ce17b2e02036788d548ac970and not01028820010b2a00367244680f6da18acd861a08f0a89cb3b49ab50e?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 the010288...answer comes from. It's not even the right number of bytes. – Nate Eldredge – 2019-06-14T01:57:52.363The author of https://bitcoin.stackexchange.com/questions/51387/how-does-bitcoin-read-from-write-to-leveldb/52167#52167 has acknowledged that their result seems to be in error.
– Nate Eldredge – 2019-06-14T19:16:53.303Hmm. Then I wonder what I'm doing wrong. – guest1234312 – 2019-06-15T07:33:31.130
What information you trying to get from blockchain that you need to work with 'leveldb'? – D L – 2019-06-15T13:00:31.200
Just trying to understand how it works. – guest1234312 – 2019-06-15T18:49:02.107
The decoded block hash ought to start with zeros, and I'm noticing that the beginning of the database value looks like the end of the obfuscation key, reversed. So this is probably a big/little-endian issue. Try reversing the bytes in one of the values before xor'ing. – Nate Eldredge – 2019-06-15T21:17:36.683
Tried it. That is not the case. – guest1234312 – 2019-06-16T02:01:49.330