Как отличить значение аккаунта Substrate по умолчанию от записи в хранилище

Запрос с учётом метаданных может вернуть структуру по умолчанию для отсутствующего элемента ValueQuery. При аудите миграции важно установить, существует ли сам ключ аккаунта.

Получите точный ключ хранилища

Для runtime с System.Account присвойте address проверяемый адрес и запустите код polkadot-js. Отправьте напечатанный JSON в HTTP RPC цепочки. Пара из ключа и хеша блока делает чтение воспроизводимым.

const hash = await api.rpc.chain.getFinalizedHead()
const at = await api.at(hash)
const key = at.query.system.account.key(address)
const body = {
  jsonrpc: "2.0", id: 1, method: "state_getStorage",
  params: [key.toString(), hash.toHex()]
}
console.log(JSON.stringify(body))

Отразите отсутствие записи в отчёте

Значение null при успешном сыром запросе означает отсутствие ключа в этом состоянии. Строка байтов в hex говорит о наличии данных, которые нужно декодировать согласно типу аккаунта. Объекта с нулевыми балансами из высокоуровневого запроса недостаточно, чтобы различить эти случаи.

Ошибку RPC об удалённом историческом состоянии отмечайте отдельно. Отсутствие состояния целого блока и отсутствие одного ключа в доступном состоянии требуют разных действий.

Источники