Ungültiger Opcode 0x3d

Der Versuch, eine Transaktion mit Remix auf lokaler Javascript-VM zu übermitteln, ist erfolgreich.

Wenn ich es in meinem echten privaten Netzwerk einreiche, schlägt es fehl mit " invalid opcode 0x3d".. Ich kann 0x3d online nicht finden ... haben Sie eine Ahnung, was dieser Fehler bedeutet? Bezieht es sich auf Gas?

Antworten (2)

Das ist die Anweisung RETURNDATASIZE, die in EIP-211 angegeben ist . Ihr privates Netzwerk ist wahrscheinlich veraltet, wenn es dies nicht unterstützt. Es wurde im Mainnet während der Byzantium Hard Fork bei Block 4.370.000 im Oktober 2017 eingeführt.

danke für die Antwort! Gibt es eine Möglichkeit, dies zu beheben? Problemumgehung für diesen Fehler? Angenommen, mein privates Netzwerk ist veraltet (wobei ich mir nicht so sicher bin), wie kann ich das beheben? ... Es ist also seltsam, weil ich im Grunde 2 Verträge habe. eine, die Münzen überträgt (was funktioniert, wenn ich die Übertragungsfunktion ausführe), und die andere, die ein Wrapper ist, der intern den Vertrag aufruft, der die eigentliche Übertragung durchführt ... der Aufruf vom äußeren Vertrag schlägt mit 0x3d fehl
Welche Software verwenden Sie für die private Kette? Ich weiß, dass Ganache vor Monaten aktualisiert wurde, wenn Sie es versuchen möchten. Wenn nichts anderes funktioniert, könnten Sie eine alte Compiler-Version von vor dem Hard Fork verwenden.
Nur zum Aktualisieren führe ich Geth 1.7.3 aus, das RETURNDATASIZEin seiner Kernimplementierung enthalten ist, und ich verwende ein privates Azure-Ethereum-Netzwerk
Ah ich sehe. Azure verfügt wahrscheinlich nicht über das Byzantium-Update. Mir ist gerade aufgefallen, dass man die EVM-cersion im aktuellen Solidity-Compiler einstellen kann. Rufen Sie einfach solcmit an --evm-version spuriousDragonund diese neuen Anweisungen sind weg.

Danke @mafrasi2.

Ich konnte das lösen, indem ich Folgendes tat:

  1. Upgrade von Geth: Wie aktualisiere ich Geth und Mist in Ubuntu?
  2. Meine genesis.json-Datei wurde aktualisiert, um den Byzantium-Block einzuschließen. Folgende Zeile am Ende der Konfiguration hinzugefügt:"byzantiumBlock": 0
  3. Gelöscht chaindatabefindet sich wahrscheinlich auf .ethereum.
  4. Geth neu gestartet, indem zuerst der neue Genesis-Block ausgeführt wurde:geth init genesis.json
  5. Geth mit den Mining-Parametern, rpc, datadir usw. durchlaufen lassen.
  6. Sie können überprüfen, ob Sie byzantium ausführen, indem Sie einen Transaktionsbeleg überprüfen ( eth.getTransactionReceipt(<tx hash>). wenn Sie "status" als Spalte sehen, dann verwenden Sie byzantium.
schön, gut zu wissen, dass man den Hard Fork Block manuell einstellen muss!