Как сопоставить события Substrate с конкретным extrinsic

В блоке хранится общий упорядоченный поток событий для множества extrinsic. Обозреватель должен связать события с фазой исполнения до показа результата отдельной транзакции.

Прочитайте блок и события одного состояния

Для подключённого ApiPromise из polkadot-js получите один финализированный хеш. В примере берётся третий extrinsic по индексу 2. Выберите существующую позицию либо найдите её по хешу подписанного extrinsic.

const head = await api.rpc.chain.getFinalizedHead()
const block = await api.rpc.chain.getBlock(head)
const records = await (await api.at(head)).query.system.events()
const index = 2
const related = records.filter(({phase}) =>
  phase.isApplyExtrinsic && phase.asApplyExtrinsic.eq(index))
console.log(block.block.extrinsics[index]?.hash.toHex(),
  related.map(({event}) => event.section + "." + event.method))

Сохраните исходную позицию события

ApplyExtrinsic(2) выделяет записи данного extrinsic, включая события вложенных вызовов. События инициализации и завершения блока относятся к другим фазам. Для постоянного идентификатора используйте хеш блока и исходный индекс в полном массиве до фильтрации.

Несколько переводов внутри одного extrinsic остаются отдельными событиями даже при совпадении сумм. Сохраняйте каждую запись отдельно.

Источники