Как получить внутренние транзакции по контракту

Я хотел бы получить внутренние транзакции, такие как: https://etherscan.io/address/0xd654bdd32fc99471455e86c2e7f7d7b6437e9179#internaltx

Я использую web3 API. Есть ли способ сделать это? Где они появляются в блочной цепочке?

38 голосов | спросил Pablo Yabo 27 PMpWed, 27 Apr 2016 20:50:24 +030050Wednesday 2016, 20:50:24

7 ответов


36

В настоящее время нет способа сделать это с помощью API web3. Внутренние транзакции, несмотря на название (которое не является частью желтой газеты, это соглашение, о котором люди договорились) не являются фактическими транзакциями и не включены непосредственно в блок-цепочку; они представляют собой переносы стоимости, которые были инициированы путем выполнения контракта.

Как таковые, они не хранятся явно нигде: они влияют на выполнение рассматриваемой транзакции в состоянии blockchain. Исследователи Blockchain, такие как etherscan, могут получить их, запустив модифицированный узел с инструментальным EVM, который записывает все переносы значений, которые произошли как часть выполнения транзакции, сохраняя их отдельно.

ответил Nick Johnson 28 AMpThu, 28 Apr 2016 09:53:27 +030053Thursday 2016, 09:53:27
20

В протоколе Ethereum есть только транзакции и вызовы сообщений. Транзакция - это тип вызова сообщения.

Транзакция может выполнять другие вызовы сообщений, но это не транзакции (даже при том, что исследователи блокчин могут неточно их обозначать как «внутренние транзакции»). Эти сообщения (внутренние) сообщения не публикуются в блочной цепочке. Чтобы найти внутренние вызовы , транзакция должна обрабатываться через EVM (например, https://github.com/ethereumjs/ethereumjs-vm ).

Чтобы попытаться проиллюстрировать, транзакция в Javascript выглядит так:

{
  from: ...,
  to: "C1",
  value: ...,
  gas: ...,
  data: ...,
  gasPrice: ...,
  nonce: ...
}

Это то, что вы увидите на блочной цепочке. Внутренние вызовы - это последствия использования части data, подачи ее to контракта C1 и выполнения виртуальной машины Ethereum. data - это то, что говорит C1, что он должен вызывать другой контракт C2: нет отдельного объекта {from:C1, to:C2,...} на блочной цепочке, необходимо.

Данные data закодированы в соответствии с

ответил eth 23 J0000006Europe/Moscow 2016, 21:51:54
11

К счастью, у Geth EVM есть новые инструменты для этого. Можно использовать debug_traceTransaction с API RPC.

В NodeJS:

var web3 = require('web3').web3;
web3.currentProvider.sendAsync({
    method: "debug_traceTransaction",
    params: ['0x3fac854179691e377fc1aa180b71a4033b6bb3bde2a7ef00bc8e78f849ad356e', {}],
    jsonrpc: "2.0",
    id: "2"
}, function (err, result) {
    ...
});

Затем вам нужно выполнить команды «CREATE», «CALL», «CALLCODE» и «DELEGATECALL» и следить за стеком. Вы можете прочитать Nick Johnson подробное объяснение: Инструментальное EVM

Если я в конце концов его реализую, я напишу полную статью с кодом.

ответил Pablo Yabo 21 +03002016-10-21T18:13:46+03:00312016bEurope/MoscowFri, 21 Oct 2016 18:13:46 +0300 2016, 18:13:46
3

В соответствии с анонсом версии 1.1 для Parity вы можете сделать это с ним, если вы переключаетесь на этого клиента. Цитирование:

  

Новые API JSONRPC для отслеживания, отслеживания и проверки всех   сообщениями и переводами баланса, включая те, которые происходят как   «внутренние транзакции»;

Не тестировал его еще.

ответил knocte 30 J0000006Europe/Moscow 2016, 11:40:04
2

С недавними версиями Parity (проверено на 1.8.3) это также возможно. Метод RPC - это trace_replayTransaction. Соответствующий код - это что-то вроде

web3.currentProvider.sendAsync({
    method: "trace_replayTransaction",
    params: [desiredTransactionHash, ['trace']],
    jsonrpc: "2.0",
    id: "1"
}, function (err, out) {
    console.log(out);
}

Документация находится на паритете репозиторий github.

ответил comodoro 25 62017vEurope/Moscow11bEurope/MoscowSat, 25 Nov 2017 20:30:55 +0300 2017, 20:30:55
1

Вы можете использовать callTracer, представленный в geth 1.8 https: //github.com/ethereum/go-ethereum/pull/15516

$ nc -U /work/temp/rinkeby/geth.ipc
{"id": 1, "method": "debug_subscribe", "params": ["traceChain", "0x0", "0xffff", {"tracer": "callTracer"}]}

API будет передавать одно уведомление IPC на непустой блок. Исключением является последний блок, который будет сообщать, даже если оно пустое, поэтому пользователь знает, что поток выполнен.

{"jsonrpc":"2.0","id":1,"result":"0xe1deecc4b399e5fd2b2a8abbbc4624e2"}
{"jsonrpc":"2.0","method":"debug_subscription","params":{"subscription":"0xe1deecc4b399e5fd2b2a8abbbc4624e2","result":{"block":"0x37","hash":"0xdb16f0d4465f2fd79f10ba539b169404a3e026db1be082e7fd6071b4c5f37db7","traces":[{"from":"0x31b98d14007bdee637298086988a0bbd31184523","gas":"0x0","gasUsed":"0x0","input":"0x","output":"0x","time":"1.077µs","to":"0x2ed530faddb7349c1efdbf4410db2de835a004e4","type":"CALL","value":"0xde0b6b3a7640000"}]}}}
{"jsonrpc":"2.0","method":"debug_subscription","params":{"subscription":"0xe1deecc4b399e5fd2b2a8abbbc4624e2","result":{"block":"0xf43","hash":"0xacb74aa08838896ad60319bce6e07c92edb2f5253080eb3883549ed8f57ea679","traces":[{"from":"0x31b98d14007bdee637298086988a0bbd31184523","gas":"0x0","gasUsed":"0x0","input":"0x","output":"0x","time":"1.568µs","to":"0xbedcf417ff2752d996d2ade98b97a6f0bef4beb9","type":"CALL","value":"0xde0b6b3a7640000"}]}}}
{"jsonrpc":"2.0","method":"debug_subscription","params":{"subscription":"0xe1deecc4b399e5fd2b2a8abbbc4624e2","result":{"block":"0xf47","hash":"0xea841221179e37ca9cc23424b64201d8805df327c3296a513e9f1fe6faa5ffb3","traces":[{"from":"0xbedcf417ff2752d996d2ade98b97a6f0bef4beb9","gas":"0x4687a0","gasUsed":"0x12e0d","input":"0x6060604052341561000c57fe5b5b6101828061001c6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063230925601461003b575bfe5b341561004357fe5b61008360048080356000191690602001909190803560ff1690602001909190803560001916906020019091908035600019169060200190919050506100c5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000600185858585604051806000526020016040526000604051602001526040518085600019166000191681526020018460ff1660ff1681526020018360001916600019168152602001826000191660001916815260200194505050505060206040516020810390808403906000866161da5a03f1151561014257fe5b50506020604051035190505b9493505050505600a165627a7a7230582054abc8e7b2d8ea0972823aa9f0df23ecb80ca0b58be9f31b7348d411aaf585be0029","output":"0x60606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063230925601461003b575bfe5b341561004357fe5b61008360048080356000191690602001909190803560ff1690602001909190803560001916906020019091908035600019169060200190919050506100c5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000600185858585604051806000526020016040526000604051602001526040518085600019166000191681526020018460ff1660ff1681526020018360001916600019168152602001826000191660001916815260200194505050505060206040516020810390808403906000866161da5a03f1151561014257fe5b50506020604051035190505b9493505050505600a165627a7a7230582054abc8e7b2d8ea0972823aa9f0df23ecb80ca0b58be9f31b7348d411aaf585be0029","time":"658.529µs","to":"0x5481c0fe170641bd2e0ff7f04161871829c1902d","type":"CREATE","value":"0x0"}]}}}
{"jsonrpc":"2.0","method":"debug_subscription","params":{"subscription":"0xe1deecc4b399e5fd2b2a8abbbc4624e2","result":{"block":"0xfff","hash":"0x254ccbc40eeeb183d8da11cf4908529f45d813ef8eefd0fbf8a024317561ac6b"}}}

Индивидуальная трассировка блока является параллельной в транзакциях (ограничена числом ядер), а также делает цепочку трассировка параллельна в блоках (ограничена числом ядер).

ответил medvedev1088 19 MarpmMon, 19 Mar 2018 12:44:32 +03002018-03-19T12:44:32+03:0012 2018, 12:44:32
1

Для получения информации о внутренних транзакциях вы можете использовать debug_traceTransaction Метод вернет полный след транзакции. По кодам операций и параметрам каждого шага вы можете получить необходимую информацию.

Есть две основные проблемы: 1. Определите принцип работы кодов операций, поскольку, например, не всегда CALL приводит к внутренней транзакции 2. С большим количеством шагов в трассировке ответ может не помещаться в буфер

Вторая проблема может быть решена путем передачи второго параметра методам обработки шагов на стороне geth. Более подробную информацию можно найти здесь - https://github.com/ethereum /ая-Эфириум /вики /Управление-интерфейсы # debug_tracetransaction

Логику обработки кодов операций можно найти здесь https://github.com/Arachnid/etherquery/blob/master/etherquery/trace.go#L102 (для реализации go) или здесь https://github.com/tet32/etherscanner/blob/master/traceStepFunction.js (для реализации nodejs)

ответил ViktorPu 21 MarpmWed, 21 Mar 2018 12:57:09 +03002018-03-21T12:57:09+03:0012 2018, 12:57:09

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132