Python

如何獲取chainstate leveldb中的塊雜湊?

  • July 3, 2020

從這個連結什麼是區塊鏈levelDB中使用的鍵(即什麼是鍵:值對)?,為了獲得塊雜湊,我使用了混淆密鑰並將其與從 db 獲得的結果進行異或。所以我查找了我在 blockchain.com 上獲得的區塊雜湊,但區塊雜湊不存在。所以我通過使用網站http://xor.pw/#檢查我是否正確。我的異或值與網站匹配。

然後我回顧一下關於比特幣如何讀取/寫入 LevelDB的範例,並對他們的範例 26c326d7353661dc7005d274976f458691f24f0f05d141335f4ad5927e41和<http://xor.pw/#>進行異或運算,但 我沒有。27c78118b731610527c78118b731610527c78118b731610527c78118b731``104a7cf820700d957c2536c205e2483b635ce17b2e02036788d548ac970``01028820010b2a00367244680f6da18acd861a08f0a89cb3b49ab50e

我和網站不能得到相同的結果並且是錯誤的,對嗎?我錯過了什麼?

import plyvel

def get_xor_key(o_key, result):
   xor_key = ''
   while len(xor_key) &lt; len(result):
       if len(xor_key) + len(o_key) &lt;= 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

這有點晚了,但我自己一直在努力解決這個問題,所以希望我可以幫助遇到這個問題的任何人,並提出類似的問題:

看起來chainstate混淆密鑰以 開頭08,這可能是指密鑰的長度。如果你刪除08,你會得到一個混淆鍵(對於上面的例子)99b9c2314a85c9b6,你會注意到它是開頭的反向字節序result_hex(因為它應該是,因為塊雜湊的開頭是零)。

所以要讓這些數據匹配字節序,你可以反轉上面的鍵,你會得到b6c9854a31c2b999. 根據這個答案,要對數據進行去混淆處理,您需要將混淆密鑰附加到自身,直到它與數據的長度匹配,給我們留下:

result_hex = b6c9854a31c2b999b6da5ee266a8047f3c8c5fc82479ab03af9272a3a57372a2
xor_key    = b6c9854a31c2b999b6c9854a31c2b999b6c9854a31c2b999b6c9854a31c2b999

如果您在<https://xor.pw/#>上輸入這兩個值(就像 OP 所做的那樣)13dba8576abde68a45da8215bb129a195bf7e994b1cb3b,您會發現這比輸入要短得多。這是因為該站點省略了前導零。將缺失的零添加進去,你會得到00000000000000000013dba8576abde68a45da8215bb129a195bf7e994b1cb3b,這是從提出這個問題時開始的塊雜湊。

您將混淆密鑰與密鑰異或的邏輯似乎引起了問題。key 和 level DB value 應該首先做相同的長度。結果塊雜湊應以零開頭。隨意從這個處於工作狀態的repo複製程式碼

引用自:https://bitcoin.stackexchange.com/questions/88369