Как запросить внутренние транзакции для транзакции RSK?

Если у меня есть хэш транзакции RSK, как я могу получить его внутренние транзакции - то есть, когда смарт-контракты вызывают функции других контрактов или осуществляют переводы через RBTC? Я могу получить основную транзакцию с помощью web3.js, однако, получив ее, я не могу проанализировать ее, чтобы извлечь происходящие внутренние транзакции. Еще я пытался использовать web3.js для запроса блока, в котором произошла транзакция, но не смог его проанализировать и получить внутренние транзакции.

1 ответ

Чтобы повторить свой первоначальный комментарий:

Виртуальная машина RSK (как и EVM) не определяет «внутреннюю транзакцию», и, следовательно, нет RPC для их запроса. Вам нужно будет «отладить» выполнение транзакции, чтобы восстановить эти внутренние компоненты, что довольно сложно сделать. Обозреватели блоков обычно делают это за вас.

К счастью, RSK Block Explorer предоставляет API и, следовательно, его можно запрашивать программно. Таким образом, хотя вы не сможете использовать для этого web3.js, как вы просили в своем вопросе, вы, тем не менее, сможете получать внутренние транзакции.

Давайте использовать пример со следующей транзакцией 0x01fbd670ea2455d38e83316129765376a693852eca296b3469f18d2a8dde35d8, который имеет много внутренних транзакций.

      curl \
  -X GET \
  -H  "accept: application/json" \
  "https://backend.explorer.rsk.co/api?module=internalTransactions&action=getInternalTransactionsByTxHash&hash=0x01fbd670ea2455d38e83316129765376a693852eca296b3469f18d2a8dde35d8"

Приведенная выше команда извлекает внутренние транзакции этой конкретной транзакции. Если вы хотите сделать это для другой транзакции, просто измените значение hash параметр запроса в URL-адресе запроса.

Это дает вам довольно большой ответ JSON, который я не буду здесь полностью копировать. Затем вы можете проанализировать это, используя свой JS-код (поскольку вы уже используете web3.js).

В командной строке вы можете более подробно изучить данные, используя фильтры ответа, доступные в утилите командной строки:

      curl \
  -X GET \
  -H  "accept: application/json" \
  "https://backend.explorer.rsk.co/api?module=internalTransactions&action=getInternalTransactionsByTxHash&hash=0x01fbd670ea2455d38e83316129765376a693852eca296b3469f18d2a8dde35d8" \
  | jq -c '.data[].action.callType'

Вышеупомянутые каналы выводят curl команда, к которой затем применяет фильтр, который:

  • смотрит на data свойство и возвращает все элементы в массиве
  • внутри каждого элемента детализируется action объект и возвращает его callType стоимость

Это приводит к следующему выводу:

      "delegatecall"
"staticcall"
"delegatecall"
"staticcall"
"delegatecall"
"staticcall"
"delegatecall"
"staticcall"
"delegatecall"
"staticcall"
"delegatecall"
"staticcall"
"delegatecall"
"staticcall"
"delegatecall"
"staticcall"
"delegatecall"
"call"

Таким образом, эта транзакция содержит 18 внутренних транзакций со смесью delegatecall, staticcall, и ... действительно, довольно сложная сделка!

Теперь давайте очень jq команда для использования другого фильтра, чтобы мы получали полную информацию только о последней внутренней транзакции, которая оказывается единственной call внутренняя транзакция:

      curl \
  -X GET \
  -H  "accept: application/json" \
  "https://backend.explorer.rsk.co/api?module=internalTransactions&action=getInternalTransactionsByTxHash&hash=0x01fbd670ea2455d38e83316129765376a693852eca296b3469f18d2a8dde35d8" \
  | jq -c '.data[17].action'

Обратите внимание, что единственное отличие от предыдущей команды состоит в том, что теперь фильтр .data[17].action. Это приводит к следующему выводу:

      {
  "callType": "call",
  "from": "0x3f7ec3a190661db67c4907c839d8f1b0c18f2fc4",
  "to": "0xa288319ecb63301e21963e21ef3ca8fb720d2672",
  "gas": "0x20529",
  "input": "0xcbf83a040000000000000000000000000000000000000000000000000000000000000003425443555344000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086f36650548d5c400000000000000000000000000003f7ec3a190661db67c4907c839d8f1b0c18f2fc4000000000000000000000000000000000000000000000000000000000036430c000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000001b0000000000000000000000000000000000000000000000000000000000000005d6328b4db96469d968348a852e6978d18b7dc9bda776727991b83f171abe4a4040ebab67dee8e9711683af91e05c3970bcb6a29502f9b35b14b7a9225d43f6e3e0cf4ae577be626ae350d8e103df88f55205167eaad7267fdbf247e4b35ec674457ac87e13451d2fa9985c854b2f84982e3b611c3b48f5045f2cdc3c6acff44d1735d2771581dc2cc7477fc846767ad088182fc317424d468477cf3a54724543000000000000000000000000000000000000000000000000000000000000000516a3d4cf7e73d17e2230c87f6ef48f38d82885c64d47fef646987f8d6fbb86405515760c786315cac84d7df048e2ba054868f2b9e2afeec0b63ebf2dcac59c8848f254382abf73cf6ce2d5134b5bc065c0706fb7a2f7886a15e79a8953ed11006c5a7d14b4fbf1bb6ff8d687a82a548dcdbd823ebec4b10e331bee332df1a7ae0e45fdac4f6648e093b90a6b56f33e31f36d4079526f871f51cafa710cdde4c3",
  "value": "0x0"
}
Другие вопросы по тегам