Создаем на Flow | Изучаем FCL — 6. Как запросить последний блок в сети
Published: 2022-07-01 15:45:07

## Краткий обзор
В процессе создания приложения Web3 распространенной и полезной задачей является получение последнего закрытого блока. Получение последнего закрытого блока полезно для запроса определенных событий и данных, чтобы убедиться, что все работает так, как задумано. В этом руководстве вы узнаете, как:

- как использовать функцию `block` для получения последнего `закрытого блока`, блока по его `heightor` или `id`
- недостатки FCL, связанные с запросом блока

## Блоки? Как в Тетрисе?
Ну, не совсем 😅 Блок - это конструкция, предназначенная для содержания определенной информации, например, определенного количества транзакций, подбираемых нодами Collection для выполнения. Различные типы данных, которые содержат блоки:

- **id** - идентификатор блока, который может быть использован для получения конкретного блока по идентификатору
- **height** - текущая высота блока (можно представить, как если бы вы складывали ящики один на другой)
- **parentId** - чтобы можно было вернуться "назад во времени" и прочитать информацию из предыдущего блока
- **timestamp** - объект, **** содержащий поля, связанные со временем.
- **blockSeals** - информация о том, какие ноды выполнили и закрыли блоки
- **collectionGuarantees** - все подписи для элементов в блоке

> Блоки в блокчейне организованы таким образом, что каждый блок (за исключением `блока Genesis`) ссылается на блок, прикрепленный к нему с "хвоста". Когда вы соединяете несколько блоков таким образом, вы можете представить, что они образуют чейн (цепь) - отсюда и слово `блокчейн` 💡.

## Возвращаясь к интересной части
Существует как минимум два способа запросить последний закрытый блок. Мы рассмотрим самый простой, вызвав функцию `[block]`(https://docs.onflow.org/fcl/reference/api/#block) - предварительно созданное взаимодействие, которое возвращает последний блок (по выбору, закрытый или нет), по id или по высоте. Поскольку я уже " зацепил вас", давайте сразу же перейдем к детальному рассмотрению этого процесса в действии!

## Шаг 1 - Установка
Добавьте `"@onflow/fcl": "1.0.0"` в качестве зависимости

## Шаг 2 - Настройка
Как и в прошлый раз импортируем необходимые методы и настраиваем FCL:

```javascript
// Import methods from FCL
import { block, config } from "@onflow/fcl";

// Specify the API endpoint - this time we will use Mainnet
const api = "https://rest-mainnet.onflow.org";

// Configure FCL to use mainnet as the access node
config().put("accessNode.api", api);
```

## Заключение
Поскольку функция `block` не требует настройки, мы проделаем весь процесс за один раз, не устанавливая дополнительных методов, как это было ранее.

```javascript
(async () => {
  console.clear();

  const latestBlock = await block({ sealed: true });
  console.log("latestBlock", latestBlock);

})();
```
Если вы посмотрите консоль, то там должна быть информация о последнем блоке:

```javascript
latestBlock 
{
    id: "29697cbe3f0b811f319c99e0002536c5404491feab39d1b3f63ac92faec16306",
    parentId: "8bbb05e0e84fb78648b1673a67a5ddf1556a7d9bfd3a81c3afabd108c8234e1e",
    height: 69553091,
    timestamp: "2022-06-01T16:04:42.593016593Z",
    collectionGuarantees: Array(0),
    blockSeals: Array(2)
}
```
Давайте воспользуемся полем `height` блока `latestBlock` и запросим другой блок, вычитая из него `1`:

```javascript
(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);
})();
```
Наконец, давайте воспользуемся полем `parentId` `previousBlock`, чтобы получить другой блок по `id`:

```javascript
(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);
})()
```
После выполнения обновленного кода вы должны увидеть аналогичный вывод в консоли:

```javascript
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)
```
Зачем нам нужен `sealed` (закрытый) блок? 🤔
Как вы, вероятно, заметили, мы передаем аргумент `sealed` для получения последнего блока. Блок будет закрыт нодами консенсуса только после того, как будет собрано достаточное количество одобрений результата. Проще говоря, вы можете быть уверены, что если ваша транзакция была включена в блок, то она была либо выполнена, либо отменена.

## Ограничения
Процесс получения конкретного блока - по идентификатору или высоте - ограничен текущим [spork](https://docs.onflow.org/node-operation/spork/) - скоординированным процессом обновления сети, когда операторы нод обновляют программное обеспечение своих нод и повторно инициализируются с консолидированным представлением состояния предыдущего spork's.

Информацию о текущем и предыдущем spork можно найти на [сайте Flow Documentation](https://docs.onflow.org/node-operation/past-sporks/).

Если блок, который вы хотите получить, находится за пределами текущего spork, и вам действительно нужно получить эту информацию - ваш единственный вариант - использовать `[Flow Go SDK](https://github.com/onflow/flow-go)` и направить его на определенную ноду доступа. Мы не будем рассматривать этот процесс в этой статье, но, возможно, в одной из будущих серий 😉.
Полный код можно найти на Codesandbox здесь: [https://codesandbox.io/s/dev-to-fcl-06-get-latest-block-5wiry0](https://codesandbox.io/s/dev-to-fcl-06-get-latest-block-5wiry0).

До следующего раза 👋

## Информационные ресурсы

- **Пример** — [https://codesandbox.io/s/dev-to-fcl-06-get-latest-block-5wiry0](https://codesandbox.io/s/dev-to-fcl-06-get-latest-block-5wiry0)
- **Функция `block`**- [https://docs.onflow.org/fcl/reference/api/#block](https://docs.onflow.org/fcl/reference/api/#block)

Другие источники, которые могут быть вам полезны:

- **(ENG) | Документация Flow** - https://docs.onflow.org/ - более детальная информации о блокчейне Flow и как взаимодействовать с ним
- **(ENG) | Flow Portal** - https://flow.com/ - your entry point to Flow
- **(ENG) | FCL JS** - https://github.com/onflow/fcl-js - Исходный код и возможность поучаствовать в разработке библиотеки FCL JS library
- **(ENG) | Cadence** - https://docs.onflow.org/cadence/ - Введение в язык программирования Cadence
- **Codesandbox** - https://codesandbox.io - Замечательная среда разработки и прототипирования прямо в вашем браузере