Fehler „Rückruf enthält kein Ergebnis“ und „Falsches Sprungziel“.

Beim Aufruf des Testnet-Vertrags ( https://testnet.etherscan.io/address/0xc03db39c18b6056f8c3a3a5495a1e11f3ff8885a ) Methode sendFundsToFriend:

/* Faucet: Send funds, 1 Ether, to a new contact/friend */
function sendFundsToFriend(address to) {
    if (to.balance > 1000000000000000000) {
        faucetResult(msg.sender, to, 'Friends balance higher than 1 Ether'); // Event Log
        throw; // If friend has enough funds (> 1 Ether), do not send anymore
    }
    if (this.balance < 1000000000000000000) {
        faucetResult(msg.sender, to, 'Faucets balance lower than 1 Ether'); // Event Log
        throw; // If SC funds are not enough(< 1 Ether), do not send funds
    }
    bool dummy = to.send(1000000000000000000);
    faucetResult(msg.sender, to, 'Sent 1 Ether to friends account'); // Event Log
}

es wirft die folgenden Fehler:

"Callback contain no result" => when calling contract method through solidity-browser and Metamask.

"Bad jump destination" => when calling contract method through geth node.
    Trace => https://testnet.etherscan.io/vmtrace?txhash=0xa3b522fe104ad9b34cbae4235b59296e624c42665f5e2d6d5b509f4f02c52904

Gemäß Problem beim Setzen des uint-Werts auf Null und https://www.reddit.com/r/ethdev/comments/5m6j1q/heres_an_interesting_solidity_problem_ese_problem/ sieht es nach einem Fehler in Solidity (Metamask-Fall) aus, da Browser Solidity mit Geth interagiert.

Und "Schlechtes Sprungziel" liegt manchmal an einem ungültigen Array-Index oder dem Fehlen des Schlüsselworts "Speicher" bei lokalen Variablendeklarationen, aber keiner dieser Fälle ist bei der sendFundsToFriend-Methode vorhanden, denke ich.

Bei der Ausführung auf einer lokalen Javascript-VM (keine Knotenverbindung) wird dieser Fehler ausgegeben:

VM Exception: invalid JUMP at ac4467b97a805884f19a44b98da45c3fe7c604bc2ce1eaabf19fd83a1126f253/692a70d2e424a56d2c6c27aa97d1a86395877b3a:7906

Ich habe Fehler beim Ausführen dieser Bedingung herausgefunden:

if (this.balance < 1000000000000000000) {
    throw;
}

Also, irgendeine Idee, was an diesem Code falsch ist? Gibt es eine Möglichkeit, den Code zu debuggen oder weitere Informationen zu den Fehlern zu erhalten? Vielen Dank!

Referenzen:

Während der Vertragsausführung aufgetretener Fehler [Ungültiges Sprungziel]

So debuggen Sie den Fehler „Schlechtes Sprungziel“.

Fehler „Ungültiges Sprungziel“.

Hallo. Was möchten Sie mit dieser Codezeile tun bool dummy = to.send(1000000000000000000);? Ein boolescher Wert muss mit etwas verglichen werden, um ein trueoder ein falseRecht zurückzugeben?
Der Zweck dieser Codezeile besteht darin, 1 Ether an ein bestimmtes Konto zu senden. Der boolesche Dummy ist nur dazu da, eine Solidity-Warnmeldung zu vermeiden.
Oh okay, ich wusste nicht, dass Sie dies tun können, um die Solidity-Warnung zu vermeiden. event faucetResult( address _from, address _to, string _comment );Korrigieren Sie mich, wenn ich falsch liege, aber Ihr faucetResult -Ereignis sollte so aussehen: Auch der Gedanke, der mich kitzelt, ist dieser Callback contain no result. Ich sehe keinen Callback-Mechanismus in Ihrem Code.
Die Ereignisdefinition lautet wie folgt: event faucetResult (Adresse von, Adresse an, Zeichenfolgenergebnis); Ist das korrekt?
Bei der Ausführung auf einer lokalen Javascript-VM (keine Knotenverbindung) wird dieser Fehler ausgegeben: VM-Ausnahme: ungültiger Sprung bei ac4467b97a805884f19a44b98da45c3fe7c604bc2ce1eaabf19fd83a1126f253/692a70d2e424a56d2c6c27aa97d1a86395877a
Ich habe Fehler beim Ausführen dieser Bedingung herausgefunden: if (this.balance < 1000000000000000000) { throw; }
Vielleicht hängt das Problem mit dem Bereich dieser großen ganzen Zahlen zusammen. Schauen Sie sich diese Frage an: ethereum.stackexchange.com/questions/11346/… Sie verwenden die Funktion web3.toBigNumber(...), um gethdiese großen Ganzzahlen zu verwenden.

Antworten (1)

Es scheint mir, dass alle Fehler vom Throw-Befehl stammen. Einmal entfernt funktioniert es ok.

function sendFundsToFriend(address to) {
    if (to.balance >= 1000000000000000000) {
        faucetResult(msg.sender, to, 'Friends balance higher than 1 Ether'); // Event log
    } else if (this.balance < 1000000000000000000) {
        faucetResult(msg.sender, to, 'Faucets balance lower than 1 Ether'); // Event log
    } else {
        bool dummy = to.send(1000000000000000000);
        faucetResult(msg.sender, to, 'Sent 1 Ether to friends account'); // Event log
    }
}
Wo kann ein Fehler liegen throw? Hast du weiter recherchiert?