#substrate #polkadot-js
#субстрат #polkadot-js
Вопрос:
как я могу запросить storage
через .entries
, когда я знаю список идентификаторов, которые используются для хранения данных?
фрагмент из decl_storage
/// PoE Proofs
Proofs get(fn proofs): map hasher(blake2_128_concat) GenericId=> ProofInfo<Proof, T::AccountId, T::BlockNumber>;
машинописный код, в котором я пытаюсь получить только несколько записей
type IncomingParam = [StorageKey, ProofInfo]
type SnGenericIds = GenericId[]
export async function getAll (
items: SnGenericIds = []
): Promise<IncomingParam[]> {
const api = getApi()
return await api.query.poe.proofs.entries(items)
}
// items is [ '0x6261666b313332313365616465617364' ]
когда я использую polkadot.js приложение в браузере и передаю этот идентификатор, я получаю запись, и только одну, приведенный выше код TS возвращает ВСЕ записи, которые я проверилhttps://polkadot.js.org/api/start/api.query.other.html#map-keys-entries и, если я правильно понимаю, приведенный выше код должен. работа
я знаю о multi
но я хотел бы использовать этот метод, чтобы получить все или некоторые, возможно ли это вообще?
Ответ №1:
.entries(args)
можно использовать и фильтровать только с помощью double_map
где args
— это единственная строка, которая соответствует первому аргументу double_map
Приведенный выше код rust не содержит фильтрации, поэтому RPC и API извлекут все записи.
таким образом, код rust будет следующим:
/// PoE Proofs
pub Proofs get(fn proofs): double_map hasher(blake2_128_concat) GenericId, hasher(twox_64_concat) T::AccountId => ProofInfo<Proof, T::AccountId, T::BlockNumber>;
это позволяет фильтровать, используя следующий подход
api.query.poe.proofs.entries('0x1231233132312')
Дополнительную информацию можно найти здесь