> ## Documentation Index
> Fetch the complete documentation index at: https://www.helius.dev/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Как использовать getBlock

> Изучите сценарии использования getBlock, примеры кода, параметры запроса, структуру ответа и рекомендации.

Метод RPC [`getBlock`](https://www.helius.dev/docs/api-reference/rpc/http/getblock) позволяет получить подробную информацию о подтвержденном блоке в реестре Solana. Это необходимо для обозревателей блоков, анализа истории транзакций и изучения состояния сети в определенный момент времени.

<Warning>
  **Для повышения производительности не объединяйте запросы в пакеты**

  Пакетная отправка запросов к архивным методам значительно увеличивает задержку. Пакеты, содержащие более 10 запросов, не допускаются.
</Warning>

## Распространенные сценарии использования

* **Просмотр содержимого блока:** Просмотрите все транзакции, включенные в определенный [блок](https://www.helius.dev/blog/solana-slots-blocks-and-epochs).
* **Получение хешей блоков:** Получите хеш блока для заданного слота, хеш родительского блока и родительский слот.
* **Проверка высоты и времени блока:** Узнайте высоту блока (его порядковый номер) и расчетное время его создания.
* **Анализ сведений о транзакциях:** С помощью соответствующих параметров можно получить полные данные транзакций, включая метаданные: комиссии, статус, балансы до и после транзакции, а также внутренние инструкции.
* **Получение вознаграждений:** При необходимости включите информацию о вознаграждениях блока.

## Параметры

1. `slot` (число, обязательный): Номер слота блока для запроса (u64).

2. `config` (объект, необязательный): Объект конфигурации со следующими полями:
   * `commitment` (строка, необязательный): Указывает используемый [уровень подтверждения](https://www.helius.dev/blog/solana-commitment-levels). `processed` не поддерживается этим методом. Значение по умолчанию — `finalized`.
   * `encoding` (строка, необязательный): Кодировка данных транзакций. По умолчанию используется `json`, если `transactionDetails` имеет значение `full` или `accounts`; в противном случае используется `base64`.
     * `json`: Возвращает данные транзакций и учетных записей в формате JSON (устарел; вместо него используйте `jsonParsed`).
     * `jsonParsed`: Возвращает данные транзакций и учетных записей в виде разобранного JSON. Это рекомендуемый вариант, поскольку он включает все ключи учетных записей транзакции, в том числе полученные из таблиц поиска адресов (Address Lookup Tables).
     * `base58` (медленно)
     * `base64`
     * `base64+zstd`
   * `transactionDetails` (строка, необязательный): Указывает возвращаемый уровень детализации транзакций. Значение по умолчанию — `full`.
     * `full`: Возвращает полные сведения о транзакциях, включая их метаданные.
     * `accounts`: Возвращает список учетных записей, указанных в каждой транзакции, но не полные данные или метаданные транзакций.
     * `signatures`: Возвращает только подписи транзакций.
     * `none`: Не возвращает сведения о транзакциях.
   * `rewards` (логическое значение, необязательный): Определяет, следует ли включать массив вознаграждений в ответ. Значение по умолчанию — `false`.
   * `maxSupportedTransactionVersion` (число, необязательный): Максимальная возвращаемая версия транзакции. Если блок содержит транзакцию более высокой версии, запрос завершается ошибкой JSON-RPC `-32015`. Если параметр не указан, возвращаются только устаревшие транзакции, а наличие в блоке любой версионированной транзакции вызывает ошибку. Укажите `1`, чтобы включить устаревшие транзакции, транзакции v0 (с таблицами поиска адресов) и v1. См. раздел [Поддержка транзакций v1](/docs/ru/rpc/transaction-v1).

## Ответ

Если указанный блок подтвержден и найден, поле `result` будет содержать объект с информацией о блоке. Если блок не найден или не подтвержден, значением `result` будет `null`.

Основные поля объекта блока:

* `blockhash` (строка): Хеш этого блока в кодировке base58.
* `previousBlockhash` (строка): Хеш предыдущего блока в кодировке base58. Если родительский блок недоступен из-за очистки реестра, здесь может быть указан идентификатор системной программы.
* `parentSlot` (число): Номер слота родительского блока.
* `transactions` (массив): Массив объектов транзакций, включенных в блок. Структура этих объектов зависит от параметров `encoding` и `transactionDetails`.
  * Каждый объект транзакции обычно содержит `meta` (метаданные, такие как комиссия, статус, журналы и балансы до и после транзакции) и `transaction` (фактические данные транзакции, включая сообщение и подписи).
* `rewards` (массив, необязательный): Массив объектов вознаграждений, присутствующий, если указано `rewards: true`. Каждый объект содержит сведения о `pubkey`, `lamports`, `postBalance`, `rewardType` и, возможно, `commission`.
* `blockTime` (число | null): Расчетное время создания блока в виде временной метки Unix (количество секунд с начала эпохи) или `null`, если оно недоступно.
* `blockHeight` (число | null): Высота этого блока (количество предшествующих ему блоков в цепочке, начинающейся со слота 0) или `null`, если она недоступна.

Полную и подробную структуру объектов транзакции и метаданных в ответе см. в официальной документации Solana RPC.

## Пример: получение информации о блоке

Попробуем получить информацию для условного номера слота в Devnet.
**Важно:** Слоты обрабатываются быстро. Номер слота, используемый ниже (`250000000`), приведен в качестве заполнителя. При запуске примера замените его номером недавнего подтвержденного слота, который существует в целевой сети, например Devnet или Mainnet. Номера недавних слотов можно найти с помощью обозревателя блоков Solana.

**Примечание:** В приведенных ниже примерах замените `YOUR_API_KEY` фактическим ключом API Helius.

<CodeGroup>
  ```bash curl theme={"system"}
  # Replace 250000000 with a valid, recent slot number on Devnet/Mainnet
  curl https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY -X POST -H "Content-Type: application/json" -d \
  '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "getBlock",
    "params": [
      250000000, 
      {
        "encoding": "jsonParsed",
        "transactionDetails": "full",
        "rewards": true,
        "maxSupportedTransactionVersion": 1
      }
    ]
  }'
  ```

  ```javascript JavaScript (using @solana/web3.js) theme={"system"}
  const { Connection } = require('@solana/web3.js');

  async function getBlockDetails() {
    const rpcUrl = 'https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY'; // Replace YOUR_API_KEY
    const connection = new Connection(rpcUrl, 'confirmed');
    
    // Replace with a valid, recent slot number on your target network
    const slotToQuery = 250000000; 

    try {
      const block = await connection.getBlock(slotToQuery, {
        encoding: "jsonParsed",
        transactionDetails: "full",
        rewards: true,
        maxSupportedTransactionVersion: 1 
      });

      if (block) {
        console.log('Block Details:');
        console.log(`   Slot: ${slotToQuery}`);
        console.log(`   Blockhash: ${block.blockhash}`);
        console.log(`   Previous Blockhash: ${block.previousBlockhash}`);
        console.log(`   Parent Slot: ${block.parentSlot}`);
        console.log(`   Block Height: ${block.blockHeight !== null ? block.blockHeight : 'N/A'}`);
        console.log(`   Block Time: ${block.blockTime ? new Date(block.blockTime * 1000).toISOString() : 'N/A'}`);
        console.log(`   Transactions Count: ${block.transactions.length}`);
        // console.log('   Transactions:', JSON.stringify(block.transactions, null, 2)); // Full transaction details
        // console.log('   Rewards:', JSON.stringify(block.rewards, null, 2)); // Reward details
      } else {
        console.log(`Block at slot ${slotToQuery} not found or not confirmed.`);
      }
    } catch (error) {
      console.error(`Error fetching block ${slotToQuery}:`, error);
    }
  }

  getBlockDetails();
  ```

  ```typescript Kit theme={"system"}
  import { createSolanaRpc } from "@solana/kit";

  const rpc_url = "https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY";
  const rpc = createSolanaRpc(rpc_url);

  const slot_number = BigInt(377261141);

  let block = await rpc
    .getBlock(
      slot_number,
      {
        commitment: "finalized",
        encoding: "json",
        transactionDetails: "full",
        maxSupportedTransactionVersion: 1,
        rewards: false,
      },
    )
    .send();

  console.log("block:", block);
  ```

  ```rust Rust theme={"system"}
  use anyhow::Result;
  use solana_client::nonblocking::rpc_client::RpcClient;
  use solana_sdk::commitment_config::CommitmentConfig;
  use solana_transaction_status_client_types::{TransactionDetails, UiTransactionEncoding};

  #[tokio::main]
  async fn main() -> Result<()> {
      let client = RpcClient::new_with_commitment(
          String::from("https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY"),
          CommitmentConfig::confirmed(),
      );

      let slot_number = 377261141;

      let config = solana_client::rpc_config::RpcBlockConfig {
          encoding: UiTransactionEncoding::Base58.into(),
          transaction_details: TransactionDetails::Full.into(),
          rewards: None,
          commitment: CommitmentConfig::finalized().into(),
          max_supported_transaction_version: Some(0),
      };
      let block = client.get_block_with_config(slot_number, config).await?;

      println!("Block: {:#?}", block);

      Ok(())
  }
  ```
</CodeGroup>

## Рекомендации разработчикам

* **Слот и высота блока:** Помните, что `getBlock` принимает в качестве входных данных номер `slot`, который не обязательно совпадает с высотой блока. Хотя слоты идут последовательно, лидеры могут пропускать некоторые из них. Поле `blockHeight` в ответе указывает фактическое количество предшествующих блоков.
* **`maxSupportedTransactionVersion` имеет критическое значение:** Чтобы просматривать блоки с версионированными транзакциями, которые теперь являются стандартными и используют таблицы поиска адресов, **необходимо** указать `maxSupportedTransactionVersion: 1` (или более высокую версию, если появится новый стандарт). Если этого не сделать, для большинства современных блоков будут возникать ошибки.
* **Выбор `transactionDetails`:**
  * `full` требуется для наиболее подробного анализа, но возвращает наибольший объем данных.
  * `signatures` полезен, если требуется только перечислить транзакции в блоке.
  * `accounts` может быть компромиссным вариантом, если нужно увидеть задействованные учетные записи без получения всех данных инструкций.
  * `none` используется редко, но может быть полезен, если нужны только метаданные уровня блока, например `blockhash` или `rewards`.
* **Для кодировки рекомендуется `jsonParsed`:** При запросе сведений о транзакциях `jsonParsed` возвращает наиболее удобные для разработчиков данные и правильно разрешает учетные записи из таблиц поиска адресов, чего не делает устаревший вариант `json`.
* **Недоступность блока:** Результат `null` означает, что блок в этом слоте не найден. Это может произойти, если слот был пропущен, блок не подтвержден до уровня, указанного параметром `commitment`, или узел RPC удалил этот исторический блок из реестра, что часто происходит со старыми слотами.
* **Информация о вознаграждениях:** Чтобы увидеть распределение вознаграждений за блок между валидатором и, возможно, стейкерами в зависимости от типа вознаграждения, необходимо указать `rewards: true`. Это увеличивает размер ответа.
* **Понимание структуры блока:** Чтобы подробнее узнать, как блоки вписываются в архитектуру Solana, прочитайте статью [Слоты, блоки и эпохи в Solana](https://www.helius.dev/blog/solana-slots-blocks-and-epochs).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.