Cómo verificar si una transacción se ha completado correctamente o ha sido rechazada por algún control de aserción [duplicado]

Hemos desarrollado un contrato inteligente simple que ofrece el siguiente método de transacción pública:

function bid(uint256 _userCode, uint256 _amount) public {

        assert(_userCode> 0);
        assert(_amount> 0);

        winningBid.userCode= _userCode;
        winningBid.amount= _amount;

        var bidData= Bid(_userCode, _amount);
        bids.push(bidData);
    }

Estamos enviando la transacción utilizando este código de Nethereum:

var result = bidFunction.SendTransactionAndWaitForReceiptAsync(address, gas, balance, null, userCode, amount).Result;

La invocación del método no arroja ninguna excepción, incluso pasando 0a la userCodeque, si observa el contrato inteligente, debería activar la aserción y detener la ejecución del método.

¿Cómo podríamos comprobar si una transacción se ha completado correctamente o ha sido rechazada por algún control de aserción?

¿La función incluye un parámetro para una función de devolución de llamada? Esto es generalmente cómo se hace.
No estamos utilizando ninguna función de devolución de llamada. ¿Podría proporcionar un ejemplo?
Desde byzantinum el recibo incluye un campo de estado para indicar si la transacción se ejecutó correctamente o no.

Respuestas (1)

Al leer los documentos de Solidity sobre el manejo de errores , me vienen a la mente estas cosas:

  • Deberías usar requireen lugar de assert. Assert es para detectar errores en el código. Requerir es para cancelar la operación en una entrada no válida (su caso de uso).

  • La solidez revertirá toda la operación, cuando encuentre asserto requirey nada cambiará.

  • Todavía no es posible capturar excepciones.

  • Podría hacer que su función devuelva el valor aceptado, por ejemplo:

    function bid(uint256 _userCode, uint256 _amount) public constant returns (uint256) {
    
        assert(_userCode> 0);
        assert(_amount> 0);
    
        winningBid.userCode= _userCode;
        winningBid.amount= _amount;
    
        var bidData= Bid(_userCode, _amount);
        bids.push(bidData);
    
        return _amount;
    }
    

    Debería ser posible notar la diferencia entre una llamada exitosa y una fallida, ¿verdad?

Gracias por tu respuesta. Dado que la función de oferta es una transacción (está cambiando el estado de la cadena de bloques), no puede leer el valor de retorno de la transacción a través del SDK de Nethereum; todo lo que puede obtener es un recibo.