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, state
und 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
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
put
und aufruft. delete
Leveldb verwendet Großbuchstaben Get
Put
und Delete
der interne Code Trie
verwendet 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:
Gudsaf
RefcountDB()
getself.db
, was in line 136 inenv=Env()
init in line 104 gesetzt wird . Wenn wir uns ansehen, sehenEnv __init__
wir, dass es notwendig ist ,EphemDB
oderBaseDB
self.db zu setzen. Also habe ich versucht, guteEphemDB
oder zu erstellenBaseDB
, aber es gibt kein init in ihnen, das lokale Kettendaten öffnen kannGudsaf
BaseDB
sieht 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
Reichtum
Richard Horrocks