Как выгрузить ключи карты Substrate из одного состояния

Полная карта System.Account может не поместиться в один допустимый ответ провайдера. Постраничная выгрузка ключей ограничивает размер запроса и позволяет продолжить после сбоя.

Получите префикс из метаданных runtime

Подключите polkadot-js к сети с system.account и запросите короткую страницу. Для определения структуры хранилища используйте runtime выбранного снимка. Сохраните исходный порядок ключей: следующий курсор принимает именно ключ хранилища.

const hash = await api.rpc.chain.getFinalizedHead()
const prefix = api.query.system.account.keyPrefix()
const keys = await api.rpc.state.getKeysPaged(prefix, 100, null, hash)
console.log(hash.toHex(), keys.map(key => key.toHex()))

Продолжайте от последнего полученного ключа

Передайте последний ключ первой страницы как startKey следующего getKeysPaged с прежним префиксом и хешем. Адрес аккаунта в пользовательском формате не заменяет кодированный ключ хранилища. Значения также читайте на сохранённом хеше. Завершайте на пустой странице и отмечайте курсор, который перестал двигаться.

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

Источники