Beispiel-Token-Verträge funktionieren nicht – „Der Vertrag lässt die Ausführung dieser Transaktion nicht zu“

Den Mustervertrag „Advanced Token“ finden Sie hier: https://www.ethereum.org/token

Funktioniert nicht, wenn es im Testnetz bereitgestellt wird. Der Versuch, Ether an den Vertrag zu senden, um Token zu kaufen, führt zu der Fehlermeldung:

Der Vertrag lässt die Ausführung dieser Transaktion nicht zu

Nichts im Tutorial erklärt, warum dies passieren würde.

Ja, OP sagt, er habe es behoben, bietet aber keine Lösung, weil er "nicht finden kann, was genau der Fehler war".
Verstanden. Haben Sie versucht, den Code auf Remix auszuführen, um zu sehen, ob er denselben Fehler auslöst?
Danke für den Tipp. Ich hatte es in Remix ausgeführt, aber die Leistungsfähigkeit des Remix-Debuggers nicht erkannt, was mich zu dem führte, was ich in der Antwort beschrieben hatte.
Argh - ich nehme es zurück. Selbst mit dem Fix wird der Vertrag nicht ausgeführt. Remix sagt, dass dies der Fall sein wird und dass 30.000 Gas benötigt werden, aber der Ethereum-Client meldet immer noch, dass dies fehlschlagen wird. Also immer noch keine Lösung.

Antworten (2)

Bearbeiten Also, ich habe das Problem herausgefunden. Meine "bezahlbare" Funktion heißt buy(). Ich bin davon ausgegangen, dass der Vertrag beim Senden von Ether automatisch die Zahlungsfunktion auswählen würde, aber es sieht so aus, als ob Sie die Catch-All-Zahlungsfunktion anstelle einer benannten Funktion benötigen, um beliebige Ether-Zahlungen zu erhalten. Nachdem ich den Funktionsnamen entfernt hatte, funktionierte alles.

Bearbeiten: Obwohl die folgenden Informationen Teil des Problems waren, ist die spezifische Lösung oben.

Also soweit ich das beurteilen kann ist hier das Problem...

  • Beim Erstellen gibt der Vertragscode dem Eigentümerkonto die anfängliche Menge an Token
  • Das Vertragskonto hat also implizit null Token
  • Es wird erwartet, dass die buy()-Operationen vom Vertragskonto abrufen

Damit buy() funktioniert, gibt es also ein paar Optionen (in der Reihenfolge zunehmender Komplexität).

  • Fügen Sie die Erstversorgung dem Vertragskonto anstelle des Eigentümerkontos hinzu. (Änderung des Vertragscodes erforderlich)
  • Übertragen Sie nach der Erstellung einige Token vom Eigentümer auf das Vertragskonto. (Erfordert 1 zusätzliche Transaktion, kein Code)
  • Senden Sie etwas Ether an das Vertragskonto und verkaufen Sie Token vom Eigentümer zurück an den Vertrag (erfordert 1 zusätzliche Transaktion und Ausgaben von Ether)

Es macht absolut Sinn, sich den Code im Detail anzusehen, hat nur den Aspekt der Eigentümeradresse, die als "msg.sender" bezeichnet wird, im Gegensatz zur Vertragsadresse, die als "this" bezeichnet wird, nicht erfasst.

Also, ich habe das Problem herausgefunden. Die "bezahlbare" Funktion heißt buy(). Ich bin davon ausgegangen, dass der Vertrag beim Senden von Ether automatisch die Zahlungsfunktion auswählen würde, aber es sieht so aus, als ob Sie die Catch-All-Zahlungsfunktion anstelle einer benannten Funktion benötigen , um beliebige Ether-Zahlungen zu erhalten. Nachdem ich den Funktionsnamen entfernt hatte, funktionierte alles!

Nach der Vertragserstellung gehört die anfängliche Münzzuteilung dem Vertragsinhaber. Sie müssen einige der neuen Münzen auf den Vertrag selbst übertragen.

Bei einem Saldo von Null lässt der Vertrag die Transaktion nicht zu.

Ja, das war Teil des Problems. Der Beispielvertrag schafft also kein funktionierendes Setup, ohne manuelle Beteiligung, um die Token zu verschieben.