Учитывая скомпилированный байт-код в блокчейне, есть ли способ определить, какая версия компилятора используется, чтобы проверить, соответствует ли исходный код байт-коду, без необходимости перебора всех доступных версий/выходных данных компилятора?
Нет , так как нет разницы в выводе байт-кода от простого 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
?
Борцмейер