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.
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: {}
}]
}
smatthewenglish
privacidadisahumanright.eth
geth
datos de blockchain contengan los datos completos de la transacción. Si--fast
sincroniza 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/…smatthewenglish
JSON
objetos en cada nodo completo con todos estos datos de código de operación en ellos?smatthewenglish
smatthewenglish