Wir haben einen einfachen Smart Contract entwickelt, der folgende öffentliche Transaktionsmethode bietet:
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);
}
Wir senden die Transaktion mit diesem Nethereum-Code:
var result = bidFunction.SendTransactionAndWaitForReceiptAsync(address, gas, balance, null, userCode, amount).Result;
Der Methodenaufruf löst keine Ausnahme aus, selbst wenn Sie sich 0
den userCode
Smart Contract ansehen, der die Bestätigung auslösen und die Methodenausführung stoppen sollte.
Wie können wir überprüfen, ob eine Transaktion korrekt abgeschlossen wurde oder von einer Bestätigungsprüfung abgelehnt wurde?
Beim Lesen der Solidity-Dokumentation zur Fehlerbehandlung fallen mir folgende Dinge ein:
Sie sollten require
stattdessen verwenden assert
. Assert dient zum Erkennen von Fehlern im Code. Require dient zum Abbrechen des Vorgangs bei ungültiger Eingabe (Ihr Anwendungsfall).
Solidity wird die gesamte Operation rückgängig machen, wenn es auf assert
oder trifft require
und nichts geändert wird.
Das Abfangen von Ausnahmen ist noch nicht möglich.
Sie könnten Ihre Funktion dazu bringen, den akzeptierten Wert zurückzugeben, z.
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;
}
Es sollte doch möglich sein, einen erfolgreichen Anruf von einem fehlgeschlagenen zu unterscheiden, oder?
jojeyh
systempuntoout
Ismael