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.
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 debug
habilitado, 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 REVERT
código de operación. Luego, vaya a la MEMORY
secció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