Wie öffne ich die lokale Ethereum-Kette (Leveldb) mit dem PyEthereum-Paket?

Ich habe eine lokale private Blockchain in:

/Users/User/EthereumTestNet/geth/chaindata

Wie kann ich eine Verbindung herstellen, um Kettendaten zu erhalten ethereum.pow.chain.get_block(hash)? Ich weiß, dass ich zuerst die Kettendaten sehen muss, stateund an diesem Punkt habe ich ein Problem. Ich habe versucht, wie:

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

Keine Ideen, kann jemand helfen?

Verwenden Sie last pyethereum , last geth , MacOS

Antworten (2)

Ich hatte das gleiche Problem. Es sieht so aus, als ob die Datenbankschicht in Pyethereum abstrahiert wurde, sodass andere Datenbanken als leveldb verwendet werden können. Die Herausforderung besteht darin, dass selbst wenn Sie ein leveldb-Objekt an den db-Parameter von übergeben trie.Trie(db, root_hash), Probleme mit der Art und Weise auftreten, wie es die Methoden get putund aufruft. deleteLeveldb verwendet Großbuchstaben Get Putund Deleteder interne Code Trieverwendet Kleinbuchstaben.

Ich habe dies umgangen, indem ich ein neues Objekt erstellt habe, um das leveldb-Objekt zu umschließen, und die Signatur der pyethereum-Methode in ethereum.db implementiert habe.

Erstellen Sie also eine Datei mit dem Namen 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

Verwenden Sie dann dieses Objekt ähnlich wie folgt:

import db_leveldb, ethereum.trie

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

Ich hoffe, dies weist Sie in die Richtung einer praktikablen Lösung.

(Dies ist keine vollständige Antwort - da ich nicht damit vertraut bin, wie Pythereum Dinge tut - könnte aber ein möglicher Ausgangspunkt sein.)

Schauen Sie sich die State()Klasse in an state.py.

Dies scheint einen Code für Folgendes zu haben:

  • Laden eines Zustandsversuchs von einer gegebenen Wurzel (Zeile 138) ;
  • Abrufen von Daten aus dem Trie für eine bestimmte Adresse (Zeile 175) ;
  • Dekodierung dieser Daten aus dem RLP-Format (Zeile 177) .
Kann noch mehr sagen - mal angeschaut... that call in line 138 RefcountDB()get self.db, was in line 136 in env=Env()init in line 104 gesetzt wird . Wenn wir uns ansehen, sehen Env __init__wir, dass es notwendig ist , EphemDBoder BaseDBself.db zu setzen. Also habe ich versucht, gute EphemDBoder zu erstellen BaseDB, aber es gibt kein init in ihnen, das lokale Kettendaten öffnen kann
Über db können Sie in db.py sehen . BaseDBsieht aus wie eine Hauptklasse, die von anderen DB-Klassen wie _EphemDB oder RefcountDB oder ... aufgerufen wird, aber ich verstehe nicht, wie ich meine Datenbank an BaseDB senden soll/Users/User/EthereumTestNet/geth/chaindata
Auch ich habe dieses Problem, ich versuche, mit dem Mainnet zu arbeiten, während ich Pyethereum verwende. Irgendwelche Ideen wären hilfreich.
Hat eine der oben genannten Ideen geholfen? Versuchen Sie, dieselben Daten zu lesen? Wenn nicht, möchten Sie vielleicht eine neue Frage beginnen.