如何獲取chainstate leveldb中的塊雜湊?
從這個連結什麼是區塊鏈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) < 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
這有點晚了,但我自己一直在努力解決這個問題,所以希望我可以幫助遇到這個問題的任何人,並提出類似的問題:
看起來
chainstate
混淆密鑰以 開頭08
,這可能是指密鑰的長度。如果你刪除08
,你會得到一個混淆鍵(對於上面的例子)99b9c2314a85c9b6
,你會注意到它是開頭的反向字節序result_hex
(因為它應該是,因為塊雜湊的開頭是零)。所以要讓這些數據匹配字節序,你可以反轉上面的鍵,你會得到
b6c9854a31c2b999
. 根據這個答案,要對數據進行去混淆處理,您需要將混淆密鑰附加到自身,直到它與數據的長度匹配,給我們留下:result_hex = b6c9854a31c2b999b6da5ee266a8047f3c8c5fc82479ab03af9272a3a57372a2 xor_key = b6c9854a31c2b999b6c9854a31c2b999b6c9854a31c2b999b6c9854a31c2b999
如果您在<https://xor.pw/#>上輸入這兩個值(就像 OP 所做的那樣)
13dba8576abde68a45da8215bb129a195bf7e994b1cb3b
,您會發現這比輸入要短得多。這是因為該站點省略了前導零。將缺失的零添加進去,你會得到00000000000000000013dba8576abde68a45da8215bb129a195bf7e994b1cb3b
,這是從提出這個問題時開始的塊雜湊。
您將混淆密鑰與密鑰異或的邏輯似乎引起了問題。key 和 level DB value 應該首先做相同的長度。結果塊雜湊應以零開頭。隨意從這個處於工作狀態的repo複製程式碼