Private-Blockchain
如何使用 PyEthereum 包打開本地乙太坊鏈(leveldb)?
我在以下位置獲得了本地私有區塊鏈:
/Users/User/EthereumTestNet/geth/chaindata
我如何連接到它,以獲取鏈數據
ethereum.pow.chain.get_block(hash)
?我知道要查看鏈數據,我首先必須得到state
,在這一點上我有問題。我試過這樣做:levelDB = leveldb.LevelDB('/Users/User/EthereumTestNet/geth/chaindata') state = trie.Trie(levelDB, '81fe149a7edc2e26b6cb14c17077ed6fd0d31f3a2c6b3e48eb8c42908493cbdc'.decode('hex')) levelDB = leveldb.LevelDB('/Users/User/EthereumTestNet/geth/chaindata') state = trie.Trie(db.BaseDB(levelDB), '81fe149a7edc2e26b6cb14c17077ed6fd0d31f3a2c6b3e48eb8c42908493cbdc'.decode('hex')) baseDB = db.BaseDB(filename='/Users/User/EthereumTestNet/geth/chaindata') state = trie.Trie(db.EphemDB(), '81fe149a7edc2e26b6cb14c17077ed6fd0d31f3a2c6b3e48eb8c42908493cbdc'.decode('hex'))
沒有任何想法,有人可以幫忙嗎?
使用最後一個pyethereum , 最後一個geth , MacOS
我遇到過同樣的問題。看起來pyethereum中的數據庫層已經被抽像出來了,可以使用leveldb以外的數據庫。挑戰在於,即使您將 leveldb 對像傳遞給您的 db 參數,它呼叫and方法
trie.Trie(db, root_hash)
的方式也會出現問題。Leveldb 使用大寫,而 in 的內部程式碼使用小寫。get
put``delete``Get
Put``Delete``Trie
我通過創建一個新對象來包裝 leveldb 對象並在 ethereum.db 中實現 pyethereum 方法簽名來解決這個問題。
因此,創建一個名為 db_leveldb.py 的文件:
import os import leveldb import ethereum.db databases = {} class DB(db.BaseDB): def __init__(self, dbfile): self.dbfile = dbfile if dbfile not in databases: databases[dbfile] = leveldb.LevelDB(dbfile) self.db = databases[dbfile] def get(self, key): return self.db.Get(key) def put(self, key, value): self.db.Put(key, value) def delete(self, key): self.db.Delete(key) def _has_key(self, key): try: self.get(key) return True except KeyError: return False def __contains__(self, key): return self._has_key(key) def __eq__(self, other): return isinstance(other, self.__class__) and self.db == other.db
然後使用類似於下面的這個對象:
import db_leveldb, ethereum.trie state = trie.Trie(db_leveldb.DB('/Users/User/EthereumTestNet/geth/chaindata'), bytes.fromhex('81fe149a7edc2e26b6cb14c17077ed6fd0d31f3a2c6b3e48eb8c42908493cbdc'))
希望這可以為您指明可行的解決方案。