Исторические состояния аккаунтов доступны в бета-версии. Параметры, цены, форматы ответов и охват данных могут измениться.
Что такое историческое состояние аккаунта?
Стандартные методы RPC Solana, такие какgetAccountInfo и getTokenAccountsByOwner, возвращают только текущее состояние аккаунта. Валидаторы хранят только последнюю версию каждого аккаунта, поэтому каждая запись заменяет предыдущую. История транзакций не восполняет этот пробел: getTransaction и getBlock возвращают инструкции, журналы и изменения баланса, но не данные аккаунта, записанные программой.
Методы Helius для исторических состояний аккаунтов возвращают аккаунты в том виде, в котором они находились в прошлом слоте или сразу после определенной транзакции в этом слоте. Поскольку состояние можно прочитать между двумя транзакциями одного слота, вы можете точно увидеть, что изменила конкретная транзакция, даже если данные аккаунта записывались много раз в одном слоте. Используйте эти методы, чтобы:
- Проверять балансы токенов кошелька на определенный момент времени для аудита, бухгалтерского учета или налоговой отчетности
- Отлаживать транзакцию, считывая затронутые ею аккаунты непосредственно до и после ее выполнения
- Считывать аккаунты протокола, например пулы, хранилища или оракулы, в прошлом слоте без самостоятельного воспроизведения реестра
Какой метод использовать?
Оба метода принимают одинаковые три параметра: адрес, объект запроса, выбирающий позицию в истории, и объект конфигурации.
Доступность и цены
- Тарифы: Business и более высокие тарифы.
- Стоимость: 0 кредитов за вызов в период бета-тестирования (цены могут измениться).
- Ограничения частоты запросов:
getHistoricalAccountInfoдопускает 100 запросов в секунду с максимальным всплеском до 100.getHistoricalTokenAccountsByOwnerдопускает 10 запросов в секунду с максимальным всплеском до 10. Эти ограничения не зависят от ограничения частоты RPC-запросов вашего тарифа. При их превышении запросы возвращают HTTP429. См. ограничения частоты запросов. - Сеть: только Mainnet. Вызывайте методы через стандартную конечную точку Mainnet
https://mainnet.helius-rpc.comили конечную точку Gatekeeperhttps://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
История транзакций, переводы и другие архивные методы