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

# Исторические данные

> Доступ к полной истории блокчейна Solana с genesis

## Обзор

OrbitFlare запускает полные архивные ноды, которые сохраняют каждый блок, транзакцию и состояние аккаунта с момента запуска Solana. Стандартные RPC-провайдеры обычно усекают старые данные для экономии места, сохраняя только последние эпохи. С OrbitFlare вы можете запросить любой слот из истории Solana.

## Сценарии использования

Исторические данные блокчейна обеспечивают несколько важных рабочих процессов:

* **Восстановление событий**: Подтяните пропущенные транзакции после простоя индексатора или сбоев вебхуков
* **Комплаенс**: Получение записей транзакций для аудитов и требований регуляторов
* **Исследования**: Анализ on-chain трендов, распределения токенов и метрик протоколов во времени
* **Приложения-обозреватели**: Создание обозревателей блоков и дашбордов с полной историей

## Актуальные методы RPC

Эти методы поддерживают исторические запросы на архивных нодах OrbitFlare:

### Методы блоков

| Метод                                                         | Описание                                                        |
| ------------------------------------------------------------- | --------------------------------------------------------------- |
| [getBlock](/rpc/methods/getBlock)                             | Получить полные данные блока для любого слота                   |
| [getBlocks](/rpc/methods/getBlocks)                           | Получить список подтверждённых блоков между двумя слотами       |
| [getBlocksWithLimit](/rpc/methods/getBlocksWithLimit)         | Получить подтверждённые блоки, начиная со слота, с ограничением |
| [getBlockTime](/rpc/methods/getBlockTime)                     | Получить ориентировочную Unix-метку времени для блока           |
| [getBlockHeight](/rpc/methods/getBlockHeight)                 | Получить текущую высоту блока                                   |
| [getFirstAvailableBlock](/rpc/methods/getFirstAvailableBlock) | Получить минимальный слот с доступными данными блока            |

### Методы транзакций

| Метод                                                           | Описание                                        |
| --------------------------------------------------------------- | ----------------------------------------------- |
| [getTransaction](/rpc/methods/getTransaction)                   | Получить подтверждённую транзакцию по сигнатуре |
| [getSignaturesForAddress](/rpc/methods/getSignaturesForAddress) | Получить сигнатуры транзакций для адреса        |
| [getSignatureStatuses](/rpc/methods/getSignatureStatuses)       | Получить статусы сигнатур транзакций            |

### Методы аккаунтов

| Метод                                                   | Описание                                            |
| ------------------------------------------------------- | --------------------------------------------------- |
| [getAccountInfo](/rpc/methods/getAccountInfo)           | Получить данные аккаунта (только текущее состояние) |
| [getMultipleAccounts](/rpc/methods/getMultipleAccounts) | Получить данные нескольких аккаунтов в одном вызове |
| [getProgramAccounts](/rpc/methods/getProgramAccounts)   | Получить все аккаунты, принадлежащие программе      |

### Методы слотов

| Метод                                               | Описание                                    |
| --------------------------------------------------- | ------------------------------------------- |
| [getSlot](/rpc/methods/getSlot)                     | Получить текущий слот                       |
| [minimumLedgerSlot](/rpc/methods/minimumLedgerSlot) | Получить минимальный слот с данными на ноде |

## Примеры

### Получить блок из истории

Получить данные блока для слота 100 000 000 с помощью [getBlock](/rpc/methods/getBlock):

```bash theme={null}
curl https://fra.rpc.orbitflare.com?api_key=YOUR-API-KEY -X POST -H "Content-Type: application/json" -d '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "getBlock",
  "params": [
    100000000,
    {
      "encoding": "json",
      "transactionDetails": "full",
      "rewards": false,
      "maxSupportedTransactionVersion": 0
    }
  ]
}'
```

### Получить время блока

Узнать, когда был произведён конкретный блок, с помощью [getBlockTime](/rpc/methods/getBlockTime):

```bash theme={null}
curl https://fra.rpc.orbitflare.com?api_key=YOUR-API-KEY -X POST -H "Content-Type: application/json" -d '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "getBlockTime",
  "params": [100000000]
}'
```

### Получить список блоков в диапазоне

Получить все подтверждённые блоки между двумя слотами с помощью [getBlocks](/rpc/methods/getBlocks):

```bash theme={null}
curl https://fra.rpc.orbitflare.com?api_key=YOUR-API-KEY -X POST -H "Content-Type: application/json" -d '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "getBlocks",
  "params": [100000000, 100000100]
}'
```

### Получить транзакцию

Получить детали транзакции по сигнатуре с помощью [getTransaction](/rpc/methods/getTransaction):

```bash theme={null}
curl https://fra.rpc.orbitflare.com?api_key=YOUR-API-KEY -X POST -H "Content-Type: application/json" -d '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "getTransaction",
  "params": [
    "5wHu1qwD7q5menP8rgbzknAHruqg7rq1BwLNjmKnMwVH2VNhVvPLT6jGfKNLwKUTG4Xn2vRvDz5Q6Z8zCLN5gLp1",
    {
      "encoding": "json",
      "maxSupportedTransactionVersion": 0
    }
  ]
}'
```

### Получить историю транзакций для адреса

Получить сигнатуры для адреса с помощью [getSignaturesForAddress](/rpc/methods/getSignaturesForAddress):

```bash theme={null}
curl https://fra.rpc.orbitflare.com?api_key=YOUR-API-KEY -X POST -H "Content-Type: application/json" -d '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "getSignaturesForAddress",
  "params": [
    "Vote111111111111111111111111111111111111111",
    {"limit": 100}
  ]
}'
```

## Примеры на TypeScript

### Получить исторические данные блока

```typescript theme={null}
import { Connection } from '@solana/web3.js';

const connection = new Connection('https://fra.rpc.orbitflare.com?api_key=YOUR-API-KEY');

async function getHistoricalBlock(slot: number) {
  const block = await connection.getBlock(slot, {
    maxSupportedTransactionVersion: 0,
  });

  if (block) {
    console.log(`Block ${slot}:`);
    console.log(`  Transactions: ${block.transactions.length}`);
    console.log(`  Block time: ${block.blockTime}`);
    console.log(`  Parent slot: ${block.parentSlot}`);
  }

  return block;
}

// Fetch a block from early 2023
const block = await getHistoricalBlock(175000000);
```

### Построить полную историю транзакций

Комбинируйте [getSignaturesForAddress](/rpc/methods/getSignaturesForAddress) с [getTransaction](/rpc/methods/getTransaction) для построения полной истории:

```typescript theme={null}
import { Connection, PublicKey } from '@solana/web3.js';

const connection = new Connection('https://fra.rpc.orbitflare.com?api_key=YOUR-API-KEY');

async function getFullTransactionHistory(address: string) {
  const pubkey = new PublicKey(address);
  const allTransactions = [];
  let before: string | undefined;

  // Paginate through all signatures
  while (true) {
    const signatures = await connection.getSignaturesForAddress(pubkey, {
      limit: 1000,
      before,
    });

    if (signatures.length === 0) break;

    // Fetch full transaction data in batches
    for (let i = 0; i < signatures.length; i += 10) {
      const batch = signatures.slice(i, i + 10);
      const txs = await Promise.all(
        batch.map(sig =>
          connection.getTransaction(sig.signature, {
            maxSupportedTransactionVersion: 0,
          })
        )
      );
      allTransactions.push(...txs.filter(tx => tx !== null));
    }

    before = signatures[signatures.length - 1].signature;
  }

  return allTransactions;
}
```

### Запрос блоков в временном диапазоне

Найти блоки в определённый временной период:

```typescript theme={null}
async function getBlocksInTimeRange(startTime: number, endTime: number) {
  // Get a starting slot estimate
  const currentSlot = await connection.getSlot();
  const currentTime = Math.floor(Date.now() / 1000);

  // Solana produces ~2-3 blocks per second
  const slotsPerSecond = 2.5;
  const estimatedStartSlot = currentSlot - Math.floor((currentTime - startTime) * slotsPerSecond);

  const blocks = [];
  let slot = estimatedStartSlot;

  while (true) {
    const blockTime = await connection.getBlockTime(slot);

    if (blockTime && blockTime >= startTime && blockTime <= endTime) {
      const block = await connection.getBlock(slot, {
        maxSupportedTransactionVersion: 0,
      });
      if (block) blocks.push({ slot, block });
    }

    if (blockTime && blockTime > endTime) break;
    slot++;
  }

  return blocks;
}
```

## Советы по производительности

1. **Группируйте запросы**: Используйте пакетные запросы JSON-RPC для получения нескольких блоков или транзакций в одном вызове

2. **Пагинируйте большие запросы**: Метод [getSignaturesForAddress](/rpc/methods/getSignaturesForAddress) возвращает до 1000 сигнатур за вызов — используйте параметр `before` для пагинации

3. **Параллелизуйте осторожно**: Получайте транзакции параллельными партиями по 10–20 для баланса скорости и лимитов

4. **Кешируйте неизменяемые данные**: Исторические блоки и транзакции никогда не меняются после подтверждения — кешируйте их локально

5. **Используйте `maxSupportedTransactionVersion`**: Всегда включайте этот параметр для работы с версионированными транзакциями

## Ограничения

**История состояния аккаунтов**: Ноды Solana хранят текущее состояние аккаунта, а не исторические снапшоты. Вы можете получить транзакции, изменявшие аккаунт, но не баланс или данные аккаунта в конкретный прошлый слот.

**Лимиты запросов**: Исторические запросы могут потреблять больше ресурсов. Проверьте лимиты вашего плана и реализуйте соответствующее ограничение скорости.

## Более быстрая история транзакций

Для эффективных запросов истории адресов используйте [getTransactionsForAddress](/fetching-data/getTransactionsForAddress), который объединяет поиск сигнатур и получение транзакций в один вызов с возможностями фильтрации и сортировки.

## Управляемое восстановление данных

Для команд, которым необходима доставка исторических данных в больших объёмах без написания собственных ETL-конвейеров, OrbitFlare предлагает услугу **управляемого восстановления данных** (Managed Backfills).

<Note>
  Управляемое восстановление данных — корпоративная услуга. [Свяжитесь с командой в Discord](https://discord.gg/orbitflare) или напишите на [sales@orbitflare.com](mailto:sales@orbitflare.com), чтобы обсудить ваши требования.
</Note>

### Что это даёт

Инженеры OrbitFlare извлекают и доставляют структурированные исторические данные Solana напрямую в ваше хранилище:

| Формат вывода            | Поддерживаемые хранилища     |
| ------------------------ | ---------------------------- |
| JSON (newline-delimited) | AWS S3, Google Cloud Storage |
| Parquet                  | AWS S3, Google Cloud Storage |
| SQL                      | PostgreSQL, ClickHouse       |

### Что может быть доставлено

* Все транзакции для конкретной программы, кошелька или минта токена
* Полные данные блоков для любого диапазона слотов
* История переводов токенов (SPL Token / Token-2022)
* Пользовательские запросы и форматы данных под ваши требования

### SLA

| Пункт                | Детали                                          |
| -------------------- | ----------------------------------------------- |
| Срок доставки        | 3–5 рабочих дней для стандартных заданий        |
| Охват данных         | С genesis (март 2020) по текущий момент         |
| Формат               | JSON, Parquet или SQL — на ваш выбор            |
| Выделенная поддержка | Назначенный инженер на время выполнения задания |

### Когда использовать

Управляемое восстановление данных лучше всего подходит для:

* Начального наполнения нового индексатора или аналитической базы данных
* Разовых запросов данных для комплаенса или аудита
* Исторических наборов данных для обучения ML/AI-моделей
* Восстановления данных после длительного простоя

Для непрерывной потоковой передачи новых данных используйте эндпоинты [gRPC-стриминга](/data-streaming/yellowstone).
