¿Cómo abrir la cadena ethereum local (leveldb) usando el paquete PyEthereum?

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 statey 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

Respuestas (2)

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 puty . deleteLeveldb usa mayúsculas Get Puty Deleteel código interno Trieusa 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:

  • Cargando un intento de estado desde una raíz dada (línea 138) ;
  • Obtener datos del trie para una dirección específica (línea 175) ;
  • Descifrando esos datos del formato RLP (línea 177) .
Puedo decir aún más: lo miré ... esa llamada en la línea 138 RefcountDB()get self.db, que se establece en la línea 136 en env=Env()init en la línea 104 . Si observamos Env __init__, vemos que necesita EphemDBo BaseDBconfigurar self.db. Por lo tanto, traté de crear good EphemDBor BaseDB, pero no hay init en ellos que pueda abrir datos de la cadena local
Acerca de db se puede ver en db.py. BaseDBse 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
Yo también tengo este problema, estoy tratando de trabajar con la red principal mientras uso pyethereum. Cualquier idea sería útil.
¿Te ayudó alguna de las ideas anteriores? ¿Estás tratando de leer los mismos datos? Si no es así, es posible que desee comenzar una nueva pregunta.