Gibt es eine Möglichkeit zu erkennen, welche Compiler-Version eine Vertragsbinärdatei erstellt hat?

Gibt es angesichts des kompilierten Bytecodes in der Blockchain eine Möglichkeit zu erkennen, welche Compiler-Version verwendet wird, um zu überprüfen, ob die Quelle mit dem Bytecode übereinstimmt, ohne alle verfügbaren Compiler-Versionen / Ausgaben bruteforcen zu müssen?

Antworten (1)

Nein , da es keinen Unterschied in der Ausgabe des Bytecodes von der einfach in den Browsercontract Test {} gesteckten Solidity gibt , wenn verschiedene neuere Versionen des Solidity-Compilers verwendet werden.

Unter Wie kann ich überprüfen, ob ein Vertrag auf der Blockchain mit dem Quellcode übereinstimmt, finden Sie einige Informationen darüber, wie http://etherchain.org den Vertragsquellcode mit dem Vertragsbytecode vergleicht . einschließlich der Anmerkung, dass:

Die Übereinstimmung, die Sie überprüfen sollten, ist der kompilierte Bytecode mit den Daten der Vertragserstellungs-TX

Dies liegt daran, dass der Bytecode, der von der Vertragserstellungstransaktion ausgeführt wird, einen gewissen Vertragsinitialisierungscode enthält.


(Interessant) Die Frage Wie kann ich überprüfen, ob ein Vertrag auf der Blockchain mit dem Quellcode übereinstimmt? hat eine Antwort von @mKoeppelmannmit einem Link zu EtherScrape , das versucht, Vertragsquellcode mit Bytecode abzugleichen, indem eine Musterabgleichstechnik verwendet wird, aber diese Site scheint nicht aktuell zu sein.



Ein paar Details

Es gibt zwei verschiedene Bytecodes, die vom Solidity-Compiler generiert werden:

  • Bytecode ist der Bytecode, der von der Transaktion ausgeführt wird, die den Vertrag in die Blockchain einfügt und einige Anweisungen zur Vertragsinitialisierung enthält.
  • Laufzeit-Bytecode ist der Vertragscode, der in die Blockchain eingefügt wird.

Die folgende Solidity-Ausgabe wurde aus dem einfachen contract Test {}Einstecken in Browser-solidity für verschiedene Versionen von Solidity generiert, und es gibt keinen Unterschied in der Ausgabe, was impliziert, dass im Bytecode keine Compiler-Versionsinformationen codiert sind:

  • Solidity-Version: 0.3.2-dd4300d5/.-Emscripten/clang/Interpreter (neueste Version auf der Website verfügbar):

    • Bytecode:6060604052600a8060106000396000f360606040526008565b00
    • Laufzeit-Bytecode:60606040526008565b00
    • Optcodes:PUSH1 0x60 PUSH1 0x40 MSTORE PUSH1 0xA DUP1 PUSH1 0x10 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN PUSH1 0x60 PUSH1 0x40 MSTORE PUSH1 0x8 JUMP JUMPDEST STOP
  • Solidity-Version: 0.3.0-11d67369/.-Emscripten/clang/Interpreter verlinkt auf libethereum-:

    • Bytecode:6060604052600a8060106000396000f360606040526008565b00
    • Laufzeit-Bytecode:60606040526008565b00
    • Optcodes:PUSH1 0x60 PUSH1 0x40 MSTORE PUSH1 0xA DUP1 PUSH1 0x10 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN PUSH1 0x60 PUSH1 0x40 MSTORE PUSH1 0x8 JUMP JUMPDEST STOP
  • Solidity-Version: 0.2.2-ef92f566/.-Emscripten/clang/int verlinkt auf libethereum-:

    • Bytecode:6060604052600a8060106000396000f360606040526008565b00
    • Laufzeit-Bytecode:60606040526008565b00
    • Optcodes:PUSH1 0x60 PUSH1 0x40 MSTORE PUSH1 0xA DUP1 PUSH1 0x10 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN PUSH1 0x60 PUSH1 0x40 MSTORE PUSH1 0x8 JUMP JUMPDEST STOP
  • Solidity-Version: 0.1.6-c881d103/.-Emscripten/clang/int verlinkt mit libethereum-1.1.0-c61302f2/.-Emscripten/clang/int:

    • Bytecode:6060604052600a8060106000396000f360606040526008565b00
    • Laufzeit-Bytecode:60606040526008565b00
    • Optcodes:PUSH1 0x60 PUSH1 0x40 MSTORE PUSH1 0xA DUP1 PUSH1 0x10 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN PUSH1 0x60 PUSH1 0x40 MSTORE PUSH1 0x8 JUMP JUMPDEST STOP
  • Solidity-Version: 0.3.2-0/Release-Linux/g++/Interpreter auf meinem Computer:

    • Bytecode:6060604052600a8060106000396000f360606040526008565b00
    • Laufzeit-Bytecode:60606040526008565b00
    • Optcodes:PUSH1 0x60 PUSH1 0x40 MSTORE PUSH1 0xA DUP1 PUSH1 0x10 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN PUSH1 0x60 PUSH1 0x40 MSTORE PUSH1 0x8 JUMP JUMPDEST STOP
Beim Lesen Ihrer Antwort kam mir eine Frage in den Sinn. BytecodeIst es möglich, das aus dem zu reproduzieren Runtime bytecode?