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 0
a la userCode
que, 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?
Al leer los documentos de Solidity sobre el manejo de errores , me vienen a la mente estas cosas:
Deberías usar require
en 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 assert
o require
y 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?
jojeyh
systempuntoout
ismael