Resumen
Mientras construyes tu aplicación Web3, una tarea común y útil es traer el último bloque sellado. Traer el último bloque sellado es útil para consultar eventos específicos y data para asegurarse de que todo esta trabajado como se espera. Esta guía te enseñara a:
- como usar la función
block
para traer el últimosealed block
por suheight
oid
. - las limitaciones de FCL en relación a la consulta de bloques
Bloques? Como en Tetris?
Bueno, no realmente 😅 El bloque es un constructo diseñado para contener cierta información como la cantidad específica de transacciones, elegidas por los nodos de rol Collection
para su ejecución. Los tipos de data que los bloques contienen son: ****
- id - el id del bloque generalmente usado para traer un bloque específico por su id.
- height - la altura actual del bloque (puedes visualizarla como si estuvieras apilando cajas una encima de la otra).
- parentId - para que puedas regresar en el tiempo y leer la información del bloque pasado.
- timestamp - objeto, conteniendo campos relacionados con el tiempo.
- blockSeals - los detalles de qué nodos ejecutaron y sellaron el bloque.
- collectionGuarantees - todas las firmas por los items en el bloque.
Los bloques en la blockchain están organizados de tal manera que cada bloque (excepto el
bloque genesis
) está referenciando un bloque pegado a él desde su “cola”. Cuando conectas varios bloques de esta maneras puedes visualizar que forman unacadena
- por ello la palabrablockchain
💡.
De vuelta a la parte divertida
Hay al menos dos maneras para consultar el último bloque sellado. Cubriremos la más simple llamando la función block
- https://docs.onflow.org/fcl/reference/api/#block - una interacción pre construida que retorna el último bloque (opcionalmente sellado o no), por id o por altura. Aprovechando que ya te “enganché” saltemos a verlo en acción y en detalle!
Paso 1 - Instalación
Agrega "@onflow/fcl": "1.0.0"
como dependencia.
Paso 2 - Setup
Como la última vez importaremos los métodos necesarios para configurar FCL:
// Importaremos los métodos de FCL
import { block, config } from "@onflow/fcl";
// Especificamos los endpoints de la API - esta vez usaremos Mainnet
const api = "https://rest-mainnet.onflow.org";
// Configuraremos FCL para usar mainnet como el nodo de acceso
config().put("accessNode.api", api);
Finalmente
Ya que la función block
no requiere ningún setup atravesaremos el proceso de una pasada, sin configurar métodos adicionales como hicimos anteriormente.
(async () => {
console.clear();
const latestBlock = await block({ sealed: true });
console.log("latestBlock", latestBlock);
})();
Si revisas la consola encontrarás información acerca del último bloque ahí:
latestBlock
{
id: "29697cbe3f0b811f319c99e0002536c5404491feab39d1b3f63ac92faec16306",
parentId: "8bbb05e0e84fb78648b1673a67a5ddf1556a7d9bfd3a81c3afabd108c8234e1e",
height: 69553091,
timestamp: "2022-06-01T16:04:42.593016593Z",
collectionGuarantees: Array(0),
blockSeals: Array(2)
}
Usemos el campo height
de latestBlock
y consultemos otro bloque sustrayendo 1
a su valor:
(async () => {
console.clear();
const latestBlock = await block({ sealed: true });
console.log("latestBlock", latestBlock);
const previousBlock = await block({ height: latestBlock.height - 1 });
console.log("previousBlock", previousBlock);
})();
Finalmente, usaremos el campo parentId
de previousBlock
para obtener otro bloque por id
:
(async () => {
console.clear();
const latestBlock = await block({ sealed: true });
console.log("latestBlock", latestBlock);
const previousBlock = await block({ height: latestBlock.height - 1 });
console.log("previousBlock", previousBlock);
const blockById = await block({ id: previousBlock.parentId });
console.log("blockById", blockById);
})()
Después de que el código actualizado sea ejecutado, deberías ver un mensaje parecido en la console:
latestBlock
{
id: "29697cbe3f0b811f319c99e0002536c5404491feab39d1b3f63ac92faec16306",
parentId: "8bbb05e0e84fb78648b1673a67a5ddf1556a7d9bfd3a81c3afabd108c8234e1e",
height: 69553091,
timestamp: "2022-06-01T16:04:42.593016593Z",
collectionGuarantees: Array(0),
blockSeals: Array(2)
}
previousBlock
{
id: "8bbb05e0e84fb78648b1673a67a5ddf1556a7d9bfd3a81c3afabd108c8234e1e",
parentId: "3556f13dba2c2e5d543944139666b21d56d2ece8ceb00998e70ec5b007e4c0cd",
height: 69553090,
timestamp: "2022-06-01T16:04:41.751672413Z",
collectionGuarantees: Array(0),
blockSeals: Array(0)
}
blockById
{
id: "3556f13dba2c2e5d543944139666b21d56d2ece8ceb00998e70ec5b007e4c0cd",
parentId: "8ab3734670901b1d76b57e0ae53908d17b621ea7b7172565a9e07ffe591b2385",
height: 69553089,
timestamp: "2022-06-01T16:04:40.932442068Z",
collectionGuarantees: Array(0),
blockSeals: Array(1)
Por qué querríamos el bloque sealed
? 🤔
Como probablemente notaste, estamos pasando el argumento sealed
para traer el último bloque. El bloque será sellado por los nodos de rol Consenso
solo cuando suficientes aprobaciones hayan sido colectadas. En castellano, puedes estar seguro de que si tu transacción fue incluida en el bloque fue ejecutada o revertida.
Limitaciones
El proceso de obtener un bloque específico - ya sea por id
o height
- esta limitado a un spork - un proceso de actualización de la red donde operadores de nodos actualizan el software de su nodo y lo re-inicializan con una representacion consolidada del estado del spork previo.
Puedes encontrar mas información acerca del spork actual y el pasado en la Documentación de Flow.
Si el bloque que quieres esta fuera del spork actual, y realmente necesitas obtener esa información - tu única opción es usar la Flow Go SDK y apuntar a un nodo de acceso específico. No cubriremos ese proceso en este artículo pero quizás en una serie futura. 😉
El código completo puede ser encontrado en este Codesandbox
Hasta la próxima 👋
Recursos
- Código del ejemplo - https://codesandbox.io/s/dev-to-fcl-06-get-latest-block-5wiry0
-
Documentación de la función
block
- https://docs.onflow.org/fcl/reference/api/#block
Otros recursos que podrías encontrar útil:
- Documentación de Flow - https://docs.onflow.org/ - Más informacion detallada sobre Flow blockchain y cómo interactuar con ella.
- Flow Portal - https://flow.com/ - tu punto de entrada a Flow.
- FCL JS - https://github.com/onflow/fcl-js - Código fuente y la habilidad de contribuir a la librería FCL JS.
Esta es una traducción al español del sexto artículo de la serie Build on Flow | Learn FCL escrito por Maksimus Starka.
Top comments (0)