Перейти к основному содержанию
Исторические состояния аккаунтов доступны в бета-версии. Параметры, цены, форматы ответов и охват данных могут измениться.

Что такое историческое состояние аккаунта?

Стандартные методы RPC Solana, такие как getAccountInfo и getTokenAccountsByOwner, возвращают только текущее состояние аккаунта. Валидаторы хранят только последнюю версию каждого аккаунта, поэтому каждая запись заменяет предыдущую. История транзакций не восполняет этот пробел: getTransaction и getBlock возвращают инструкции, журналы и изменения баланса, но не данные аккаунта, записанные программой. Методы Helius для исторических состояний аккаунтов возвращают аккаунты в том виде, в котором они находились в прошлом слоте или сразу после определенной транзакции в этом слоте. Поскольку состояние можно прочитать между двумя транзакциями одного слота, вы можете точно увидеть, что изменила конкретная транзакция, даже если данные аккаунта записывались много раз в одном слоте. Используйте эти методы, чтобы:
  • Проверять балансы токенов кошелька на определенный момент времени для аудита, бухгалтерского учета или налоговой отчетности
  • Отлаживать транзакцию, считывая затронутые ею аккаунты непосредственно до и после ее выполнения
  • Считывать аккаунты протокола, например пулы, хранилища или оракулы, в прошлом слоте без самостоятельного воспроизведения реестра
Эти методы RPC доступны только в Helius. Они не входят в стандартный RPC Solana.

Какой метод использовать?

Оба метода принимают одинаковые три параметра: адрес, объект запроса, выбирающий позицию в истории, и объект конфигурации.

Доступность и цены

  • Тарифы: Business и более высокие тарифы.
  • Стоимость: 0 кредитов за вызов в период бета-тестирования (цены могут измениться).
  • Ограничения частоты запросов: getHistoricalAccountInfo допускает 100 запросов в секунду с максимальным всплеском до 100. getHistoricalTokenAccountsByOwner допускает 10 запросов в секунду с максимальным всплеском до 10. Эти ограничения не зависят от ограничения частоты RPC-запросов вашего тарифа. При их превышении запросы возвращают HTTP 429. См. ограничения частоты запросов.
  • Сеть: только Mainnet. Вызывайте методы через стандартную конечную точку Mainnet https://mainnet.helius-rpc.com или конечную точку Gatekeeper https://beta.helius-rpc.com. Devnet возвращает ошибку -32601.

Охват данных

История доступна начиная со слота 444,959,999 (7 сентября 2026 года). Это последний слот эпохи 1029, поэтому в нем хранится состояние на начало эпохи 1030. Запросы более ранних слотов возвращают ошибку -32018 (“История аккаунта недоступна”).

Выбор позиции в истории

Второй параметр — объект запроса с двумя необязательными полями: slot и transactionIndex: Для transactionIndex требуется slot. Записи вне транзакций, например вознаграждения за эпоху, применяются в конце слота. Запрос с transactionIndex никогда не включает их, даже для последней транзакции в слоте. Чтобы включить их, запросите slot без transactionIndex.

Чтение состояния до и после транзакции

Чтобы проверить, что изменила транзакция, прочитайте аккаунт дважды:
  • После транзакции: укажите в запросе ее собственные slot и transactionIndex.
  • До транзакции: укажите в запросе тот же slot и значение transactionIndex, уменьшенное на 1. Если транзакция была первой в слоте (индекс 0), запросите предыдущий слот без transactionIndex.
getTransactionsForAddress возвращает slot и transactionIndex для каждой транзакции, поэтому вы можете найти в нем позицию транзакции и напрямую передать ее этим методам.

Описание lastUpdatedAt

Каждый возвращенный аккаунт содержит lastUpdatedAt — позицию записи, создавшей полученное вами состояние:
  • slot и transactionIndex указывают на последнюю запись в запрошенной позиции или перед ней. В приведенном выше примере запрос для слота 445,000,000 вернул состояние, которое в последний раз было записано транзакцией с индексом 700 в слоте 444,999,837.
  • transactionIndex: null означает, что запись была выполнена вне транзакции, например при начислении вознаграждений за эпоху.
  • slot: 444959999 с transactionIndex: null означает, что аккаунт не менялся с начала охвата истории. Это не означает, что аккаунт был записан в этом слоте.

Что означает значение null

value имеет значение null, если аккаунт не существовал в запрошенной позиции. Он либо еще не был создан, либо уже был закрыт.
  • Ответ с null не содержит lastUpdatedAt, поэтому по нему нельзя определить, когда аккаунт был создан или закрыт. Чтобы найти эти транзакции, используйте getTransactionsForAddress.
  • Адрес, который никогда не существовал, также возвращает null, а не ошибку.
  • Слот до начала охвата истории возвращает ошибку -32018 для любого адреса независимо от того, существовал аккаунт или нет.

Обход истории аккаунта в обратном порядке

Используйте lastUpdatedAt как курсор, чтобы получить список всех состояний аккаунта, начиная с самого нового. После каждого чтения запрашивайте позицию непосредственно перед полученной записью: Остановитесь, когда value получит значение null. Это означает, что запись, перед которой вы только что перешли, создала аккаунт. Также остановитесь, когда lastUpdatedAt.slot достигнет 444,959,999 — начала охвата истории.
  • Аккаунты, закрытые в настоящее время, возвращают null в последнем слоте. Передайте позицию start, относящуюся к моменту, когда аккаунт еще существовал.
  • Записи вне транзакций переводят курсор к предыдущему слоту. Если тот же аккаунт ранее в этом слоте также был записан транзакцией, обход пропустит это состояние.
  • Чтобы выполнить обход вперед во времени, получите список транзакций аккаунта от самых старых к самым новым с помощью getTransactionsForAddress и sortOrder: "asc". Затем считайте состояние в slot и transactionIndex каждой транзакции.

Контекст ответа

context.slot в каждом ответе — это последний слот, проиндексированный Helius на момент обработки запроса. Это не запрошенный вами слот. Чтобы анализировать полученные данные, используйте slot из запроса или lastUpdatedAt.

Согласованная пагинация

getHistoricalTokenAccountsByOwner возвращает результаты постранично. Каждый ответ содержит value.accounts и value.paginationKey.
  • Передайте paginationKey обратно в объекте конфигурации, чтобы получить следующую страницу.
  • Останавливайтесь только тогда, когда paginationKey имеет значение null. Страница может быть неполной или пустой, но после нее могут оставаться дополнительные результаты.
  • Зафиксируйте slot для всех страниц. Если не указать slot, каждая страница будет считывать последний проиндексированный слот, поэтому страницы могут относиться к разным моментам времени.
  • Задайте limit в диапазоне от 1 до 5 000. Значение по умолчанию — 5 000.

Кодировки и разобранные данные

  • Поддерживаемые кодировки: base64 (по умолчанию), base64+zstd и jsonParsed. base58 и binary не поддерживаются.
  • Аккаунты токенов jsonParsed используют количество десятичных разрядов минта в запрошенной позиции, поэтому суммы остаются корректными, даже если с тех пор минт изменился. Если минт невозможно прочитать в этой позиции, аккаунт возвращается в формате base64.
  • dataSlice работает так же, как в getAccountInfo.

Уровень подтверждения

commitment принимает finalized (по умолчанию) и confirmed. processed не поддерживается. Если slot новее, чем допускает запрошенный уровень подтверждения, возвращается ошибка -32004.

Ошибки

Часто задаваемые вопросы

Как получить состояние аккаунта Solana в определенном слоте?

Вызовите getHistoricalAccountInfo, передав адрес и { "slot": S }. Метод вернет аккаунт в том виде, в котором он находился в конце слота S, в том же формате, что и getAccountInfo.

Можно ли прочитать аккаунт между двумя транзакциями в одном слоте?

Да. Добавьте transactionIndex в запрос, чтобы получить состояние аккаунта сразу после выполнения этой транзакции. См. Чтение состояния до и после транзакции.

Насколько далеко в прошлое можно выполнять запросы?

История начинается со слота 444,959,999 от 7 сентября 2026 года. Для более ранних слотов возвращается ошибка -32018.

Какие тарифы включают методы исторических состояний аккаунтов?

Тариф Business и более высокие. В период бета-тестирования вызовы стоят 0 кредитов. Цены могут измениться. Методы доступны только в Mainnet.

Каковы ограничения частоты запросов?

getHistoricalAccountInfo допускает 100 запросов в секунду, а getHistoricalTokenAccountsByOwner — 10 запросов в секунду. Оба ограничения не зависят от ограничения частоты RPC-запросов вашего тарифа. См. Доступность и цены.

Как получить все прошлые состояния аккаунта?

Переходите назад от одной записи к предыдущей с помощью lastUpdatedAt. См. Обход истории аккаунта в обратном порядке.

Нужен ли новый SDK?

Нет. Это методы JSON-RPC, поэтому подойдет любой HTTP-клиент. Стандартные клиентские библиотеки Solana не включают эти методы, поэтому отправляйте запрос напрямую, как в примерах выше.

Дальнейшие действия

getHistoricalAccountInfo

Получите один аккаунт в прошлом слоте или транзакции

getHistoricalTokenAccountsByOwner

Получите список аккаунтов токенов кошелька в прошлом слоте

getTransactionsForAddress

Найдите слот и transactionIndex транзакций, которые хотите проверить

Historical data overview

История транзакций, переводы и другие архивные методы