Lectura del resultado de una función que cambia de estado usando eventos en Solidity

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?

¿Cuál es el resultado cuando ejecuta el código web3?
recibo.logs no está definido
No soy el jugador más fuerte con los cambios beta 1.0, pero sospecho que el descuido conceptual es que hay dos procesos asíncronos, no uno. La primera solicitud asincrónica devuelve un recibo. Debe esperar a que se extraiga la transacción y luego obtener la transacción (también, asíncrona), y luego verá sus registros. Remix hace que esto sea muy conveniente, hasta el punto de ocultarlo, por lo que es fácil pasarlo por alto. Ese sería el proceso necesario en el antiguo web3 y probablemente aún lo sea, a menos que lo hayan integrado en dos pasos en uno.
Por lo que entendí, hay muchas devoluciones de llamada. web3js.readthedocs.io/en/1.0/callbacks-promises-events.html . De acuerdo con este enlace, el "entonces" se llama cuando se extrae la transacción. Entonces, creo que el evento debería estar disponible.
Para el evento de observación al llamar al contrato inteligente; Estoy usando este código y funciona bien ``` event.watch(function (err, response) { if(response.event == 'NewOwnerEvent') { self.setState({ tx_success: true, isLoading: false }) ; } }); ```

Respuestas (3)

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í.

  1. Remix lo hace por ti. También utiliza la reproducción para que pueda ver los valores devueltos. Los registros y los valores devueltos solo se dan, dos cosas que no encuentra cuando crea su propio código con Web3.
  2. Trufa testlo 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

Gracias por su respuesta. Estoy tratando de obtener el evento específico que se emitió durante la ejecución de la función. Además, estoy usando web3 1.0.

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.