Перейти к основному содержанию

Обзор

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

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

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

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

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

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

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

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

МетодОписание
getTransactionПолучить подтверждённую транзакцию по сигнатуре
getSignaturesForAddressПолучить сигнатуры транзакций для адреса
getSignatureStatusesПолучить статусы сигнатур транзакций

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

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

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

МетодОписание
getSlotПолучить текущий слот
minimumLedgerSlotПолучить минимальный слот с данными на ноде

Примеры

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

Получить данные блока для слота 100 000 000 с помощью getBlock:
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:
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:
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:
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:
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

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

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 с getTransaction для построения полной истории:
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;
}

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

Найти блоки в определённый временной период:
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 возвращает до 1000 сигнатур за вызов — используйте параметр before для пагинации
  3. Параллелизуйте осторожно: Получайте транзакции параллельными партиями по 10–20 для баланса скорости и лимитов
  4. Кешируйте неизменяемые данные: Исторические блоки и транзакции никогда не меняются после подтверждения — кешируйте их локально
  5. Используйте maxSupportedTransactionVersion: Всегда включайте этот параметр для работы с версионированными транзакциями

Ограничения

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

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

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

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

Для команд, которым необходима доставка исторических данных в больших объёмах без написания собственных ETL-конвейеров, OrbitFlare предлагает услугу управляемого восстановления данных (Managed Backfills).
Управляемое восстановление данных — корпоративная услуга. Свяжитесь с командой в Discord или напишите на sales@orbitflare.com, чтобы обсудить ваши требования.

Что это даёт

Инженеры OrbitFlare извлекают и доставляют структурированные исторические данные Solana напрямую в ваше хранилище:
Формат выводаПоддерживаемые хранилища
JSON (newline-delimited)AWS S3, Google Cloud Storage
ParquetAWS S3, Google Cloud Storage
SQLPostgreSQL, ClickHouse

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

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

SLA

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

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

Управляемое восстановление данных лучше всего подходит для:
  • Начального наполнения нового индексатора или аналитической базы данных
  • Разовых запросов данных для комплаенса или аудита
  • Исторических наборов данных для обучения ML/AI-моделей
  • Восстановления данных после длительного простоя
Для непрерывной потоковой передачи новых данных используйте эндпоинты gRPC-стриминга.