genehmigenAndCall () aus dem ERC20-Token-Vertrag auf MainNet und auf TestNet Ropsten

Wie kann das möglich sein: die gleiche Funktion im gleichen Code, auf MainNet aufrufbar, und auf TestNet, wenn ich versuche, über das gleiche Ethereum Wallet zu starten, erhalte ich die Meldung:

Es scheint, dass diese Transaktion fehlschlagen wird. Wenn Sie es einreichen, kann es das gesamte von Ihnen bereitgestellte Gas verbrauchen. Geschätzter Gebührenverbrauch: Der Vertrag lässt die Ausführung dieser Transaktion nicht zu

Und Ethereum Wallet zeigt den Gaspreis auf dem Ropsten 5,271 Ether pro Million Gas:

Geben Sie hier die Bildbeschreibung ein

Vertrag auf TestNet https://ropsten.etherscan.io/address/0x47d55ec9E1d5DEb893D3943e6d84011E488b1A37#code , auf MainNet https://etherscan.io/address/0x684282178b1d61164febcf9609ca195bef9a33b5#code Die approveAndCall()aufgerufene Funktion basierte auf dem Modell von https :///ethereum Token (in alter Version) Und es scheint keinen Unterschied zu machen, welche Adresse als Argument verwendet wird.

Ich denke, das Problem kann beim dritten Argument dieser Funktion liegen: 'bytes _extraData', wie auf https://ethereum.stackexchange.com/a/11771/1964 besprochen, und Remix in 'Analysis' hält es auch für nicht gut:

Gasbedarf der Funktion Corporation.approveAndCall(address,uint256,bytes) unbekannt oder nicht konstant.

Wenn der Gasbedarf einer Funktion höher ist als die Sperrgasgrenze, kann sie nicht ausgeführt werden. Bitte vermeiden Sie Schleifen in Ihren Funktionen oder Aktionen, die große Speicherbereiche ändern (dazu gehört das Löschen oder Kopieren von Arrays im Speicher)"

Wo kann ein Problem sein? Wie kann Code, der auf MainNet funktioniert, auch auf Ropsten TestNet funktionieren? Ich möchte es den Benutzern ermöglichen, den Vertrag auf TestNet zu testen, bevor sie mit der Arbeit am MainNet beginnen.

Kann mir bitte jemand in Laiensprache erklären, wie man diesen Fehler behebt?

Antworten (1)

Ich glaube, das liegt daran, dass die Compiler-Version im MainNet-Vertrag: v0.3.5 und im TestNet: v0.4.8 ist. Die entscheidende Änderung, die den ganzen Unterschied ausmacht, ist (eingeführt in 0.4.0):

Contracts now throw if ... no function matches the signature.

und

Function call throws if target contract does not have code.

In diesem Fall führt also das Erstellen von applyAndCall zu der einfachen Adresse oder dem Vertrag ohne receivedefinierte Funktion zu einem Throw für 0.4.8, während es in 0.3.5 ignoriert wird. Erwägen Sie, denselben Bytecode bereitzustellen, um dieselben Ergebnisse zu erhalten.