Obtener un conjunto UTXO a prueba de criptografía

¿Cómo obtener una lista de salidas de transacciones no gastadas (UTXO) de archivos locales?

¿Dónde se almacenan estos datos? ¿En qué archivos están completamente presentes estos datos?

Entiendo que esta lista está en "chainstate". ¿Pero puede haber una forma más segura de obtenerlo?

Intento extraerlo de los archivos locales que Bitcoin Client descarga en el disco.

Creo que habría un "conjunto UTXO a prueba de criptografía".

Respuestas (2)

He estado trabajando en esto como parte de una biblioteca Python 2 de herramientas de Bitcoin más grande durante un tiempo. Puedes encontrarlo en github .

Puede ejecutar el código en ldb_parser.py , que generará un txt con todos los UTXO del estado de cadena analizados en un json. (Tenga en cuenta que se trata de una gran cantidad de datos).

Luego puede llamar a la función decode_utxo utilizando los datos del json y almacenar el resultado en un archivo para analizarlo. (¡Este archivo será aún más grande!).

Aquí tienes un ejemplo (una vez que hayas ejecutado ldb_parser.py):

from bitcoin_tools.utils import load_conf_file, decode_utxo
from json import loads, dumps

fin_name = "utxos.txt"
fout_name = "parsed_utxos.txt"

# Load config file
cfg = load_conf_file()

fin = open(cfg.data_path + fin_name, 'r')
# Output file
fout = open(cfg.data_path + fout_name, 'w')

for line in fin:
    data = loads(line[:-1])
    utxo = decode_utxo(data["value"])

    fout.write(dumps(utxo) + '\n')

fout.close()

Y cada línea que obtendrá en parsed_utxos.txt se verá así:

{"coinbase": 0, "version": 1, "outs": [{"index": 1, "amount": 14250000, "out_type": 0, "data": "865e218ff25929eee880e0e3b6f95280b2d05443"}], "height": 468349}
{"coinbase": 0, "version": 1, "outs": [{"index": 0, "amount": 132000, "out_type": 1, "data": "0b2a00367244680f6da18acd861a08f0a89cb3b4"}], "height": 449294}
{"coinbase": 0, "version": 1, "outs": [{"index": 1, "amount": 2423800, "out_type": 1, "data": "7f172a63c49c5d03e3307d432bd6b784b69d0e0d"}, {"index": 2, "amount": 10000000, "out_type": 1, "data": "1d0c4b60e8270f9b6ca5f167f08a5466a0cee565"}], "height": 474328}
...

Donde cada entrada en outsuna salida y datacorresponde a los datos de la transacción (hash160 de la dirección para transacciones P2PKH).

Ahora bien, hay que tener en cuenta algunas consideraciones:

No todos los UTXO son P2PKH, por lo que lo que encontrará datadepende del out_typecampo.

out_types 0y 1corresponden a P2PKH y P2SH respectivamente, y tendrán 20 bytes de datos (hash160 de la clave pública para P2PKH y scriptHash para P2SH).

out_types 2,3,4y 5corresponden a salidas P2PK, y contendrán 33 bytes de datos (1 byte para el tipo de clave pública y 32 bytes para la clave real).

Finalmente, cualquier otro out_typeimplicará que los datos que tiene la UTXO no están comprimidos, y el valor corresponderá al tamaño de los datos + el número de scripts especiales ( nSpecialScripts) que actualmente es 6). Este es el caso de las transacciones P2MS y las transacciones no estándar.

Todo esto ha sido extraído directamente del código fuente de Bitcoin Core.

Finalmente, tenga en cuenta que para usar la biblioteca necesitará instalar las dependencias de python en requeriments.txt y crear un archivo conf.py para configurar su ruta de acceso de cadena y ruta de datos (o modificar el código para no usar el archivo de configuración).

Estoy trabajando para fusionar todo esto con la rama maestra (actualmente está en desarrollo), por lo que los enlaces pueden variar en el futuro).
Tenga en cuenta que el formato de la base de datos para el conjunto UTXO cambia en Bitcoin Core 0.15 (se vuelve más fácil).
@PieterWuille Gracias por señalar esto, actualizaré el código.
@ sr-gi actualizas el código?
Todavía no, pero definitivamente debería funcionar para cualquier versión anterior a la 0.15.
@Denis, el código se actualizó con el decodificador para v.015. Es parte de la rama de desarrollo y se fusionará con el maestro durante la próxima semana.
@ sr-gi, ¿dónde se calcula y almacena el conjunto utxo en su última actualización?
Puede encontrarlo en la rama de desarrollo (se fusionará con el maestro a lo largo de esta semana). La función de decodificación para 0.15 está aquí: github.com/sr-gi/bitcoin_tools/blob/dev/bitcoin_tools/analysis/…

El conjunto UTXO se almacena en la chainstatecarpeta. Se almacena en bases de datos LevelDB que pueden realizar algunas optimizaciones que pueden dificultar el análisis de los datos reales en el disco (por ejemplo, cierta compresión). Si desea leer esos datos, debe modificar Bitcoin Core para que se los proporcione en lugar de intentar leerlos de los archivos en el disco. También puede abrir las bases de datos en un visor de LevelDB, pero eso podría dañar sus bases de datos y, de lo contrario, no se recomienda.

¿Propondrías algún visor de leveldb?