Beim Erstellen eines neuen Vertrags erhalte ich die Fehlermeldung „Vertragscode konnte nicht gespeichert werden“, aber der Vertrag wird trotzdem erstellt

Sale.new({ from: state.account, value: value, gas: 4000000 }).then((instance) => {
  // do something with instance
}).catch((err) => {
  alert(err)
})

Wenn der obige Code ausgeführt wird, erhalte ich manchmal diesen Fehler:The contract code couldn't be stored, please check your gas amount.

Der Vertrag, den ich zu erstellen versuche, ist fast genau derselbe wie der sichere Fernzahlungsvertrag in den Solidity-Dokumenten, mit vielleicht nur ein paar Zeilen mehr.

Das Seltsame ist, dass der Vertrag tatsächlich erstellt wird und ich die erfolgreiche Transaktion in MetaMask sehen kann und der Ether von meinem Konto abgezogen wird. Ich kann sogar dann verwenden Sale.at(<new contract address>), um mit dem erstellten Vertrag zu interagieren. Ich habe im Ropsten-Netz getestet.

Antworten (3)

Eine Sache, die Sie hier nicht erwähnt haben, ist, dass dies früher gut funktioniert hat, aber vor etwa einer Woche nicht mehr funktioniert hat.

Das lässt mich denken, dass es ein Fehler mit MetaMask ist, und es tut mir leid, dass wir es noch nicht herausgefunden haben: https://github.com/MetaMask/metamask-plugin/issues/1361

Das fühlt sich an wie einer dieser sehr breiten Fehler. Ich bin darauf gestoßen, als ich ein Funktionsargument hinzugefügt habe, ohne meine ABI-Datei zu aktualisieren (ich speichere Funktionsdefinitionen und Funktionen in separaten Dateien) - dies führte dazu, dass die Funktionsdefinition nicht mit der Implementierung übereinstimmte.

Hoffe das hilft jemandem.

Das war mein Problem mit dieser Fehlermeldung. Ich hatte dem abstrakten Vertrag eine Funktion hinzugefügt, aber nicht dem implementierten Vertrag.

Sie haben den Fehler nach der im Konstruktor ausgelösten Ausnahme erhalten.

Ich glaube, mit diesem Snippet stimmt etwas nicht:

  function Purchase() payable {
        seller = msg.sender;
        value = msg.value / 2;
        if (2 * value != msg.value) throw;
    }

es wird wahrscheinlich eine Ausnahme auslösen, während 2*value==msg.value.

Warum wird wahrscheinlich eine Ausnahme ausgelöst? Und wenn dies wirft, sollte die Transaktion dann nicht zurückgesetzt werden? Warum wird es erfolgreich erstellt?
Welchen Wert senden Sie in der Erstellungstransaktion?
Der Benutzer wird so etwas wie 0,1 eingeben. Was dann durchlaufen wird web3.toWei(web3.toBigNumber(0.1).times(2), 'ether'). Ich würde also denken, dass der Konstruktor in der Lage sein sollte, den gesendeten Wert gleichmäßig in 2 Teile zu teilen, da er vor dem Senden mit 2 multipliziert wurde.