флаг/параметр консоли geth для вывода всех кодов операций, выполненных при вызове контракта или вызове функции

Что я хотел бы сделать, так это проанализировать все коды операций, которые выполняются, когда я вызываю контракт или вызываю функцию из контракта.

Насколько я понимаю, это вычисление будет происходить на моей собственной машине, в EVM, и только результат будет отправлен в блокчейн.

Моя идея состоит в том, что для вычисления этого результата вычисления должны выполняться на моем локальном компьютере в какой-то момент в следующем процессе:

var contractAbi = eth.contract([{"constant":true,"inputs":[],"name":"getPeople","outputs":[{"name":"","type":"bytes32[]"},{"name":"","type":"bytes32[]"},{"name":"","type":"uint256[]"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_firstName","type":"bytes32"},{"name":"_lastName","type":"bytes32"},{"name":"_age","type":"uint256"}],"name":"addPerson","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"people","outputs":[{"name":"firstName","type":"bytes32"},{"name":"lastName","type":"bytes32"},{"name":"age","type":"uint256"}],"payable":false,"type":"function"}]);

undefined

var myContract = contractAbi.at("0xC127E3ca071892B1b471b4FC568312Fcbb737879");

undefined

var getData = myContract.addPerson.getData("S. Matthew", "English", 28);

undefined

personal.unlockAccount(eth.coinbase, 'hunter2');

web3.eth.sendTransaction({to:"0xC127E3ca071892B1b471b4FC568312Fcbb737879", from:"0xd7a9a61a480d458a1181e0563b07f944df4489a6", data: getData, gas: (270000)});

"0x0cec118d22fbd572bf25c7e4143919e608989bec7da08512f2a6f3171df3b3b8"

myContract.address

"0xC127E3ca071892B1b471b4FC568312Fcbb737879"

myContract.getPeople()

[["0x532e204d61747468657700000000000000000000000000000000000000000000"], ["0x456e676c69736800000000000000000000000000000000000000000000000000"], [28]]

myContract.getPeople().toLocaleString()

"0x532e204d61747468657700000000000000000000000000000000000000000000,0x456e676c69736800000000000000000000000000000000000000000000000000,28"

Как я могу наблюдать за кодами операций, которые выполняются в результате указанной выше последовательности?

Использование дизассемблера ByteCode To Opcode Disassembler на Etherscan Я видел, какие коды операций вызываются при создании контракта, но я полагаю, что это отличается от простого вызова контракта или одной из его функций, поскольку, например, вам не нужно будет вызывать снова конструктор и т.д.

введите описание изображения здесь

Ответы (1)

Используйте debug.traceTransaction(...).

Пример из основной сети:

> debug.traceTransaction("0xe7cdf3ddebd6b1f3c21b26346da52901b6035b39bdfb58de49491b47a92808a7")
{
  gas: 30981,
  returnValue: "",
  structLogs: [{
      depth: 1,
      error: null,
      gas: 13725,
      gasCost: 3,
      memory: null,
      op: "PUSH1",
      pc: 0,
      stack: [],
      storage: {}
  }, {
      depth: 1,
      error: null,
      gas: 13722,
      gasCost: 3,
      memory: null,
      op: "PUSH1",
      pc: 2,
      stack: ["0000000000000000000000000000000000000000000000000000000000000060"],
      storage: {}
  }, {
  ...
  }, {
      depth: 1,
      error: null,
      gas: 4019,
      gasCost: 1,
      memory: ["0000000000000000000000000000000000000000000000000000000000000000", "0000000000000000000000000000000000000000000000000000000000000000", "0000000000000000000000000000000000000000000000000000000000000060", "000000000000000000000000000000000000000000000000015a1fa6f11a5551"],
      op: "JUMPDEST",
      pc: 80,
      stack: ["00000000000000000000000000000000000000000000000000000000f7654176"],
      storage: {}
  }, {
      depth: 1,
      error: null,
      gas: 4019,
      gasCost: 0,
      memory: ["0000000000000000000000000000000000000000000000000000000000000000", "0000000000000000000000000000000000000000000000000000000000000000", "0000000000000000000000000000000000000000000000000000000000000060", "000000000000000000000000000000000000000000000000015a1fa6f11a5551"],
      op: "STOP",
      pc: 81,
      stack: ["00000000000000000000000000000000000000000000000000000000f7654176"],
      storage: {}
  }]
}
так что, это не стоит никакого газа, чтобы запустить это? Я могу сделать это для любой транзакции? откуда у него такие данные?
Для работы не требуется бензин. Вы можете сделать это для любой транзакции, если ваши gethданные блокчейна содержат полные данные транзакции. Если вы --fastсинхронизируете свою цепочку блоков, полные данные транзакции будут недоступны до блока, который быстро синхронизируется. См. также ethereum.stackexchange.com/questions/4282/… и ethereum.stackexchange.com/questions/6007/…
так что же, сотни тысяч, даже миллионы JSONобъектов на каждом полном узле со всеми этими данными кода операции на них?
ах, так что, вроде как, мы могли бы, вероятно, вызвать эту функцию более специализированным способом, например, только для получения кодов операций, оставив все остальное, не так ли?
ха-ха, ок, последний вопрос к этим комментариям — можно ли увидеть, сколько времени требуется для выполнения каждого кода операции?