¿Cómo debo llamar al objeto devuelto por una llamada de función de contrato de Truffle?

Cuando realizo una llamada de función de contrato a través de Truffle y luego resuelvo la promesa devuelta, obtengo algo como esto:

{
    "tx": "0x...",
    "receipt": {
        "transactionHash": "0x...",
        "transactionIndex": 0,
        "blockHash": "0x...",
        "blockNumber": 24,
        "gasUsed": 42860,
        "cumulativeGasUsed": 42860,
        "contractAddress": null,
        "logs": [
            {
                "logIndex": 0,
                "transactionIndex": 0,
                "transactionHash": "0x...",
                "blockHash": "0x...",
                "blockNumber": 24,
                "address": "0x...",
                "data": "0x...",
                "topics": [
                    "0x...",
                    "0x...",
                    "0x..."
                ],
                "type": "mined"
            }
        ],
        "status": "0x1",
        "logsBloom": "0x..."
    },
    "logs": [
        {
            "logIndex": 0,
            "transactionIndex": 0,
            "transactionHash": "0x...",
            "blockHash": "0x...",
            "blockNumber": 24,
            "address": "0x...",
            "type": "mined",
            "event": "Transfer",
            "args": {
                "from": "0x...",
                "to": "0x...",
                "value": "0"
            }
        }
    ]
}

No estoy muy seguro de cómo Truffle ajusta exactamente web3.js para invocar funciones de contrato, por lo que no estoy muy seguro de dónde buscar en la documentación de web3.js. Pero estoy usando Truffle v4.1.14, que se basa en web3.js v0.18.4, y los documentos para web3.js v0.x son un poco difíciles de leer, así que busqué en los documentos web3.js v1.x en su lugar.

Ahora, supongo que debería buscar en web3.eth.sendSignedTransaction , que devuelve:

Un emisor de eventos combinados prometedor. Se resolverá cuando se disponga del comprobante de la transacción .

Entonces parece que Truffle toma este recibo y lo incrusta en un objeto JSON que contiene los siguientes campos adicionales :

  1. tx, que es el hash de la transacción, supongo
  2. logs, que contiene algunos o todos los receipt.logs, pero decodificados

Entonces, ¿qué está pasando aquí exactamente?

Este nuevo objeto ciertamente no es el recibo descrito en los documentos.

¿Existe una terminología oficial para esto, o es solo un "truco de trufas" designado para facilitarme la vida al decodificar eventos?

Gracias.

Respuestas (1)

Claramente, la trufa devuelve su propio objeto. Seguramente contendrá el recibo web3 original que está etiquetado receiptporque truffle usa web3 0.x como mencionaste. Entonces, los atributos agregados no son más que una forma de trufa tratando de mejorar su marco y mantener la capa por encima de web3.

No creo que haya una terminología determinada para ese objeto, o al menos siempre quedará eclipsada por la transactionReceiptde Web3, de ahí que tomen el mismo nombre para ambos.

Pero si tuviera que tratar de mantener mi código de prueba compatible fuera de truffle (por ejemplo, supongamos que tengo algunas utilidades JS comunes que quiero usar para la interacción "en tiempo real" con la red Ethereum), entonces probablemente debería evitar confiar en eso capa adicional, ¿correcto?
sí, o podría escribir utilidades de prueba separadas para la trufa y para el exterior de la trufa. no es tan difícil, considerando que está a solo un atributo json de distancia.
Decidí que el nombre responsesería lo suficientemente adecuado. Entonces puedo referirme a response.tx, response.logs, response.receipt, response.receipt.logs, etc.
Por cierto, ¿tiene alguna idea de cómo Truffle puede extraer el nombre del evento del recibo? En el ejemplo anterior, está en response.logs[0].event.