Как расшифровать внешние блоки с помощью 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-база

Другие вопросы по тегам