Как запросить хранилище субстрата через `.entries` для частичных элементов

#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')
  

Дополнительную информацию можно найти здесь