¿Diferencia entre el binario de los contratos en hexadecimal y el código de bytes del contrato?

Uso el comando "solcjs --bin mycontract.sol" para obtener el "Binario de los contratos en hexadecimal" y se ve así:

ingrese la descripción de la imagen aquí

Puede usarse como un parámetro de evm en geth después del comando "evm --code".

Cuando uso Remix, obtengo el bytecode en JSON de mi contrato:

ingrese la descripción de la imagen aquí

Entonces, ¿cuáles son las diferencias entre el binario en hexadecimal y el código de bytes de un contrato? Para qué se usan ?

Respuestas (1)

Solc-JS no le muestra todas las salidas posibles del compilador de Solidity.

Si por el contrario instalas Solc directamente y ejecutas:

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

Obtendrá una salida similar a 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"
}

bines binario compilado del contrato, igual que la --binsalida de solcjs. Puede haber algunas diferencias según la versión del compilador, la configuración del compilador y los metadatos del contrato, pero de lo contrario, debería obtener una coincidencia exacta.

El binario también se puede representar mediante un conjunto de instrucciones más "legible por humanos" que se denomina opcode. El biny el opcodecontienen exactamente los mismos datos, simplemente analizados de dos maneras diferentes.

Estoy menos familiarizado con Source Mappings ( srcmap), pero parece que se usa principalmente para fines de análisis y depuración.

En última instancia, cuando implementa un contrato, solo binse usa. Las otras salidas de Remix están disponibles por conveniencia, pero en realidad no representan nada que suceda en la cadena de bloques.