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!!!
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;
}
}
Das Testnet hat den Namen Ropsten .
Aus den Rohdaten 0x295b4e17
in Ihrem ersten Bild versuchen Sie, die paid()
Funktion auszuführen.
Ich habe jede der Funktionssignaturen in der geth
Befehlszeile ü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 state
Variable 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 state
Variable nicht auf gesetzt ist State.Received
.
Um Ihre Funktionalität zu testen, können Sie entweder:
Fügen Sie weitere Funktion(en) hinzu, um Ihren Workflow-Status auf State.Received
; oder
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.Received
wo paid()
Ihr Modifikator funktioniert.
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 cml
sich auf die Befehlszeile bezieht, dh die Verwendung der geth
Befehlszeile, 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.
glücklich verrückt
Datenschutz ist ein Menschenrecht.eth
glücklich verrückt
uint
den 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.Datenschutz ist ein Menschenrecht.eth