Bloques y Cabeceras

src/primitives/block.h: CBlockHeader (80 bytes: versión, hash previo, raíz Merkle, timestamp, nBits, nonce) y CBlockLocator.

Árbol de Merkle

src/consensus/merkle.cpp. Miles de transacciones se condensan en un hash de 32 bytes en la cabecera del bloque. Permite probar que una transacción existe en un bloque.

Árbol binario: cada tx se hashea dos veces (doble SHA256). Pares se concatenan y hashean. Impar: se duplica la última. ComputeMerkleRoot hace el trabajo.

Explorar árbol de Merkle en profundidad

Árbol de Merkle en Bitcoin

Selecciona una transacción para ver su prueba

H(A)BC0AA9
H(B)BD0AAB
H(C)BE0AAD
H(D)BF0AAE
H(AB)6D5F7B
H(CD)FB9F29
Raíz de Merkle
E4E11150

Miles de transacciones condensadas en 32 bytes en la cabecera del bloque. Permite probar inclusión sin descargar todo el bloque.

Cadena de Bloques

Cada cabecera incluye el hash del bloque anterior. Modificar el pasado requiere recalcular toda la cadena. Computacionalmente prohibitivo.

Prueba de Trabajo

src/pow.h y pow.cpp: GetNextWorkRequired, CalculateNextWorkRequired, CheckProofOfWork. Ajuste de dificultad cada 2,016 bloques.

Validación

src/validation.cpp es uno de los archivos más importantes. AcceptToMemoryPool: lógica para aceptar transacciones en el mempool. CheckBlock: comprobaciones sin contexto. ConnectBlock: comprobaciones pesadas con contexto.

Si CheckBlock falla, sales antes de las verificaciones pesadas de ConnectBlock.

El Conjunto UTXO

src/coins.h y coins.cpp. Caché en memoria de alto rendimiento de salidas no gastadas. Chainstate = estado global de quién posee qué.

Concepto

¿Qué es la raíz de Merkle en un bloque?

Click para revelar

Concepto

¿Qué es el Chainstate?

Click para revelar

Checkpoint

Quiz
Responde para continuar

¿Por qué CheckBlock se ejecuta antes que ConnectBlock?

Recap completado!