indicador/opción de la consola geth para generar todos los códigos de operación ejecutados en la llamada al contrato o invocación de función

Lo que me gustaría hacer es analizar todos los códigos de operación que se ejecutan cuando llamo a un contrato o llamo a una función desde un contrato.

Según tengo entendido, este cálculo ocurriría en mi propia máquina, en el EVM, y solo el resultado se enviaría a la cadena de bloques.

Mi idea es que, para que se calcule este resultado, los cálculos deben ejecutarse en mi máquina local en algún momento del siguiente proceso:

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"

¿Cómo puedo observar los códigos de operación que se están ejecutando como consecuencia de la secuencia anterior?

Usando ByteCode To Opcode Disassembler en Etherscan, he visto qué códigos de operación se invocan en la creación del contrato, pero imagino que esto es diferente a simplemente llamar a un contrato o una de sus funciones, ya que, por ejemplo, no necesitará invocar el constructor de nuevo, etc.

ingrese la descripción de la imagen aquí

Respuestas (1)

uso debug.traceTransaction(...)_

Ejemplo de Mainnet:

> 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: {}
  }]
}
Entonces, ¿no cuesta nada de gasolina hacer funcionar eso? ¿Puedo hacerlo para cualquier transacción? de donde saca esos datos?
No cuesta gasolina para funcionar. Puede hacerlo para cualquier transacción siempre que sus gethdatos de blockchain contengan los datos completos de la transacción. Si --fastsincroniza su cadena de bloques, los datos completos de la transacción no estarán disponibles antes del bloque que se sincroniza rápidamente. Consulte también ethereum.stackexchange.com/questions/4282/… y ethereum.stackexchange.com/questions/6007/…
Entonces, ¿hay cientos de miles, incluso millones, de JSONobjetos en cada nodo completo con todos estos datos de código de operación en ellos?
ah, entonces, en cierto modo, podríamos llamar a esta función de una manera más especializada, por ejemplo, solo para obtener los códigos de operación, dejar el resto de esas cosas, ¿no es así?
jaja ok, última pregunta para estos comentarios, ¿es posible ver cuánto tarda en ejecutarse cada código de operación?