Me gustaría obtener el resultado de una función escuchando su evento emitido. Estas son dos piezas de código de mis contratos.
CONTRATO 1:
function createTradeableContract() public stopInEmergency returns(address subcontractAddr) {
TradeableContract tc = new TradeableContract(msg.sender);
contracts.push(tc);
return tc;
}
CONTRATO 2:
function TradeableContract (address ownerAddr) public {
owner = ownerAddr;
NewOwnerEvent(0x0,owner);
}
Estoy usando web3.0 1.0 beta. Escribí este código. No puedo entender por qué no puedo ver el evento en los registros.
self.contractCreator.methods.createTradeableContract().send({from: selectedAccount})
.once('receipt', function(receipt){
console.log("receipt");
console.log(receipt);
console.log("eventos...");
console.log(receipt.logs); //it is undefined
})
.on('error', function(error){
console.log("erro");
console.log(error);
})
.then( receipt =>
{
console.log(receipt);
console.log("events...");
console.log(receipt.logs); //it is undefined
})
.catch (error => console.warn(error));
Si uso Remix, puedo ver el evento en la consola (abajo).
[
{
"from": "0x8722aff990eda4d2d11915705076af5823f5f14c",
"topic": "0x09f86d61eb5d6904c1fa8e5f071f171ec90eccc6e0a7b61d563a7d693db815f6",
"event": "NewOwnerEvent",
"args": {
"0": "0x0000000000000000000000000000000000000000",
"1": "0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c",
"old": "0x0000000000000000000000000000000000000000",
"current": "0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c",
"length": 2
}
}
]
Como no puedo obtener el valor devuelto de una función que cambia de estado, estoy usando eventos. Pero... ¿Cuál es la mejor manera de obtener el evento emitido después de invocar la función?
Cuando envía una transacción, obtiene un recibo de la transacción.
El siguiente paso es esperar a que se extraiga la transacción, luego inspeccionar la transacción y allí verás los registros.
Los niveles más altos en la pila confunden este problema, pero siempre está ahí.
test
lo hace por ti. Cuando usted return myContract.someFunction()
, devuelve la promesa de la transacción extraída. Luego, puede continuar con then...
Nuevamente, esto tiende a empañar un poco el parabrisas porque estas características de conveniencia están haciendo cosas que tenemos que hacer por nosotros mismos en otras circunstancias.Eche un vistazo a esta biblioteca que devuelve la promesa de la transacción minada. Esto, para que uno pueda crear un código conciso que 1) envíe la transacción y espere un recibo, luego 2) espere a que se extraiga la transacción y devuelva la transacción. https://gist.github.com/xavierlepretre/88682e871f4ad07be4534ae560692ee6
Su registro estará allí.
Esa biblioteca es anterior a Web3 Beta 1.0. Tal vez un alma amable intervenga y describa cómo refactorizar. La conclusión es que no debe esperar registros de transacciones en los recibos. No es inconsistente, pero la prueba de Remix y trufa puede hacer que lo parezca.
Espero eso ayude.
Puede consultar este documento para saber cómo ver un evento de contrato inteligente
https://github.com/ethereum/wiki/wiki/JavaScript-API#contract-events
Cambié el contrato 1 para emitir un evento allí.
function createTradeableContract() public stopInEmergency return(address subcontractAddr) { TradeableContract tc = new TradeableContract(msg.sender); contratos.push(tc); NewTradeableWallet(dirección(tc)); volver tc;
}
Ahora puedo ver el evento en el recibo.
{transactionHash: "0xcc1976e7e355f7a51ed20f0dd34e05e026dd7d165aa4a3ade457bb6a1c3ac94a", transactionIndex: 0, blockHash: "0x51a2fc3486ac8a5f8f48cb901d51048ba6d742b355e16f8ea2a385f02e8852b7", blockNumber: 21, gasUsed: 731488, …}
blockHash: "0x51a2fc3486ac8a5f8f48cb901d51048ba6d742b355e16f8ea2a385f02e8852b7"
blockNumber: 21
contractAddress: null
cumulativeGasUsed: 731488
events:
0:
{logIndex: 0, transactionIndex: 0, transactionHash: "0xcc1976e7e355f7a51ed20f0dd34e05e026dd7d165aa4a3ade457bb6a1c3ac94a", blockHash: "0x51a2fc3486ac8a5f8f48cb901d51048ba6d742b355e16f8ea2a385f02e8852b7", blockNumber: 21, …}
NewTradeableWallet:
address: "0x4E72770760c011647D4873f60A3CF6cDeA896CD8"
blockHash: "0x51a2fc3486ac8a5f8f48cb901d51048ba6d742b355e16f8ea2a385f02e8852b7"
blockNumber:21
event: "NewTradeableWallet"
id: "log_6608b960"
logIndex: 1
................
Tenga en cuenta que el evento no se produjo en la recepción.logs. De todos modos, ahora puedo tomar el valor devuelto, ese fue mi problema inicial.
Pero todavía no entiendo por qué a veces los eventos venían dentro de los registros y otras veces no. En mi prueba unitaria, compruebo con éxito los eventos dentro de los registros.
shane fontaine
Susana Maranhão Moreno
Rob Hitchens
Susana Maranhão Moreno
HaĐANG