Разница между двоичным кодом контрактов в шестнадцатеричном формате и байт-кодом контракта?

Я использую команду «solcjs --bin mycontract.sol», чтобы получить «двоичный файл контрактов в шестнадцатеричном формате», и это выглядит так:

введите описание изображения здесь

Его можно использовать как параметр evm в geth после команды "evm --code".

Когда я использую Remix, я получаю байт-код в JSON моего контракта:

введите описание изображения здесь

Итак, каковы различия между двоичным кодом в шестнадцатеричном формате и байт-кодом контракта? Для чего они используются?

Ответы (1)

Solc-JS не показывает вам все возможные выходные данные компилятора Solidity.

Если вместо этого вы устанавливаете Solc напрямую и запускаете:

solc --combined-json bin,opcodes,srcmap basic.sol

Вы получите вывод, похожий на Remix:

{
    "contracts": {
        "basic.sol:basic": {
            "bin": "60606040523415600e57600080fd5b60848061001c6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063448f30a3146044575b600080fd5b3415604e57600080fd5b60546056565b005b5600a165627a7a72305820d96f7bce11153f261332a16e2ff0d97fa63117029f5d89bc1bd337a45bf6c7dc0029",
            "opcodes": "PUSH1 0x60 PUSH1 0x40 MSTORE CALLVALUE ISZERO PUSH1 0xE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x84 DUP1 PUSH2 0x1C PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x60 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH1 0x3F JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP1 PUSH4 0x448F30A3 EQ PUSH1 0x44 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE ISZERO PUSH1 0x4E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x54 PUSH1 0x56 JUMP JUMPDEST STOP JUMPDEST JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xd9 PUSH16 0x7BCE11153F261332A16E2FF0D97FA631 OR MUL SWAP16 0x5d DUP10 0xbc SHL 0xd3 CALLDATACOPY LOG4 JUMPDEST 0xf6 0xc7 0xdc STOP 0x29 ",
            "srcmap": "28:53:0:-;;;;;;;;;;;;;;;;;"
        }
    },
    "sourceList": [
        "basic.sol"
    ],
    "version": "0.4.21+commit.dfe3193c.Windows.msvc"
}

binскомпилированный двоичный файл контракта, такой же, как --binвывод из solcjs. Могут быть некоторые различия в зависимости от версии компилятора, настроек компилятора и метаданных контракта, но в остальном вы должны получить точное совпадение.

Двоичный файл также может быть представлен более «удобочитаемым» набором инструкций, который называется файлом opcode. И binсодержат opcodeодни и те же данные, только проанализированные двумя разными способами.

Я менее знаком с Source Mappings ( srcmap), но похоже, что он в основном используется для целей анализа и отладки.

В конечном счете, при развертывании контракта binиспользуется только . Другие выходные данные Remix доступны для удобства, но на самом деле не представляют ничего, что происходит в блокчейне.