kann den Vertrag auf etherscan.io nicht verifizieren. Wie kann dieses Problem gelöst werden?

Ich kann den Vertrag in etherscan.io nicht überprüfen. Ich konnte denselben Solidity-Code in (Geth, Mist) einsetzen. Aber den gleichen Code kann ich in etherscan.io nicht verifizieren. Welchen Fehler mache ich hier?

Beim Deployment des Codes auf Mist habe ich die Compiler-Version verwendet:

pragma solidity ^0.4.16;

Ich habe die gleiche Compiler-Version in etherscan.io ausgewählt:0.4.16+commit.d7661dd9

Hier ist die Transaktion:

Vertrag wurde während Txn# erstellt0x9832deb04d2900f97c0434588038f573ee066c0a095c1c0a0af07225d0068a9d

Ergebnis: Stimmt nicht mit dem Bytecode für die Eingabeerstellung überein, der an dieser Adresse gefunden wurde. Es tut uns leid! Der kompilierte Vertrags-ByteCode für „Kauf“ stimmt NICHT mit dem Vertragserstellungscode für [0x89d236a8387e6fE94e27D674D856e09f4dEE1302] überein.

Verwendet der Vertrag eine Bibliothek? Hast du es mit aktivierter Optimierung kompiliert?
@pabloruiz55: Danke. Ich habe versucht, mit aktivierter Optimierung zu kompilieren und das Karottensymbol entfernt. Dann wurde mein Vertrag überprüft
Übrigens: Warum verwenden die Leute 0.4.16 im September 2018 in der Produktion?

Antworten (2)

Versuchen Sie, Ihre pragmaAussage zu ändern

pragma solidity 0.4.16

(ohne ^).

Aufgrund der pragma...Anweisung kann es zu Problemen kommen, da Sie mit der ^Version 0.4.16 zulassen

oder etwas Neueres, das die Funktionalität nicht beeinträchtigt (bis einschließlich Version 0.5.0)

(von solidity.readthedocs.io). Dies kann zu unterschiedlichem Bytecode führen, was zu einer fehlgeschlagenen Überprüfung führt.

Danke dir. Das Entfernen des ^-Symbols hat mir geholfen, das Problem zu lösen

Bis zu einem gewissen Punkt stimme ich @gisdev_p zu. Das Karottensymbol ^erzeugt genau die Art von Mehrdeutigkeit, die wir in diesem Stadium nicht wollen. Ihr Vertrag ist bereits bereitgestellt und kann basierend auf dem Quellcode mit einem beliebigen Solidity-Compiler >= 0.4.16 kompiliert worden sein.

Jetzt müssen Sie die Version des Compilers ermitteln, die tatsächlich verwendet wurde, um den Bytecode in der Kette zu erstellen.

Alles unter 0.4.16 ist ausgeschlossen.

Sie sollten an das Tool denken, mit dem Sie die Kompilierung durchgeführt haben, und es nach der Versionsnummer abfragen, z . B. solc --versionoder truffle version). Wenn Sie sich bei der Optimierungsoption nicht sicher sind, probieren Sie beide Möglichkeiten aus.

Wenn Sie die magische Kombination finden (Vertragsname + Compiler-Version + Optimierungsoption), stellt Etherscan eine perfekte Übereinstimmung zwischen dem Bytecode in der Kette und dem Ergebnis der Kompilierung Ihres Vertrags mit Ihren Parametern fest. Auf diese Weise bestätigen sie, dass der Quellcode, den sie haben, eine echte Darstellung des kompilierten Vertrags in der Kette ist.

Ich hoffe es hilft.

Vielen Dank, dass Sie mir geholfen haben, das Konzept zu verstehen. Ich habe versucht, mit aktivierter Optimierung zu kompilieren und das Karottensymbol entfernt. Dann wurde mein Vertrag überprüft. Danke vielmals!
Schön, dass es geholfen hat. Upvotes sind immer willkommen ;-)
Das Überprüfen der Solidity-Version mit solc --versionhilft mir.