Fehler „Ungültiges Sprungziel“.

Ich schrieb, was ich für einen toten einfachen Vertrag hielt - ein Sparglas ... Sie fügen Wert ("sparen") in das Glas hinzu, und wenn der Saldo des Vertrags einen bestimmten Betrag ("Ziel") erreicht, kann ich es tun Wert zurückziehen. Aber immer wenn ich versuche, ihm einen Wert zu senden, kommt es zu einem Fehler mit "Bad Jump Destination".

Hier mein Vertrag:

pragma solidity ^0.4.0;

contract jar {
  uint public target;
  uint public numDonations;

  function jar (uint _target) {
    target = _target;
    numDonations = 0;
  }

  function save() {
    numDonations++;
  }

  function getBalance() constant returns (uint) {
    return this.balance;
  }

  function withdraw () {
     if (this.balance < target) throw;
     if (!msg.sender.send(this.balance)) throw;
  }
}

Und hier ist der Speicherbefehl, den ich sende:

jar.save({from:eth.accounts[0], value: 100000000000000000, gas:3000000}) 

Hier ist ein Beispiel für eine fehlgeschlagene Transaktion:

https://testnet.etherscan.io/tx/0xcf93aa967f6d1d42b84147511ab58a66a468ee8a102a8d78f78f071ec1a30a05

Ich habe diesen Fehler noch nie gesehen und bin total ratlos. Irgendwelche Hinweise würden sehr geschätzt werden.

Antworten (1)

Während Sie Solidity 0.4 verwenden, sollten Sie Ihre Bezahlfunktion definieren. Wenn Ihr Vertrag Ethere erhält, definieren Sie in Ihrem Code einen zahlbaren Fallback:

function() payable {}

Wenn Sie möchten, dass Funktionen Ether akzeptieren, sollte dies mit einem zahlbaren Modifikator deklariert werden

function save() payable {
    numDonations++;
  }
Insbesondere für dieses Beispiel sollte es seinfunction save() payable{...}