Web3 manejo de eventos de contrato

Parece que hay un problema con el manejo de los eventos del contrato y no estoy seguro si está en el nivel de EVM o solo en web3js.

Tengo 2 contratos "SomeCoin" y "SomeConcert". Ambos contratos emiten un evento de "Transferencia" cuando hay una transferencia de artículo de una dirección a otra. Para "SomeCoin" el objeto de la transferencia es una moneda/token, para "SomeConcert" el objeto de la transferencia son las entradas para conciertos (que tienen un precio en "SomeCoins").

Cuando llamé al método "AlgúnConcierto" para comprar boletos, la lógica transferirá algunas "AlgunasCoins" de mi dirección a la dirección de "AlgúnConcierto". Todo está muy bien excepto por el manejo del evento. Vi 2 eventos emitidos, el evento "Comprar" emitido desde el contrato "AlgúnConcierto" y el evento "Transferir" desde el contrato "AlgunaCoin". Si cambio el nombre del evento "Transferir" en el contrato "SomeCoin" a "TransferCoin", solo veré el evento "Comprar".

Entonces, aparentemente, web3 o la capa subyacente confunden los eventos emitidos por el contrato de la capa interna con el contrato de la capa externa. Al menos esta es la conclusión a la que he llegado.

¿Es esto un error de web3js? ¿Hay algo que me perdí en el manejo de eventos que podría haber evitado la confusión? El código que tengo para el manejo de eventos es bastante estándar.

... return someConcertInstance.buyTickets(3, {from: customer1}); }).then(function(receipt) { assert.equal(receipt.logs.length, 1, "should have received 1 events for buy-ticket)"); assert.equal(receipt.logs[0].args._numberOfTickets, 3, "Number of tix bought must be 3");

El caso de prueba falló en la primera afirmación y descubrí que se emiten 2 eventos (transferencia y compra).

Se espera que el recibo de la transacción contenga dos entradas de registro, porque se registraron dos eventos en esa transacción. Es inesperado que vea solo una entrada de registro si cambia el nombre de uno de los eventos... ¿tal vez sea una discrepancia entre el código del contrato y la ABI que está utilizando?
Lo comprobé y, de hecho, ese es el comportamiento.
No estoy seguro de lo que estás confirmando. ¿Encontró una discrepancia entre el código de contrato y el ABI?
El ABI y el contrato son consistentes. Utilicé Truffle v4.1.5 y borré todo en la carpeta "compilar", reinicié mi testrpc, hice una "compilación de Truffle --todo" y "migración de Truffle --reset" aunque se supone que la prueba de Truffle hace la implementación de sala limpia. Pero el resultado permanece: veré los eventos del contrato interno si tengo la misma firma de evento en el contrato externo. Me parece que hay algo de lógica en cómo los eventos se expanden en la cadena y probablemente usaron el nombre del evento para filtrar. Me pregunto si esto tiene que ver con web3 o algo más fundamental.
Como dije, creo que debería ver todos los registros generados por su transacción. El hecho de que uno de los eventos parezca desaparecer en función del nombre del evento me parece un error en web3.js... mi mejor teoría es que web3.js en realidad no proporciona todos los registros, sino solo los los que coinciden con una firma en el ABI. Esto puede ser por diseño, pero no me gusta ese diseño. :-)
¿Qué versión de web3.js estás usando? ¿O es esta trufa?
sí, es por diseño (que es bastante extraño) o por un error. Mi truffle es 4.1.5 (más reciente), la versión web3 que se muestra en la consola de truffle cuando ejecuto web3.version es 0.20.6.
Si esto es realmente trufa, entonces parece que el diseño es lo que planteé: github.com/trufflesuite/truffle-contract/blob/develop/… . Recomendaría presentar un problema. Yo personalmente evito la trufa.
Si desea procesar solo los eventos que provienen de un contrato en particular, parece que exponen un addresscampo, por lo que puede filtrar eso.
Lo siento, acabo de ver una edición de uno de tus comentarios anteriores. Parece que esto es realmente una trufa, así que ese es el problema.
¿Truffle tiene su propio web3js? Déjame intentar implementar los contratos en geth y ver si obtengo el mismo comportamiento.
Creo que usan web3.js debajo, pero ciertamente tienen su propio objeto de contrato. (Consulte github.com/trufflesuite/truffle-contract ). Creo que web3.js 1.0.0-beta puede filtrar los mensajes de registro de manera similar, y creo que web3.js 0.2xx no intenta analizar los mensajes de registro en absoluto (y así los dejará intactos).

Respuestas (1)

Resuelto en los comentarios anteriores, pasando a una respuesta para futuros lectores.

El código en la pregunta está usando truffle. Al enviar una transacción en truffle, el resultado que obtiene tiene un logscampo, que se ensambla a través de este código: https://github.com/trufflesuite/truffle-contract/blob/develop/contract.js#L44 .

Ese código descarta registros con temas que no coinciden con una firma de evento conocida en la ABI del contrato al que está llamando. Considero que ese comportamiento es un error de diseño.