Private-Blockchain

如何使用 PyEthereum 包打開本地乙太坊鏈(leveldb)?

  • February 12, 2018

我在以下位置獲得了本地私有區塊鏈:

/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'))

希望這可以為您指明可行的解決方案。

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