So überprüfen Sie, ob eine Transaktion korrekt abgeschlossen wurde oder von einer Bestätigungsprüfung abgelehnt wurde [Duplikat]

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 0den userCodeSmart 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?

Enthält die Funktion einen Parameter für eine Callback-Funktion? So wird es normalerweise gemacht.
Wir verwenden keine Callback-Funktion. Können Sie bitte ein Beispiel nennen?
Seit Byzanz enthält die Quittung ein Feldstatus, um anzuzeigen, ob die Transaktion korrekt ausgeführt wurde oder nicht.

Antworten (1)

Beim Lesen der Solidity-Dokumentation zur Fehlerbehandlung fallen mir folgende Dinge ein:

  • Sie sollten requirestattdessen 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 assertoder trifft requireund 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?

Danke für deine Antwort. Da die Gebotsfunktion eine Transaktion ist (sie ändert den Blockchain-Status), können Sie den Rückgabewert der Transaktion nicht über das Nethereum SDK lesen; Alles, was Sie bekommen können, ist eine Quittung.