DEV Community

Bruno Gonzales for Flow Blockchain

Posted on

Construye en Flow: Aprende FCL - 6. Como consultar el último bloque de la cadena.

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 último sealed block por su height o id.
  • 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 una cadena - por ello la palabra blockchain 💡.

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);
Enter fullscreen mode Exit fullscreen mode

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);

})();
Enter fullscreen mode Exit fullscreen mode

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)
}
Enter fullscreen mode Exit fullscreen mode

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);
})();
Enter fullscreen mode Exit fullscreen mode

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);
})()
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

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

Otros recursos que podrías encontrar útil:

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)