¿Cómo analizar bloques con Python?

Estoy construyendo un marco de análisis básico para la cadena de bloques de Ethereum. Como primer paso, necesito extraer los datos y me gustaría hacerlo en Python. He estado usando Geth como cliente en OSX y, según tengo entendido, la cadena de bloques se almacena localmente ~/Library/Ethereum/chaindataen LevelDB, es decir, en archivos binarios como 496355.ldb.

  1. ¿Cómo analizo los .ldbarchivos? ¿Hay una biblioteca de Python que pueda usar para esto? Miré el pyethereum pero no estoy seguro de dónde buscar, ya que la documentación es bastante escasa.

  2. Puedo usar la API de etherchain.org, pero esto implicaría muchas llamadas a la API y probablemente hará que la buena gente de etherchain.org se sienta infeliz. Es por eso que prefiero analizar la cadena de bloques almacenada localmente en mi máquina. Pero ignorando este problema por un momento, ¿alguien conoce una breve guía sobre el resultado de una llamada a la API para datos de transacciones que da como resultado datos como este?

{'cuentaNonce': '200642',
   'cantidad': 2678970350000000000,
   'blockHash': '0x47525d00eab0dcd87e9f8b0e9de2fe9f553f72576ef4f892ace49b2832e985bd',
   'id_bloque': 1039153,
   'límite de gas': 21000,
   'hash': '0x41bb75d8b20ae7e23fa7457d21a30a4007d0eb97fdb887caac834b759eeb3572',
   'isContractTx': Ninguno,
   'nuevoContrato': 0,
   'parentHash': '0x41bb75d8b20ae7e23fa7457d21a30a4007d0eb97fdb887caac834b759eeb3572',
   'precio': 50000000000,
   'destinatario': '0x30906581413d556de1a018adbe6cc63c88d58512',
   'remitente': '0x2a65aca4d5fc5b5c859090a6c34d164135398226',
   'hora': '2016-02-21T18:53:56.000Z',
   'txIndex': Ninguno}

Creo que entiendo la mayoría de estos datos, pero realmente agradecería más información para llenar los vacíos de mi comprensión.

Respuestas (3)

Implementé un analizador de cadena de bloques de bitcoin después de seguir esta publicación de blog . No he intentado cambiarlo para que funcione con la cadena de bloques de Ethereum, pero tal vez pueda brindarle alguna orientación. Aquí hay un analizador implementado en Go para darle algunos ejemplos específicos de Ethereum para comenzar.

¡Había visto previamente las publicaciones de su blog y su libro electrónico sobre el análisis de blogs de Bitcoin y aprendí mucho de ellos!
El enlace a la publicación del blog ya no funciona :-(

Su nodo geth también actuará como un servidor JSON-RPC. Puede usar la página wiki de las API para rastrear la cadena de bloques y extraer datos de bloques. Aquí hay un interesante repositorio de git que podrías bifurcar. Sin embargo, es un poco espectáculo y requiere algunas modificaciones de código ya que el propietario ya no lo mantiene. Encontrará una solicitud de extracción en ese repositorio que se ejecuta sustancialmente más rápido, sin embargo, requiere más modificaciones para funcionar.

Como quiere los resultados en python, puede conectarse a su instancia de geth a través de IPC con web3.py *. Se vería algo como :

>>> from web3.auto import w3

>>> w3.eth.getBlock(2000000)
AttributeDict({
    'difficulty': 49824742724615,
    'extraData': '0xe4b883e5bda9e7a59ee4bb99e9b1bc',
    'gasLimit': 4712388,
    'gasUsed': 21000,
    'hash': '0xc0f4906fea23cf6f3cce98cb44e8e1449e455b28d684dfa9ff65426495584de6',
    'logsBloom': '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
    'miner': '0x61c808d82a3ac53231750dadc13c777b59310bd9',
    'nonce': '0x3b05c6d5524209f1',
    'number': 2000000,
    'parentHash': '0x57ebf07eb9ed1137d41447020a25e51d30a0c272b5896571499c82c33ecb7288',
    'receiptRoot': '0x84aea4a7aad5c5899bd5cfc7f309cc379009d30179316a2a7baa4a2ea4a438ac',
    'sha3Uncles': '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347',
    'size': 650,
    'stateRoot': '0x96dbad955b166f5119793815c36f11ffa909859bbfeb64b735cca37cbf10bef1',
    'timestamp': 1470173578,
    'totalDifficulty': 44010101827705409388,
    'transactions': ['0xc55e2b90168af6972193c1f86fa4d7d7b31a29c156665d15b9cd48618b5177ef'],
    'transactionsRoot': '0xb31f174d27b99cdae8e746bd138a01ce60d8dd7b224f7c60845914def05ecc58',
    'uncles': [],
})

* Pruebe la versión beta (v4), instalada con:

pip install --pre web3