blk.dat
Los archivos que almacenan la blockchain bruta en disco
Los archivos blk.dat en el directorio ~/.bitcoin/blocks/ contienen los datos brutos de los bloques recibidos por tu nodo Bitcoin Core. Estos archivos, básicamente, almacenan toda la blockchain.
Ubicación
¿Dónde se almacena la blockchain en tu computadora?
La ubicación de los archivos brutos depende de tu sistema operativo. Estas son las ubicaciones predeterminadas:
Linux: ~/.bitcoin/blocks/
Mac: ~/Library/Application Support/Bitcoin/blocks/
Windows: C:\Users\[usuario]\AppData\Roaming\Bitcoin\blocks\
Puedes cambiar la ubicación del directorio de datos definiendo la opción datadir=<dir> en el archivo de configuración bitcoin.conf.
Nombres de Archivos
¿Cómo se organizan los archivos de la blockchain?
Cada bloque que recibe tu nodo se añade a un archivo blk.dat. Pero, en lugar de que toda la blockchain quede en un solo archivo gigante, se divide en varios archivos blk*.dat. Tu nodo primero añade bloques a blk00000.dat, luego a blk00001.dat cuando el anterior se llena, y así sucesivamente.
El tamaño máximo de un archivo blk.dat es 128 MiB (134.217.728 bytes), definido por MAX_BLOCKFILE_SIZE.
Ejemplo
¿Cómo es un bloque bruto?
Los datos en los archivos blk.dat se almacenan en binario (un montón de 1s y 0s, no texto legible). Aun así, podemos mirar el bloque génesis leyendo los primeros 293 bytes de blk00000.dat. Aquí los campos están separados:
f9beb4d9 <- magic bytes
1d010000 <- tamaño
01000000 <- versión
0000000000000000000000000000000000000000000000000000000000000000 <- bloque anterior
3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a <- raíz de merkle
29ab5f49 <- tiempo
ffff001d <- bits
1dac2b7c <- nonce
01 <- conteo de transacciones
01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4d04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000 <- transacciones
Estructura
¿Cuál es la estructura de un bloque bruto?
Los datos de arriba pueden dividirse en cinco partes: magic bytes (4 bytes, marcador de inicio), tamaño (4 bytes little-endian, el tamaño del bloque), encabezado del bloque (80 bytes), conteo de transacciones (compact size) y las transacciones.
Herramientas Linux
¿Cómo leer los datos en bruto de la blockchain?
Como los datos dentro de un archivo blk.dat son binarios, probablemente no verás nada útil al abrirlo en un editor de texto común. Pero no hay problema: los datos binarios pueden mostrarse fácilmente como bytes hexadecimales, y hay algunos comandos que ayudan:
1. xxd
Simple: vuelca el contenido de archivos binarios en hexadecimal.
$ xxd -p -s 8 -l 285 blk00000.dat Esto salta los primeros 8 bytes (magic bytes + tamaño) y lee los 285 bytes del bloque génesis — los mismos bytes del encabezado y de la transacción mostrados en el Ejemplo anterior.
Si ejecutas Bitcoin Core v28.0 o más nuevo, quizá necesites desofuscar (XOR) los datos en bruto del bloque primero para obtener el mismo resultado.
2. od
Otro comando simple: vuelca el contenido de archivos en el formato que elijas.
$ od -x --endian=big -N 293 -An blk00000.dat 3. hexdump
Muestra el contenido del archivo en hexadecimal, con una representación legible junto a los bytes.
$ hexdump -C -n 293 blk00000.dat 4. bitcoin-iterate
bitcoin-iterate es una excelente herramienta para extraer datos de los archivos en bruto de la blockchain — y es sorprendentemente rápida. Algunos ejemplos simples:
# uso
bitcoin-iterate -h
# devuelve los encabezados de los primeros 100 bloques
bitcoin-iterate -q --block='%bH' --end=100 > headers.txt
# devuelve todas las transacciones en bruto del bloque 123.456
bitcoin-iterate -q --tx='%tX' --start=123456 --end=123456 > transactions.txt
# devuelve todos los scriptPubKeys de la blockchain junto con el txid de la transacción en la que estaban
bitcoin-iterate -q --output='%th %os' > scriptpubkeys.txt XOR
¿Por qué los datos en bruto parecen revueltos?
Desde la v28.0, los datos en bruto de los bloques en los archivos blkXXXXX.dat están ofuscados por defecto. Es fácil desofuscar, pero significa que los datos en bruto ya no se almacenan en "texto plano" como antes.
ofuscar – hacer algo menos claro y más difícil de entender, especialmente de forma intencional.
La razón es que no tienes control sobre lo que otras personas puedan decidir almacenar dentro de la blockchain; así que, para evitar que los antivirus detecten problemas con los datos en bruto, estos se "revuelven" ligeramente al guardarse en tu computadora. Pero, como digo, es fácil desordenarlos de vuelta a su forma natural.
Puedes desactivar la ofuscación definiendo blocksxor=0 en tu bitcoin.conf. Sin embargo, esto solo funciona si empiezas con una descarga nueva de la blockchain. Si ya ejecutabas un nodo antes de actualizar a la v28.0, tus archivos de datos permanecerán en texto plano.
Desofuscar
Los datos en bruto se ofuscan usando la xor_key almacenada en el archivo xor.dat dentro de la carpeta /blocks/. Por ejemplo:
$ xxd -p ~/.bitcoin/blocks/xor.dat
177a35a3e43254ff Para desofuscar, usas esa xor_key y aplicas XOR a lo largo de los datos en bruto, lo que "invierte los bits" de vuelta a su forma natural. La clave tiene 8 bytes, así que hay que aplicar XOR repetidamente cada 8 bytes de los datos en bruto.
Orden de los Bloques
¿Los bloques están en orden en los archivos?
Si estás analizando los archivos blk.dat con tu propio script, ten en cuenta que los bloques no estarán en orden. Por ejemplo, puedes encontrar bloques en este orden al recorrer el archivo:
A B C E F D G Esto se debe a que tu nodo descarga bloques en paralelo, para obtener la blockchain lo más rápido posible. Así que, en lugar de esperar a recibir cada bloque en orden, el nodo descarga bloques más adelante a medida que avanza. La distancia máxima hacia adelante (o el "máximo desorden") está controlada por BLOCK_DOWNLOAD_WINDOW en el código fuente de Bitcoin.