Un hash de bloque es el resumen criptográfico de longitud fija del encabezado de un bloque y sirve como identificador único del bloque en exploradores, API y lógica de consenso. Este artículo explica los campos del encabezado que alimentan el hash, por qué el mismo bloque puede aparecer bajo un número y un hash, y cómo obtener y verificar de forma cruzada un hash de bloque a través de un endpoint JSON-RPC. Incluye procedimientos ejecutables en curl, Python y JavaScript, una tabla de verificación que puedes completar con tus propios resultados y solución de problemas para los casos comunes de discrepancia. El objetivo es un método reproducible que puedas aplicar en cualquier cadena compatible con EVM, en lugar de una lista de endpoints.
Qué Representa un Hash de Bloque
Un hash de bloque es un resumen criptográfico de longitud fija calculado sobre el encabezado de un bloque. Dado que el encabezado compromete el conjunto de transacciones del bloque mediante una raíz de Merkle, el hash efectivamente identifica todo el bloque: cambia cualquier transacción, marca de tiempo o referencia al padre y el hash resultante cambia por completo. Esa propiedad es lo que hace que el hash sea utilizable como referencia única de un bloque, y es por eso que los exploradores permiten buscar tanto por hash como por número de bloque.
La distinción importante para los desarrolladores es que un número de bloque es una posición en una secuencia, mientras que un hash de bloque es una identidad derivada del contenido. Dos cadenas pueden tener ambas el bloque 20.000.000, pero no pueden compartir el mismo hash de bloque a menos que los encabezados sean idénticos. Cuando necesitas referenciar un bloque específico sin ambigüedad —en un log, una fila de base de datos, un mensaje entre cadenas o una verificación de reorganización— el hash es la clave más segura. Para una base más amplia sobre cómo se integran los bloques y los nodos, consulta la guía de Learn sobre alojamiento de nodos de blockchain.
- Número de bloque: posición ordinal, puede coincidir entre cadenas y puede volver a minarse tras una reorganización.
- Hash de bloque: identificador derivado del contenido, cambia si cambia cualquier campo del encabezado.
- Hash del encabezado de bloque: el mismo valor; 'hash del encabezado' enfatiza lo que realmente se hashea.
Supuestos y Requisitos Previos
Los procedimientos a continuación asumen una cadena compatible con EVM y un endpoint JSON-RPC que controlas o en el que confías. Necesitas un marcador de posición RPC_URL que acepte eth_getBlockByNumber y eth_getBlockByHash, además de Python 3.9+ o Node.js 18+ si deseas ejecutar los scripts de verificación. No se requiere clave privada porque todas las llamadas aquí son de solo lectura; si más adelante agregas el envío de transacciones, mantén las claves fuera de los archivos fuente.
Si aún no tienes un endpoint, la guía de endpoints RPC explica la ruta de la solicitud, y la página del servicio API describe el acceso gestionado. La selección del endpoint en sí es una decisión aparte; el Asistente RPC cubre las opciones concretas de proveedores, mientras que este artículo se centra en el método.
Cómo el Encabezado Produce el Hash
Los mineros y validadores hashean el encabezado del bloque, no la lista de transacciones en bruto. El encabezado contiene el hash del bloque padre, una raíz de Merkle que resume las transacciones, una marca de tiempo, un campo de dificultad o relacionado con el objetivo, un nonce y extras específicos del protocolo. En cadenas estilo Bitcoin, el encabezado se hashea con doble SHA-256; en cadenas EVM, el encabezado se codifica (típicamente RLP) y se hashea con Keccak-256. El algoritmo exacto es específico de cada cadena, así que confírmalo siempre a partir de la especificación de la cadena en lugar de asumirlo.
Se derivan dos consecuencias. Primero, el hash compromete el hash del padre, por lo que los bloques forman una cadena enlazada por hash y manipular un bloque anterior invalida todos los descendientes. Segundo, las cadenas de prueba de trabajo producen hashes por debajo de un objetivo, razón por la cual los hashes de bloque de Bitcoin a menudo comienzan con muchos ceros. Ese patrón de ceros iniciales es un artefacto de la dificultad, no una propiedad del hashing en general; los hashes de bloque EVM parecen uniformemente aleatorios.
# Illustrative header fields (names vary by chain and client)
parent_hash: 0x... # hash of block N-1
merkle_root: 0x... # commitment to transactions
timestamp: 1710000000
nonce: 0x...
extra_data: 0x...
# hash = H(encode(header)) -> chain-specific H (Keccak-256 on EVM, double SHA-256 on Bitcoin)Obtener un Hash de Bloque a Través de JSON-RPC
La forma más rápida de obtener un hash de bloque es eth_getBlockByNumber con el indicador de transacciones completas establecido en false. La respuesta incluye el campo hash junto con number, parentHash y timestamp. Usa un endpoint de marcador de posición y reemplázalo con el tuyo; no codifiques una URL pública en el código de producción.
Ejecuta lo siguiente y confirma que el JSON contiene un hash no nulo y un número que coincida con la etiqueta que solicitaste. Un resultado nulo generalmente significa que el bloque aún no está disponible en ese nodo, lo cual es común al consultar 'latest' contra un endpoint retrasado.
curl -s -X POST "$RPC_URL" \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"eth_getBlockByNumber","params":["latest",false]}' \
| python3 -c 'import sys,json; b=json.load(sys.stdin)["result"]; print(b["number"], b["hash"], b["parentHash"])'Verificación Cruzada de Hash y Número en Python
Una sola consulta demuestra que el nodo devolvió algo; no demuestra que el hash sea canónico. La verificación confiable consiste en obtener el bloque por número, luego obtenerlo de nuevo por el hash devuelto y confirmar que ambas respuestas coinciden en number, hash y parentHash. Este viaje de ida y vuelta detecta hashes truncados, endpoints de cadena incorrecta y nodos que están en medio de una reorganización.
El script a continuación usa solo la biblioteca estándar. Imprime una pequeña tabla que puedes pegar en un informe. Trata cualquier discrepancia como una señal para investigar, no como una peculiaridad de formato.
import json, urllib.request, os
RPC = os.environ["RPC_URL"]
def call(method, params):
req = urllib.request.Request(
RPC,
data=json.dumps({"jsonrpc":"2.0","id":1,"method":method,"params":params}).encode(),
headers={"Content-Type":"application/json"},
)
with urllib.request.urlopen(req, timeout=15) as r:
body = json.load(r)
if "error" in body:
raise RuntimeError(body["error"])
return body["result"]
by_number = call("eth_getBlockByNumber", ["latest", False])
by_hash = call("eth_getBlockByHash", [by_number["hash"], False])
print(f"{'field':<12}{'by number':<20}{'by hash':<20}")
for f in ("number", "hash", "parentHash"):
print(f"{f:<12}{by_number[f]:<20}{by_hash[f]:<20}")
assert by_number["hash"] == by_hash["hash"], "hash mismatch"
assert by_number["number"] == by_hash["number"], "number mismatch"
print("OK: hash and number agree")Verificar un Hash en JavaScript
Los clientes de navegador y Node.js a menudo necesitan la misma verificación antes de escribir una referencia de bloque en una base de datos. El fragmento a continuación usa fetch y funciona en Node 18+ y navegadores modernos. También demuestra la verificación del enlace parentHash: el parentHash del bloque N debe ser igual al hash del bloque N-1, que es el invariante central detrás de la integridad de la cadena.
Si estás construyendo contra un endpoint gestionado, confirma primero el ID de la cadena para no comparar hashes entre dos redes diferentes que casualmente comparten números de bloque.
const RPC = process.env.RPC_URL;
async function rpc(method, params) {
const res = await fetch(RPC, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ jsonrpc: "2.0", id: 1, method, params }),
});
const body = await res.json();
if (body.error) throw new Error(JSON.stringify(body.error));
return body.result;
}
const latest = await rpc("eth_getBlockByNumber", ["latest", false]);
const parent = await rpc("eth_getBlockByHash", [latest.parentHash, false]);
console.log({ number: latest.number, hash: latest.hash, parent: latest.parentHash });
if (parent.hash !== latest.parentHash) throw new Error("parent linkage broken");
console.log("OK: parentHash links to parent block");Tabla de Resultados para Completar con tus Propias Mediciones
No confíes en una sola observación. Ejecuta la verificación de ida y vuelta varias veces contra el endpoint que planeas usar y registra los resultados en una tabla como la siguiente. Las columnas son deliberadamente genéricas para que puedas reutilizar la tabla en diferentes cadenas y proveedores. Deja las celdas en blanco hasta que hayas ejecutado realmente la verificación; la tabla es un procedimiento, no un conjunto de números publicados.
| Ejecución | ID de cadena | Número de bloque | Hash (truncado) | Por número == por hash | Enlace padre OK | Latencia (ms) | Notas |
|---|---|---|---|---|---|---|---|
| 1 | |||||||
| 2 | |||||||
| 3 |
Un patrón de concordancia consistente entre ejecuciones es el requisito mínimo para usar un endpoint como fuente de referencias de bloque. Las discrepancias intermitentes suelen indicar balanceo de carga entre nodos a diferentes alturas, lo cual es una preocupación de infraestructura y no de hashing.
Solución de Problemas Comunes de Discrepancia de Hash
La mayoría de los problemas con hashes de bloque caen en unos pocos grupos. Un resultado nulo significa que el bloque aún no está en ese nodo. Un hash que difiere de un explorador generalmente significa que estás en una cadena diferente, una bifurcación o una testnet con los mismos números de bloque. Un parentHash que no coincide con el hash del bloque anterior significa que el nodo está en medio de una reorganización o que obtuviste los dos bloques en momentos diferentes.
El orden de bytes es una trampa clásica en cadenas estilo Bitcoin: el hash devuelto al hashear el encabezado está en orden de bytes natural, mientras que los exploradores lo muestran invertido. Las cadenas EVM devuelven cadenas hexadecimales que ya están en orden de visualización, así que no apliques una inversión allí. Finalmente, confirma que estás hasheando el encabezado y no el cuerpo completo del bloque; hashear la carga incorrecta produce un resumen que parece plausible pero es incorrecto.
- Resultado nulo: bloque aún no disponible; reintenta o consulta un endpoint sincronizado.
- El hash difiere del explorador: verifica el ID de cadena, la red y el estado de la bifurcación.
- Enlace padre roto: vuelve a obtener ambos bloques de forma atómica o espera a que la reorganización se estabilice.
- Ceros inesperados: esperados en cadenas de prueba de trabajo, no en cadenas EVM.
Limitaciones y Compensaciones
Un hash de bloque es un identificador, no una prueba de corrección por sí mismo. Te dice de qué bloque estás hablando, pero no te dice si el bloque es final. En cadenas con finalidad probabilística, un hash puede quedar huérfano tras una reorganización, por lo que las aplicaciones que necesitan referencias estables deben esperar una profundidad de confirmación adecuada para la cadena y almacenar tanto el hash como el número.
El hashing tampoco te protege de un endpoint malicioso que devuelve un bloque autoconsistente pero no canónico. Para casos de uso de alta seguridad, compara con múltiples fuentes independientes o verifica el encabezado contra las reglas de consenso tú mismo. La compensación es latencia y complejidad frente a la confianza en un único proveedor. Para equipos que ejecutan su propia infraestructura, un nodo dedicado elimina la variable del endpoint compartido, y los precios de RPC ayudan a dimensionar el costo de esa elección.
Próximos Pasos
Una vez que puedas obtener y verificar de forma cruzada un hash de bloque de manera confiable, las extensiones naturales son la detección de reorganizaciones (comparar hashes almacenados con la cadena actual), la indexación de logs con clave por hash de bloque y las referencias entre cadenas que incluyan tanto el ID de cadena como el hash. Si estás eligiendo un endpoint para estas cargas de trabajo, comienza con la guía de endpoints RPC multicadena y el directorio de redes, luego usa el Asistente RPC para la decisión específica del proveedor en lugar de adivinar a partir de una lista.
Para equipos que estandarizan el acceso gestionado, la página del servicio API y el artículo sobre el mejor proveedor RPC para proyectos Web3 cubren el lado operativo. Mantén el script de verificación de este artículo en tu suite de pruebas para que cualquier cambio de endpoint se verifique contra los mismos invariantes de hash y padre antes de llegar a producción.