Gas nicht genug und nicht in der Lage, Funktionen auszuführen

Ich bin neu bei Ethereum und schreibe einen intelligenten Vertrag für mein Projekt. Ich habe Win 10 und Mist 0.8.8 mit dem Testnetz verwendet, das mit "R" begann.

Der Vertragscode hat die Funktion, den Status und einige Modifikatoren zu ändern, aber nachdem ich den Vertrag gestartet habe, kann ich keine Funktionen davon ausführen. Folgende Fehler werden angezeigt. Ich danke dir sehr!!!

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Der Vertragscode wird unten angezeigt: Vielen Dank!

pragma solidity ^0.4.6;
contract FairTrade {

    /* Variables */
    address public creater;
    address public trader;
    address public framer;
    address public preieumHandler;

    /* State handling */
    enum State { Paying, Transporting, Received, Completed }
    State public state;

    /* Contructor */
    function FairTrade(address _trader, address _framer, address _preieumHandler,
      uint _price, uint _quantity) {
        creater = msg.sender;
        trader = _trader;
        framer = _framer;
        preieumHandler = _preieumHandler;

    }

    /* Modifiers */    
    modifier onlyFramer {
        if (msg.sender != framer) throw ; else _;
    }

    modifier onlyTrader {
        if (msg.sender != trader) throw; else _;
    }

    modifier inState(State s) {
        if (state != s) throw; else _;
    }

    modifier notInState(State s) {
        if (state == s) throw; else _;
    }

    /* Functions */    
    function completedPaid() onlyTrader {
        state = State.Transporting;
    }    

    function receivedGood() inState(State.Transporting) onlyFramer {
        state = State.Received;
    }

    function paid() inState(State.Received) {
        state = State.Completed;
    }
}

Antworten (1)

Das Testnet hat den Namen Ropsten .

Aus den Rohdaten 0x295b4e17in Ihrem ersten Bild versuchen Sie, die paid()Funktion auszuführen.

Ich habe jede der Funktionssignaturen in der gethBefehlszeile überprüft und die folgende Signatur stimmte überein:

> web3.sha3("paid()").substring(0, 10)
"0x295b4e17"

Diese paid()Funktion hat den Modifikator inState(State.Received)und dieser Modifikator löst einen Fehler aus, wenn die aktuelle stateVariable NOT ist State.Received.

Die Warnung, die Ihnen angezeigt wird, ist darauf zurückzuführen, dass Mist den Aufruf simuliert, den Sie auszuführen versuchen, und festgestellt hat, dass der Aufruf paid()fehlschlagen wird, da die aktuelle stateVariable nicht auf gesetzt ist State.Received.

Um Ihre Funktionalität zu testen, können Sie entweder:

  1. Fügen Sie weitere Funktion(en) hinzu, um Ihren Workflow-Status auf State.Received; oder

  2. Entfernen Sie den inState(State.Received)Modifikator aus der paid()Funktion.

Ich würde vorschlagen, zuerst 2. oben zu versuchen, damit Sie feststellen können, ob Sie die paid()Funktion erfolgreich ausführen können. Sobald Sie bestätigt haben, dass die paid()Funktion ohne den Modifikator erfolgreich ausgeführt wird, erstellen Sie die anderen erforderlichen Funktionen, um Ihren Vertrag dorthin zu verschieben state, State.Receivedwo paid()Ihr Modifikator funktioniert.



Aktualisieren Sie die Antwort auf den Kommentar unten

F : Sollte ich uint als Variablentyp verwenden, um den Sendevorgang aufzuzeichnen?

A : uint(das ist uint256) ist geeignet, um die Anzahl der Äther aufzuzeichnen.

F : Wenn ich 1 Ether an den Vertrag sende, werden stattdessen 1000000000 Wai angezeigt.

A : 1 Ether ist 1e18 oder 1.000.000.000.000.000.000 Weis. Im geth:

> 1e18
1000000000000000000
> web3.fromWei(1e18,"ether")
"1"
> web3.toWei(1,"ether")
"1000000000000000000"

F : Schließlich möchte ich die cml lernen, um den Vertrag auszuführen. Hast du einen empfehlenswerten Link für mich?

A : Wenn cmlsich auf die Befehlszeile bezieht, dh die Verwendung der gethBefehlszeile, gibt es einige Schritt-für-Schritt-Anleitungen unter:

Vielleicht möchten Sie sich auch Browser Solidity ansehen – siehe So rufen Sie die Bibliotheksfunktion aus einem Vertrag auf? => [Fehler] Der Vertragscode konnte nicht gespeichert werden, bitte überprüfen Sie Ihre Gasmenge. undefiniert für ein Beispiel.

Oh mein Gott!! Vielen Dank, ich werde es ausprobieren, sobald ich den Computer habe. Darf ich Sie fragen, was der zu zahlende Modifikator im Vertrag ist? Ich habe viele Verträge gesehen, die diese Funktion zur Abwicklung von Übersetzungen haben. Jemand sagte, wenn wir es nicht haben, wird das ganze Gas verbraucht, sobald es wirft. Vielen Dank.
Jede Funktion, die als zahlbar gekennzeichnet ist, einschließlich der Standardfunktion (siehe ethereum.stackexchange.com/a/9297/1268 ), kann Ether empfangen, die mit der Transaktion gesendet werden, die die Funktion aufruft. Ein Fehler wird ausgegeben, wenn Sie Ether senden, wenn Sie eine Funktion aufrufen, die nicht als zahlbar markiert ist. Auf diese Weise können Sie Verträge entwerfen, bei denen ein Benutzer nicht versehentlich Ether senden kann, wenn dies nicht erforderlich ist.
Nochmals vielen Dank. Alles funktioniert gut. Soll ich uintden Typ der Variablen verwenden, um das Senden aufzuzeichnen? Wenn ich 1 Ether an den Vertrag sende, werden stattdessen 1000000000 Wai angezeigt. Schließlich möchte ich die cml lernen, um den Vertrag auszuführen. Hast du einen empfehlenswerten Link für mich? Danke vielmals.
Siehe aktualisierte Antwort zur Beantwortung der Fragen in Ihrem obigen Kommentar.