¿Cuál es la diferencia entre el código de bytes bin de solc y el tiempo de ejecución bin?

Solc dice que bin-runtimees la parte de tiempo de ejecución de los contratos . ¿Qué es exactamente la runtimeparte del código de bytes y en qué se diferencia de binla salida del código de bytes?

Respuestas (1)

TL;RD

bin-runtimees el código que realmente se coloca en la cadena de bloques. La salida regular bines el código colocado en la cadena de bloques más el código necesario para colocar este código en la cadena de bloques, el código del constructor.

Respuesta más larga

Los conceptos básicos de la máquina virtual de Ethereum se definen en la Sección 9.1 del Libro amarillo de Ethereum .

Para responder completamente a esta pregunta, primero debe saber cómo se crea un contrato inteligente. Un contrato inteligente se crea enviando una transacción con un campo "para" vacío. Cuando se hace esto, la máquina virtual de Ethereum (EVM) ejecuta el código de bytes que se establece en la matriz de bytes de inicio [1], que es un campo que puede contener el código de bytes de EVM, el código binario para ejecutar la lógica en Ethereum. El código de bytes de EVM que luego se almacena en la cadena de bloques es el valor que se devuelve al ejecutar el contenido de init en EVM. El código de bytes puede referirse a sí mismo a través del código de operación CODECOPY. Esto transfiere el bytecode actualmente en ejecución a la memoria EVM. losCODECOPYopcode lee tres valores en la pila donde dos de esos valores son punteros al código de bytes, uno que marca el comienzo y otro que marca el final de lo que debe copiarse en la memoria. Luego se usa el RETURNcódigo de operación, junto con los valores correctos colocados en la pila, para devolver el código de bytes de la ejecución inicial del código EVM. RETURNlee y elimina dos punteros de la pila. Estos punteros definen la parte de la memoria que es un valor de retorno. El valor de retorno de la ejecución inicial de creación del contrato del código de bytes define el código de bytes que se almacena en la cadena de bloques y se asocia con la dirección en la que ha creado el contrato inteligente.

El código que se compila pero no se almacena en la cadena de bloques es, por lo tanto, el código necesario para almacenar el código correcto en la cadena de bloques, pero también cualquier lógica que esté contenida en un constructor (potencial) del contrato.

El argumento bin-runtime se puede usar para verificar que algún código fuente específico de Solidity se coloque en una dirección específica. Compilar el código fuente que una persona afirma que representa el contrato inteligente en una dirección en la cadena de bloques y compararlo con el código binario que realmente está almacenado en la dirección eth.getCode(contractaddress)significa que puede estar seguro de cuál es el código fuente del contrato.

Consulte el Libro amarillo de Ethereum, sección 4.3 para conocer cómo se crean los contratos inteligentes.