首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用PyEthereum包打开本地ethereum (leveldb)?

如何使用PyEthereum包打开本地ethereum (leveldb)?
EN

Ethereum用户
提问于 2017-12-03 10:21:21
回答 2查看 827关注 0票数 4

我在当地的私人区块连锁店:

/User/User/EthereumTestNet/geth/chaindata

如何连接到它,通过ethereum.pow.chain.get_block(hash)获取链数据?我知道要查看链数据,首先必须获得state,在这一点上我有问题。我试过这样做:

代码语言:javascript
复制
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

EN

回答 2

Ethereum用户

回答已采纳

发布于 2018-02-12 21:35:38

我也有过同样的问题。看起来,pyethereum中的数据库层已经被抽象出来,这样就可以使用级别数据库以外的数据库了。挑战是,即使将级别db对象传递到trie.Trie(db, root_hash)的db参数,它调用getputdelete方法的方式也会出现问题。Leveldb使用大写的GetPutDelete,而Trie中的内部代码使用小写。

为此,我创建了一个新的对象来包装leveldb对象,并在ethereum.db中实现了pyethereum方法签名。

因此,创建一个名为db_leveldb.py的文件:

代码语言:javascript
复制
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

然后使用此对象,类似于以下内容:

代码语言:javascript
复制
import db_leveldb, ethereum.trie

state = trie.Trie(db_leveldb.DB('/Users/User/EthereumTestNet/geth/chaindata'), bytes.fromhex('81fe149a7edc2e26b6cb14c17077ed6fd0d31f3a2c6b3e48eb8c42908493cbdc'))

希望这能为你指明可行的解决方案。

票数 3
EN

Ethereum用户

发布于 2017-12-03 17:42:07

(这不是一个完整的答案-因为我不熟悉Pythereum是如何做事的--但可能是一个潜在的起点。)

查看一下State()类在state.py中。

这似乎有一些用于下列方面的代码:

票数 3
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/32334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档