我在当地的私人区块连锁店:
/User/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'))没有任何想法,有人能帮忙吗?
使用最后一层,最后一层,MacOS
发布于 2018-02-12 21:35:38
我也有过同样的问题。看起来,pyethereum中的数据库层已经被抽象出来,这样就可以使用级别数据库以外的数据库了。挑战是,即使将级别db对象传递到trie.Trie(db, root_hash)的db参数,它调用get、put和delete方法的方式也会出现问题。Leveldb使用大写的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
复制相似问题