¿Cómo decodificar transacciones sin procesar muy grandes (!)?

Estoy analizando la cadena de bloques para extraer cierta información que necesito para un script.

Una cosa que hago es analizar transacciones. Lo que hago es:

getrawtransaction <tx>
decoderawtransaction <rawtx>

Esto funciona en la mayoría de las transacciones (>99 %), pero algunas son muy grandes y el cliente de bitcoin no puede manejarlas. Me pregunto qué más puede manejarlos si no es bitcoind. El error que me sale en bitcoind:

TX decode failed (code -22)

Eso es porque no puede aceptar argumentos muy largos. Mi script Ruby muere con

Arguement list too long - (Errno::E2BIG)

¿Cómo decodificar tales transacciones? Aquí hay unos ejemplos:

2f50fdf7adbf58e91d738869948f4b191eb3cafa016c6df7e9182c06e4513852
e7229316b5a5b1f53382ec5a526b842dda2ca96bc891cd02d397a52c4a84dba0
540359af779a510828f0afd3c88562b62c37d0e4eeccb08104a167a3600f7956

Gracias.


Actualización: solo intenté pegar la transacción sin procesar en este analizador en línea y este decodifica esa transacción sin ningún problema. ¿Cómo es eso posible programáticamente?

Respuestas (4)

prueba esto:

bitcoind getrawtransaction 2f50fdf7adbf58e91d738869948f4b191eb3cafa016c6df7e9182c06e4513852 1

tenga en cuenta el 1 al final, que indica a bitcoind que opere en modo detallado.

Parece que está pasando toda la transacción en la línea de comando, pero su sistema operativo tiene un límite en la longitud máxima (combinada) de los argumentos de la línea de comando, que se ha excedido. El mensaje "Lista de argumentos demasiado larga" es un error del sistema operativo, no de bitcoind en sí.

Debería poder usar el -stdinargumento from bitcoin-clipara pasarlo a través de la entrada estándar en lugar de en la línea de comando, en cuyo caso no hay límites de longitud. En un sistema operativo similar a Unix, es probable que desee pasar los datos a través de una canalización, utilizando popen(3)o su equivalente en el idioma de su elección, pero también puede escribir en un archivo temporal.

Bitcoind puede aceptar entradas muy largas, pero si está utilizando bitcoin-cli, existe un límite en la duración de un argumento de línea de comandos. Puede usar la opción -stdin para enviar los argumentos a bitcoin-cli vis stdin y omitir el límite de tamaño de los argumentos.

Hay bibliotecas para deserializar transacciones por ahí.

pybitcointools - pitón

bitwasp/bitcoin-php - php

libbitcoin - C++/C

ACTUALIZADO: bitcoin-lib-php - php

Seguro que hay muchos otros.

¿Conoces alguno en JavaScript? Por ejemplo, ¿Bitcore puede deserializar transacciones?