Cómo leer cada bloque de bitcoin por python

Necesito leer todas las transacciones de Bitcoin desde la primera hasta ahora y extraer todas las direcciones de Bitcoin para realizar más análisis.

¿Alguna idea de cómo hacerlo en Python?

Respuestas (4)

Escribí el script de Python que puede analizar volcados sin procesar de bitcoin. No se necesitan módulos ni API, solo archivos Puthon 2.7 y blk00*.dat. Espero que pueda ayudar.

analizador de cadena de bloques

Una vez usé las API de blockchain.info en python para un propósito similar, puede atravesar con la altura del bloque de 0 a la última con un script de python. Y puede escribir direcciones de entrada y salida en un archivo csv. Puede usar 'establecer' para asegurarse de que no haya duplicados.

Obtendrá respuesta como objeto json. Pero puede llevar bastante tiempo recuperar y leer todos los bloques y transacciones.

Realmente lento, tengo bitcoin-core en funcionamiento y no necesito las API de blockchain.info (sobrecarga de la red) pero aún así, bitcoin-core también es lento. Necesito encontrar una manera de leer bloques con levelDB uno por uno pero yo no se como
No sé mucho en el contexto entonces, no puedo ayudar ...

Para ampliar la respuesta de Amaclin, puede consultar los envoltorios de python JSON-RPC, como python-bitcoinrpc, que le permitirán realizar llamadas a su base de datos de nodos. Con un nodo completamente sincronizado, txindex=1puede comenzar a iterar a través de cada bloque con bucles for con getblockhash getblock getrawtransactiony decoderawtransaction. Sí, esto llevará mucho tiempo.

A partir de esto

Para ampliar la respuesta de Amaclin, puoi esaminare i wrapper Python JSON-RPC come python-bitcoinrpc che ti consentiranno di effettuare chiamate al database dei tuoi nodi. Con un nodo completamente sincronizado y txindex=1puoi iniziare iterando attraverso ogni blocco con per i cicli con getblockhash getblock getrawtransaction y decoderrawtransaction. Sì, ci vorrà molto tempo.

Tuve un problema similar, y al principio, cuando Bitcoin estaba oscuro para mí, me llevó un poco a pensar que los datos de la dirección estaban contenidos dentro de las transacciones, esto es cierto, pero los datos de la dirección con los que bloquear las transacciones están dentro del scriptPubKey, solo dentro de él, por lo tanto, para construir un hilo lógico entre estos, además de tener la referencia a la transacción actual, también debe tener la referencia a la transacción de salida a la que se refiere la transacción de entrada.

Entonces, en resumen, tiene una transacción X y desea decodificar su receptor, luego acceda a sus datos con los comandos en la respuesta citada y usando el comando decodescript () con hexadecimal de scriptPubKey puede obtener su billetera de identificación.

Pero para obtener los datos relacionados con esos satoshi, debe acceder a la transacción sin procesar contenida en el punto de salida de la transacción de entrada, realizar la decodificación y acceder a la transacción de salida en la posición "n" (valor contenido dentro del punto de salida) y ejecutar el comando decodescript del script PubKey relacionado con esta salida.

Solo de esta manera puede reconstruir la clave pública insertada en el scirpt, y solo volviendo a la transacción anterior vinculada a la transacción de entrada actual, puede ejecutar una especie de cronología.

Quiero agregar más información: - Con estos pasos, es posible que desee crear un gráfico de información para conectar las identificaciones de billetera, bueno, esto no es suficiente, porque con los scripts P2SH no puede exponer la clave pública porque usa una dirección de script P2SH y, por lo tanto, una billetera tiene potencialmente un sinfín de direcciones.

  • Este proceso es muy lento, porque fuerza muchas consultas en el núcleo de bitcoin (aceleraría la cosa usando un analizador de archivos blk y ejecutaría solo la decodificación de los scripts en él)

  • Una vez decodificadas las direcciones, se debe realizar un análisis sobre qué direcciones son válidas o no, teniendo en cuenta que una transacción de X satoshi para pagar una suma