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

как я могу запросить 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, но я хотел бы использовать этот метод, чтобы получить все или некоторые, возможно ли это вообще?


person woss    schedule 13.09.2020    source источник


Ответы (1)


.entries(args) можно использовать и фильтровать только с double_map, где args - это единственная строка, которая соответствует первому аргументу double_map

В приведенном выше коде ржавчины нет фильтрации, поэтому RPC и API извлекут все записи.

поэтому код ржавчины будет следующим:

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

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

person woss    schedule 14.09.2020