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]
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
}
}
throw
? Hast du weiter recherchiert?
FrenchieiSverige
bool dummy = to.send(1000000000000000000);
? Ein boolescher Wert muss mit etwas verglichen werden, um eintrue
oder einfalse
Recht zurückzugeben?Juan Ignacio Pérez Sakristán
FrenchieiSverige
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 dieserCallback contain no result
. Ich sehe keinen Callback-Mechanismus in Ihrem Code.Juan Ignacio Pérez Sakristán
Juan Ignacio Pérez Sakristán
Juan Ignacio Pérez Sakristán
jap1968
web3.toBigNumber(...)
, umgeth
diese großen Ganzzahlen zu verwenden.