El blockchain esta hecho por una cadena de bloques. Ese cadena empieza con bloque 0 (cero), llamado Genesis, y sigue desde ahí aumentando +1 por bloque. Cada bloque en realidad es un block header con un raíz (Root
), el TxHash
y el ReceiptHash
que son 3 "tries" (arboles) colgando abajo de cada block header.
El trie Root
contiene el estado actual del blockchain. Si hay cambios en el world state (cualquier cambio en todo el blockchain), el Root
va a apuntar a otro raíz que en el bloque anterior. Eso técnicamente significa que, si querés ver el estado del blockchain en, p.ej, bloque 5153 se hace eso leyendo el trie Root
del bloque que esta situado 5153 bloques después del Genesis.
Como esta definido en core/block.go
, un block header (cabeza de bloque) tiene el siguiente formato:
Bytes | Nombre en Yellow Paper | Tipo | Nombre en geth |
---|---|---|---|
32 | ParentHash | [32]byte | parentHash |
32 | UncleHash | [32]byte | sha3Uncles |
20 | Coinbase | [20]byte | miner |
32 | Root | [32]byte | stateRoot |
32 | TxHash | [32]byte | transactionsRoot |
32 | ReceiptHash | [32]byte | receiptsRoot |
256 | Bloom | [256]byte | logsBloom |
8 | Difficulty | int64 | difficulty |
8 | Number | int64 | number |
8 | GasLimit | uint64 | gasLimit |
8 | GasUsed | uint64 | gasUsed |
8 | Time | int64 | timestamp |
971 | Extra | []byte | extraData |
32 | MixDigest | [32]byte | mixHash |
8 | Nonce | [8]byte | nonce |
Estos 613 bytes se comprime un poco, pero un header siempre parece tener 600+ bytes.
-
El único campo con un tamaño flexible es el
Extra
. Esta compuesto por 32 bytes de Vanity + 65 bytes con la firma del bloque. Cada 30.000 bloques (un epoch), también tiene una lista (n * 64 bytes) de todos los selladores.↩