Resumen
Aprende a obtener el último bloque de Ethereum usando el método JSON-RPC eth_getBlockByNumber, incluyendo ejemplos con curl y ethers.js, campos de respuesta y errores comunes. Compara opciones de RPC públicas, gestionadas y dedicadas para elegir el endpoint adecuado para tu dApp.
Respuesta rápida: Usa eth_getBlockByNumber con "latest"
Para obtener el último bloque de Ethereum, llama al método JSON-RPC eth_getBlockByNumber con el parámetro "latest" y false como segundo argumento (para omitir los objetos de transacción completos). Aquí tienes un ejemplo mínimo con curl contra un endpoint público de Ethereum:
curl -X POST https://eth.api.onfinality.io/public \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["latest",false],"id":1}'
La respuesta incluye la cabecera del bloque, los hashes de las transacciones, el uso de gas y la marca de tiempo. Esta es la forma estándar de leer la cabeza actual de la cadena para indexación, monitoreo o construcción de funciones orientadas al usuario como exploradores de bloques.
Guía de decisión: ¿Qué endpoint RPC deberías usar?
Antes de escribir código, decide qué endpoint RPC de Ethereum se adapta a tu carga de trabajo. La elección correcta depende de la frecuencia con la que consultas, si necesitas suscripciones WebSocket y si necesitas datos históricos.
| Carga de trabajo | Endpoint recomendado | Por qué |
|---|---|---|
| Lecturas ocasionales, prototipado | Endpoint público (por ejemplo, https://eth.api.onfinality.io/public) | Gratis, sin registro, adecuado para bajo volumen |
| dApp en producción, tráfico moderado | Servicio de RPC gestionado (por ejemplo, API de OnFinality) | Mejor fiabilidad, límites de tasa y soporte |
| Sondeo de alta frecuencia, WebSocket | Nodo dedicado (por ejemplo, Nodo Dedicado de OnFinality) | Sin límites de tasa compartidos, baja latencia, configuración personalizada |
| Datos de archivo, historial profundo | Nodo de archivo (a menudo a través de un nodo dedicado) | Necesario para eth_getLogs en bloques antiguos |
Si estás construyendo una aplicación de producción, comienza con un proveedor de RPC gestionado para evitar la carga operativa de ejecutar tu propio nodo. Para casos de uso de alto rendimiento o sensibles a la latencia, considera un nodo dedicado. Consulta precios de RPC y redes RPC compatibles para más detalles.
¿Qué es eth_getBlockByNumber?
eth_getBlockByNumber es un método JSON-RPC de Ethereum que devuelve información sobre un bloque especificado por su número o etiqueta. El método acepta dos parámetros:
blockNumber(CANTIDAD o ETIQUETA): El número de bloque como cadena hexadecimal, o una de las etiquetas"earliest","latest","pending","safe"o"finalized".fullTx(BOOLEANO): Si estrue, devuelve objetos de transacción completos; si esfalse, devuelve solo los hashes de las transacciones.
Cuando pasas "latest", el nodo devuelve el bloque más reciente en la cadena canónica. Esto es equivalente al bloque que se referenciaría con la etiqueta latest en otras APIs de Ethereum.
Cómo obtener el último bloque con curl
Aquí tienes un ejemplo completo de curl que obtiene el último bloque solo con hashes de transacciones:
curl -X POST https://eth.api.onfinality.io/public \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["latest",false],"id":1}'
Para obtener objetos de transacción completos, cambia false a true. Ten en cuenta que esto puede producir una respuesta muy grande si el bloque tiene muchas transacciones.
Cómo obtener el último bloque con ethers.js
En ethers.js v6, puedes usar el método getBlock en un proveedor:
import { ethers } from "ethers";
const provider = new ethers.JsonRpcProvider("https://eth.api.onfinality.io/public");
async function getLatestBlock() {
const block = await provider.getBlock("latest");
console.log(block.number);
console.log(block.hash);
console.log(block.timestamp);
console.log(block.transactions); // array de hashes de transacciones
}
getLatestBlock();
Si necesitas objetos de transacción completos, usa provider.getBlock("latest", true).
Entendiendo los campos de la respuesta
El objeto de respuesta contiene muchos campos. Aquí están los más útiles para desarrolladores:
| Campo | Descripción |
|---|---|
number | El número de bloque (hex). |
hash | El hash del bloque. |
parentHash | Hash del bloque padre. |
timestamp | Marca de tiempo Unix de cuando se propuso el bloque. |
transactions | Array de hashes de transacciones u objetos de transacción completos, dependiendo de fullTx. |
gasUsed | Gas total usado por todas las transacciones en el bloque. |
gasLimit | Límite de gas del bloque. |
miner | Dirección del productor del bloque (post-fusión, este es el destinatario de las tarifas). |
baseFeePerGas | La tarifa base por gas para este bloque (EIP-1559). |
Errores comunes y cómo evitarlos
- Usar la etiqueta incorrecta:
"latest"es la cabeza de la cadena, pero puede ser reorganizada. Si necesitas una referencia estable, usa"safe"o"finalized"para aplicaciones que requieran finalidad. - Respuestas grandes: Solicitar
fullTx=trueen un bloque ocupado puede devolver megabytes de datos. Usafalsey obtén transacciones individuales si es necesario. - Límites de tasa: Los endpoints públicos a menudo tienen límites de tasa. Si sondeas con frecuencia, puedes encontrar errores. Considera un servicio de RPC gestionado o un nodo dedicado.
- WebSocket vs HTTP: Para actualizaciones en tiempo real, usa suscripciones WebSocket en lugar de sondear
eth_getBlockByNumber. OnFinality soporta WebSocket en la red principal de Ethereum; consulta la página de la red Ethereum para más detalles.
Cuándo usar WebSocket en lugar de sondeo
Sondear eth_getBlockByNumber cada pocos segundos es ineficiente. Si tu aplicación necesita reaccionar a nuevos bloques al instante, suscríbete a nuevas cabeceras de bloque a través de WebSocket:
import { ethers } from "ethers";
const provider = new ethers.WebSocketProvider("wss://eth.api.onfinality.io/public");
provider.on("block", (blockNumber) => {
console.log("Nuevo bloque:", blockNumber);
});
Esto envía números de bloque a tu cliente a medida que ocurren, reduciendo la latencia y las solicitudes innecesarias.
Lista de verificación para producción
Antes de salir a producción, revisa esta lista:
- Elige el proveedor de RPC adecuado según tus necesidades de tráfico y fiabilidad.
- Implementa lógica de reintento con retroceso exponencial para errores transitorios.
- Usa las etiquetas
"safe"o"finalized"para aplicaciones que requieran finalidad. - Monitorea tu uso de RPC y configura alertas para errores de límite de tasa.
- Considera un nodo dedicado si necesitas un rendimiento consistente.
Conclusiones clave
- Usa
eth_getBlockByNumbercon la etiqueta"latest"para obtener el bloque actual de la cabeza. - El método devuelve metadatos del bloque y hashes de transacciones o transacciones completas.
- Para producción, elige un proveedor de RPC gestionado o un nodo dedicado para evitar límites de tasa y tiempo de inactividad.
- Las suscripciones WebSocket son más eficientes que el sondeo para actualizaciones de bloques en tiempo real.
Preguntas frecuentes
¿Cuál es la diferencia entre los bloques "latest" y "safe"?
"latest" es el bloque más reciente en la cadena canónica, pero puede ser reorganizado. "safe" es un bloque que es poco probable que sea reorganizado, y "finalized" está garantizado como final. Usa "safe" o "finalized" para aplicaciones que requieran finalidad.
¿Cómo obtengo solo el número del último bloque?
Puedes llamar a eth_blockNumber para obtener el número del último bloque como cadena hexadecimal. Esto es más ligero que obtener el bloque completo.
¿Por qué mi solicitud devuelve un error?
Los errores comunes incluyen límite de tasa, JSON inválido o el uso de una etiqueta no soportada. Verifica la URL de tu endpoint y asegúrate de usar una carga útil JSON-RPC válida.
¿Puedo obtener el último bloque en una testnet?
Sí, usa el mismo método en un endpoint de testnet, como https://eth-sepolia.api.onfinality.io/public para Sepolia. Consulta la página de la red Sepolia para más detalles.
¿Cuál es el mejor proveedor de RPC para Ethereum?
No hay un único proveedor "mejor"; depende de tu carga de trabajo. Compara opciones públicas, gestionadas y dedicadas en nuestra comparación de proveedores de RPC de Ethereum. OnFinality ofrece nodos gestionados y dedicados; consulta precios de RPC para más detalles.