Obtuve blockchain privado local en:
/Usuarios/Usuario/EthereumTestNet/geth/chaindata
¿Cómo puedo conectarme a él para obtener datos de la cadena ethereum.pow.chain.get_block(hash)
? Sé que para ver los datos de la cadena primero debo obtenerlos state
y en ese punto tengo un problema. Traté de hacer como:
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'))
No hay ninguna idea, ¿alguien puede ayudar?
use el último pyethereum , el último geth , MacOS
Tuve el mismo problema. Parece que la capa de la base de datos en pyethereum se ha abstraído de modo que se pueden usar bases de datos distintas de leveldb. El desafío es que incluso si pasa un objeto leveldb al parámetro db, trie.Trie(db, root_hash)
tendrá problemas con la forma en que llama a los métodos get
put
y . delete
Leveldb usa mayúsculas Get
Put
y Delete
el código interno Trie
usa minúsculas.
Resolví esto creando un nuevo objeto para envolver el objeto leveldb e implementé la firma del método pyethereum en ethereum.db.
Entonces, cree un archivo llamado algo así como 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
Luego use este objeto similar al siguiente:
import db_leveldb, ethereum.trie
state = trie.Trie(db_leveldb.DB('/Users/User/EthereumTestNet/geth/chaindata'), bytes.fromhex('81fe149a7edc2e26b6cb14c17077ed6fd0d31f3a2c6b3e48eb8c42908493cbdc'))
Espero que esto te oriente en la dirección de una solución viable.
(Esta no es una respuesta completa, ya que no estoy familiarizado con la forma en que Pythereum hace las cosas, pero podría ser un posible punto de partida).
Eche un vistazo a la State()
clase en state.py
.
Esto parece tener algún código para lo siguiente:
Gudsaf
RefcountDB()
getself.db
, que se establece en la línea 136 enenv=Env()
init en la línea 104 . Si observamosEnv __init__
, vemos que necesitaEphemDB
oBaseDB
configurar self.db. Por lo tanto, traté de crear goodEphemDB
orBaseDB
, pero no hay init en ellos que pueda abrir datos de la cadena localGudsaf
BaseDB
se parece a la clase principal que llamaron otras clases de db como _EphemDB o RefcountDB o..., pero no entiendo cómo enviar a BaseDB mi base de datos en/Users/User/EthereumTestNet/geth/chaindata
Fortuna
Richard Horrocks