Байт код 42 - demonoved/A-trial-run-in-solidity GitHub Wiki

// SPDX-License-Identifier: MIT
// compiler version must be greater than or equal to 0.8.20 and less than 0.9.0
pragma solidity ^0.8.23;
contract Factory {
    event Log(address addr);
    //развертываем контракт который всегда возвращает 42
    function deploy() external {
        bytes memory bytecode = hex"69602a60005260206000f3600052600a6016f3";
        address addr;
        assembly {
            // создаем ( value, offset, size)
            addr := create(0,add(bytecode, 0x20), 0x13)
        }
        require(addr != address(0));
    }
}
interface IContract {
    function getMeaningOfLife() external view returns (uint);
}
// https://www.evm.codes/playground
/*
Run time code - return 42
602a60005260206000f3

// Store 42 to memory
mstore(p, v) - store v at memory p to p + 32

PUSH1 0x2a
PUSH1 0
MSTORE

// Return 32 bytes from memory
return(p, s) - end execution and return data from memory p to p + s

PUSH1 0x20
PUSH1 0
RETURN

Creation code - return runtime code
69602a60005260206000f3600052600a6016f3

// Store run time code to memory
PUSH10 0X602a60005260206000f3
PUSH1 0
MSTORE

// Return 10 bytes from memory starting at offset 22
PUSH1 0x0a
PUSH1 0x16
RETURN
*/

Solidity Contract: Factory

  • Присутствует спецификация лицензирования SPDX, используемая для указания лицензии, под которой опубликован исходный код.
  • Указывает требуемую версию компилятора Solidity как ^0.8.23.
  • Определен контракт под названием Factory.
  • В контракте Factory описана функция deploy, которая будет высылать на execution создание нового контракта с использованием inline assembly.
  • Эвент Log здесь объявлен, но нигде не используется.

Встроенный Inline Assembly:

  • Внутри функции deploy, inline assembly используется для развертывания нового контракта.
  • bytecode является шестнадцатеричным представлением байткода, который будет частью создаваемого контракта.
  • Используется инструкция create для создания нового контракта с помощью встроенного байткода и проверяется, что адрес созданного контракта не равен нулевому адресу (что означало бы, что создание контракта не удалось).

Interface: IContract

  • Объявлен интерфейс IContract с функцией getMeaningOfLife, ожидается, что контракт, созданный Factory, реализует эту функцию, но из предоставленного мы не привели реализацию интерфейса, так что это просто определение.

EVM Байткод и Комментарии:

  • Байткод, написанный в шестнадцатеричной форме, представляет собой простую программу, которая сохраняет число 42 в память и затем возвращает это значение при вызове.
  • Создание байткода включает инструкции для сохранения исполняемого байткода контракта в памяти, а затем возвращает этот код, когда контракт создается.
  • Также приведена ссылка на EVM playground, где можно было бы проверить этот код в изолированной среде.

Итог:

Контракт Factory, как задумано, может использоваться для создания других контрактов, которые возвращают число 42.