Construye en Flow: Aprende FCL - 6. Como consultar el último bloque de la cadena.
Tags: javascript, web3, flow, fcl
Published: 2022-06-13 01:22:21

## 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](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:

```jsx
// 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.

```jsx
(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í:

```jsx
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:

```jsx
(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`:

```jsx
(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:

```jsx
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](https://docs.onflow.org/node-operation/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](https://docs.onflow.org/node-operation/past-sporks/) 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](https://github.com/onflow/flow-go) 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](https://codesandbox.io/s/dev-to-fcl-06-get-latest-block-5wiry0) 

Hasta la próxima 👋

## Recursos

- **Código del ejemplo** - [https://codesandbox.io/s/dev-to-fcl-06-get-latest-block-5wiry0](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](https://docs.onflow.org/fcl/reference/api/#block)

Otros recursos que podrías encontrar útil:

- **Documentación de Flow** - [https://docs.onflow.org/](https://docs.onflow.org/) - Más informacion detallada sobre Flow blockchain y cómo interactuar con ella.
- **Flow Portal** - [https://flow.com/](https://flow.com/) - tu punto de entrada a Flow.
- **FCL JS** - [https://github.com/onflow/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](https://twitter.com/MaxStalker).