Есть ли способ определить, какая версия компилятора создала двоичный файл контракта?

Учитывая скомпилированный байт-код в блокчейне, есть ли способ определить, какая версия компилятора используется, чтобы проверить, соответствует ли исходный код байт-коду, без необходимости перебора всех доступных версий/выходных данных компилятора?

Обратите внимание, что это связано с ethereum.stackexchange.com/questions/2877/…

Ответы (1)

Нет , так как нет разницы в выводе байт-кода от простого contract Test {}подключаемого в Browser-solidity при использовании разных последних версий компилятора Solidity.

Существует некоторая информация о том, как http://etherchain.org сверяет исходный код контракта с байт-кодом контракта по адресу Как я могу проверить, соответствует ли контракт в блокчейне исходному коду? включая примечание о том, что:

соответствие, которое вы должны проверить, - это скомпилированный байт-код с данными tx создания контракта.

Это связано с тем, что байт-код, выполняемый транзакцией создания контракта, включает некоторый код инициализации контракта.


(Интересно) Вопрос Как проверить соответствие контракта на блокчейне исходному коду? имеет ответ @mKoeppelmannсо ссылкой на EtherScrape , который пытается сопоставить исходный код контракта с байт-кодом, используя некоторую технику сопоставления с образцом, но этот сайт не выглядит современным.



Некоторые детали

Компилятор Solidity генерирует два разных байт-кода:

  • Байт -код — это байт-код, выполняемый транзакцией, которая вставляет контракт в блокчейн и включает некоторые инструкции по инициализации контракта.
  • Байт-код времени выполнения — это код контракта, который вставляется в блокчейн.

Следующий вывод Solidity был сгенерирован из простого contract Test {}подключения к Browser-solidity для разных версий Solidity, и в выводе нет никакой разницы, что означает отсутствие информации о версии компилятора, закодированной в байт-коде:

  • Версия Solidity: 0.3.2-dd4300d5/.-Emscripten/clang/Interpreter (последняя версия доступна на сайте):

    • Байт-код:6060604052600a8060106000396000f360606040526008565b00
    • Байт-код времени выполнения:60606040526008565b00
    • Коды опций: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: 0.3.0-11d67369/.-Emscripten/clang/Interpreter, связанный с libethereum-:

    • Байт-код:6060604052600a8060106000396000f360606040526008565b00
    • Байт-код времени выполнения:60606040526008565b00
    • Коды опций: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: 0.2.2-ef92f566/.-Emscripten/clang/int связана с libethereum-:

    • Байт-код:6060604052600a8060106000396000f360606040526008565b00
    • Байт-код времени выполнения:60606040526008565b00
    • Коды опций: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: 0.1.6-c881d103/.-Emscripten/clang/int связана с libethereum-1.1.0-c61302f2/.-Emscripten/clang/int:

    • Байт-код:6060604052600a8060106000396000f360606040526008565b00
    • Байт-код времени выполнения:60606040526008565b00
    • Коды опций: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: 0.3.2-0/Release-Linux/g++/Interpreter на моем компьютере:

    • Байт-код:6060604052600a8060106000396000f360606040526008565b00
    • Байт-код времени выполнения:60606040526008565b00
    • Коды опций: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
Читая ваш ответ, у меня возник вопрос. Можно ли воспроизвести Bytecodeиз Runtime bytecode?