Devolviendo el mensaje de error del contrato inteligente

Estoy tratando de devolver mensajes de error de solidity. tengo este contrato:

pragma solidity ^0.4.23;
contract Simple {
    function arithmetics(uint a, uint b){           
                     require(a % 2 == 0, "Even value required.");             
                    b = b * 3; 
            }
}

Cuando pruebo en remix, me devuelve el siguiente mensaje de error:

Transact to Simple.arithmetics con error: error de VM: revertir. revert La transacción ha sido revertida al estado inicial. Motivo proporcionado por el contrato: "Valor par requerido". Depure la transacción para obtener más información.

Sin embargo, cuando intenté llamarlo desde mi dApp usando web3.js, no recibo un mensaje de error, solo esto:

La transacción se quedó sin combustible.

Respuestas (2)

Puede encontrar el mensaje de error rastreando la transacción. Por ejemplo, usando geth y asumo que su nodo se está ejecutando en http://127.0.0.1:8545:

1- Abre una consola

geth attach http://127.0.0.1:8545

2- Rastrear transacción

debug.traceTransaction(<your TX hash here>)

Debería obtener un seguimiento de la transacción. Si su nodo geth no se inició con debughabilitado, puede hacer una solicitud HTTP como:

curl -X POST --data '{"jsonrpc":"2.0","method":"debug_traceTransaction","params":["<your TX hash here>"],"id":1}' http://127.0.0.1

Ahora que tiene el rastro, puede embellecer el JSON para verlo mejor. En la parte inferior encontrará la última instrucción y el estado de EVM (y otras cosas). La última instrucción debe ser un REVERTcódigo de operación. Luego, vaya a la MEMORYsección y puede convertirlo a ascii para encontrar el mensaje de error. Por ejemplo, en bash este comando se convertiría de hexadecimal a ascii:

echo <your HEX here> | xxd -r -p

Para web3, este es un trabajo en desarrollo y aún no es posible. Puede seguir este hilo: https://github.com/ethereum/web3.js/issues/1707