Python

如何從保存的數據庫中重新創建 HexaryTrie

  • October 18, 2018

我正在嘗試HexaryTrie從 trie 寫入的數據庫中創建一個。

這是我的程式碼:

from trie import (
   HexaryTrie,
)

db = {}
trie1 = HexaryTrie(db)

trie1[b'deadbeef'] = b'deadbeef'
...

trie2 = HexaryTrie(db)

print(trie1.root_hash)
print(trie2.root_hash)
# ^ these print different root hashes :(

我在 py-trie 中看到,HexaryTrie 建構子是:

def __init__(self, db, root_hash=BLANK_NODE_HASH, prune=False):
   self.db = db
   validate_is_bytes(root_hash)
   self.root_hash = root_hash
   self.is_pruning = prune

有沒有辦法使用正在創建的數據庫來“重新”創建 trie?

先感謝您 :)

有沒有辦法使用正在創建的數據庫來“重新”創建 trie?

是的,缺少一件。

實例在HexaryTrie更新時跟踪其目前的根雜湊。但是如果你從數據庫載入一個新的 trie,你必須告訴它從哪個 root hash 引導。

因此,設置您的初始數據:

db = {}
trie1 = HexaryTrie(db)

trie1[b'deadbeef'] = b'deadbeef'
...

重新創建原始問題:

trie2 = HexaryTrie(db)
# because this doesn't have a root hash to look up the nodes, this
# returns empty data. Side note: I wish it raised a KeyError here...
assert trie2[b'deadbeef'] == b''

要成功查找數據,您可以在執行時更改根雜湊:

trie2.root_hash = trie1.root_hash
# The trie can now find the desired data:
assert trie2[b'deadbeef'] == b'deadbeef'

或者,使用正確的根雜湊創建 trie:

trie3 = HexaryTrie(db, root_hash=trie1.root_hash)
assert trie3[b'deadbeef'] == b'deadbeef'

引用自:https://ethereum.stackexchange.com/questions/60787