Bloque

Un contenedor para transacciones

Un bloque es un contenedor para transacciones.

En la parte superior de todo bloque hay una cabecera de bloque, que resume todos los datos del bloque. Contiene una huella digital (raíz de Merkle) de todas las transacciones del bloque, además de una referencia a un bloque anterior.

Los mineros hacen hash de esa cabecera repetidamente para intentar obtener un resultado por debajo del objetivo actual. Si consigues un hash de bloque por debajo del objetivo, el bloque puede añadirse a la blockchain. Ese proceso se llama minería.

Los nodos reúnen nuevas transacciones en un bloque, las hashean en un árbol de hash y recorren valores de nonce para hacer que el hash del bloque satisfaga los requisitos de prueba de trabajo. Cuando resuelven la prueba de trabajo, transmiten el bloque a todos y el bloque se añade a la cadena de bloques.
Satoshi Nakamoto, Bitcoin v0.1 (main.h)

Ejemplo

Aquí están los datos brutos del bloque 1 (el primer bloque después del génesis), con los campos separados:

01000000 <- versión
6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000 <- bloque anterior
982051fd1e4ba744bbbe680e1fee14677ba1a3c3540bf7b1cdb606e857233e0e <- raíz de merkle
61bc6649 <- tiempo
ffff001d <- bits
01e36299 <- nonce
01 <- conteo de transacciones
01000000010000...00000000 <- transacciones

Este bloque solo contiene una transacción, pero la estructura básica es la misma para todo bloque. (Los campos de la cabecera están en little-endian / orden natural.)

Todo bloque en bruto empieza con una cabecera de bloque. Contiene un resumen del contenido del bloque y se usa para crear el hash del bloque. Tiene 80 bytes y seis campos:

Encabezado de Bloque

Decodifique y codifique un encabezado de bloque.

0 bytes
Encabezado de Bloque (Campos)

Versión

Versión: 0
0d
0d

Versión

El campo versión se usa para señalar actualizaciones de Bitcoin. Originalmente era un entero simple; desde 2015 (BIP 9) se interpreta como un bit field, donde cada bit puede asignarse a una posible actualización. La versión estándar es 0x20000000 (no señala ninguna actualización).

Bloque Anterior

El campo bloque anterior contiene el hash de un bloque existente, sobre el cual se construye el bloque actual. Los mineros siempre quieren extender la cadena más larga, así que este campo contiene el hash del bloque que está actualmente en la punta (la "cabeza").

Raíz de Merkle

El campo raíz de Merkle contiene una huella digital de todos los datos de transacción del bloque. Impide que el contenido del bloque se altere: todas las transacciones quedan "comprometidas" con la cabecera mediante la raíz de Merkle, así que, si alguna transacción se modifica después, la raíz ya no coincidirá (y el bloque será inválido).

Raíz de Merkle

Raíz de Merkle

Calcule la raíz de Merkle a partir de una lista de TXIDs.

Bloque

Una lista de TXIDs separados por espacios, comas o nuevas líneas. Las comillas y los corchetes se ignoran.

Los TXIDs deben insertarse en la orden de bytes invertida (como aparecen en los exploradores), pero se convierten a la orden de bytes natural antes de calcular la raíz de Merkle.

TXIDs (0)

El orden de los bytes como sale de la función hash

El orden de los bytes como se muestra en los exploradores

Tiempo

El campo tiempo contiene la hora en que se construyó el bloque como una marca temporal Unix. No necesita ser exacta, pero debe estar dentro de unas dos horas alrededor del tiempo mediano de la red para que los nodos acepten el bloque.

Unix Time

Unix Time

Convierte el número de segundos desde 01/01/1970, 00:00:00 en una fecha.

0d

Bits

El campo bits es una representación compacta del objetivo en el momento en que se minó el bloque. En vez de almacenar el valor completo del objetivo de 32 bytes en la cabecera, usamos la codificación compacta de 4 bytes.

Target / Bits

Bits del objetivo

Convierta entre un objetivo (target) y su representación compacta bits.

0x
0 bytes 0 bytes

Nonce

El nonce es un campo extra de 4 bytes que los mineros incrementan para obtener hashes de bloque completamente distintos, con la esperanza de encontrar uno por debajo del objetivo.

Transacciones

Conteo de Transacciones

El primer dato después de la cabecera del bloque es, en realidad, un conteo de transacciones, que indica el número de transacciones que vienen a continuación en el bloque. Es un campo compact size, así que normalmente tiene 1 o 3 bytes (según cuántas transacciones haya en el bloque).

Compact Size

Tamaño compacto

Convierta entre un número y su codificación compact size (el varint usado en Bitcoin).

0d
0 bytes
Prefijo

El primer byte indica qué bytes codifican el entero:

Nota: los bytes que codifican el entero están en little endian.

Transacción Coinbase

La primera transacción de todo bloque es la transacción coinbase. Es una transacción especial que los mineros colocan en el bloque para cobrar la recompensa del bloque (subsidio + tarifas). La principal diferencia técnica con una transacción "normal" es que la coinbase no "gasta" bitcoins existentes: su entrada está en blanco (todo ceros), y el valor de la salida es la recompensa del bloque. Toda transacción coinbase es obligatoria — sin ella, el bloque sería inválido. Como la coinbase no necesita desbloquear monedas existentes, los mineros suelen poner firmas y mensajes personalizados en su scriptSig.

Transacciones Normales

Tras la coinbase vienen todas las transacciones "normales", concatenadas una tras otra. Se seleccionan del memory pool cuando el minero construye el bloque. Un minero puede incluir tantas transacciones como quiera (hasta el límite de tamaño del bloque), pero está incentivado a incluir el máximo posible, para maximizar lo que puede ganar si logra minar el bloque.

El minero es responsable de comprobar que cada transacción del bloque es válida; de lo contrario, el bloque entero se considerará inválido y no podrá añadirse a la blockchain. Además, las transacciones padre siempre deben venir antes que las transacciones hijas en el bloque: si una transacción gasta una salida, esa salida debe haber sido creada por una transacción de un bloque anterior o más temprano en el mismo bloque.

Hash del Bloque

El hash de bloque se crea haciendo un SHA256 doble (HASH256) de la cabecera del bloque. Es un identificador único del bloque, lo que trae dos beneficios:

Hash del Bloque

Hash del Bloque

Cree el hash de un bloque a partir del encabezado del bloque.

0 bytes

Usado internamente, dentro de los encabezados de bloque brutos

0 bytes

Usado externamente, al buscar bloques en exploradores

0 bytes

Y, como se mencionó, durante la minería el hash de bloque debe quedar por debajo del objetivo actual para que el bloque se añada a la blockchain. Por eso todos los hashes de bloque empiezan con una serie de ceros.

Peso (Weight)

El tamaño de un bloque se mide en unidades de peso (weight). Un bloque puede tener como máximo 4.000.000 unidades de peso. Un byte de datos "normales" (no witness) vale 4 unidades de peso, y un byte de datos de testigo vale 1 unidad de peso. Esta métrica se introdujo con SegWit; antes, el límite era de 1.000.000 bytes (1 MB). Mira tamaño de la transacción para más detalles.

Ubicación

Los bloques en bruto se almacenan en disco en los archivos blk.dat de tu nodo.