Как расшифровать внешние блоки с помощью Polkadot js api
Я пишу машинописный код для получения информации о блоке. Я подключен к http://wss//kusama-rpc.polkadot.io. Я слежу за официальной документацией по api polkadot js.
Я вызываю метод api.rpc.chain.getBlock для получения информации о блоке, и он возвращает информацию о блоке как json:
{
"header": {
"parentHash": "0xf292579563eb2f12e7a1571643d5285a072f04694397758cae76b38075daf631",
"number": 1134,
"stateRoot": "0x468de0ef831c96f56d518017b18d76a89f35f30371c45866d12c12ca2116a407",
"extrinsicsRoot": "0x4875f3ab89c2a3c30f5de8be2ac40cfaee02059fd69ea76115550a418db5fcc8",
"digest": {
"logs": [
"0x066175726120d86ae01200000000",
"0x05617572610101be3d6d596445d3cb3b711da09e22f9f24c283306744657ce397d17ff1dbf9859051def7406cd356b2d3d2add155d76618f6b098de0c4ce6b7620106ec00e1188"
]
}
},
"extrinsics": [
"0x280401000bc0ca26af7001"
]
}
Как мне получить внешние детали как -
{
"method": {
"callIndex": "0x0200",
"section":"timestamp",
"method": "set",
"args" : [
"1,582,827,870,000"
]
},
"isSigned": false
}
Я предполагаю, что внешний вид, который я получаю, закодирован, каков метод его декодирования?
3 ответа
я нашел
parseInt('0x33c395')
отлично работает для декодирования номеров блоков
Они закодированы в шестнадцатеричном формате Uint8Array. При использовании node.js вы можете просто избавиться от строки "0x" и выполнить
Buffer.from(<U8A>, 'hex')
Учитывая, что внешнее
0x280401000bc0ca26af7001
Расшифруем. Сначала идет длина внешнего кода, закодированного при кодировании.
0x28
является
0b00101000
т.е. значение
0b001010
или
10
10-база
0x04
означает, что он не подписан как внешняя версия -й версии (
EXTRINSIC_VERSION
), иначе было бы
0b1000_0000 | EXTRINSIC_VERSION
так как он не подписан следующий идет
call_data
, иначе была бы подпись
0x01
конкретное значение перечисления времени выполнения (pallet_index)
0x00
конкретное значение перечисления времени выполнения (call_index)
0x0bc0ca26af7001
согласно
compact
кодирование первого байта
0x0b
(
0b0000_1011
) означает, что это
big-integer
кодирование в соответствии с
0b11
два нижних бита, остальные
0b000010
количество следующих байтов за исключением сдвига
4
, т.е. количество байтов
4 + 0b10 = 6
в кодировке LE. Таким образом, нужно поменять местами байты в соответствии с порядком байтов.
0xc0ca26af7001
->
0x0170af26cac0
т.е.
1583486520000
10-база