В прошлом уроке мы разобрали цепочку:
Solidity → компилятор → bytecode → EVM
Но написанный код ещё не является контрактом, существующим в блокчейне.
Чтобы сеть могла хранить и выполнять программу, её нужно скомпилировать и развернуть — deploy.
Шаг 1. Разработчик пишет Solidity-код
Сначала существует обычный исходный код.
Например:
1contract Guild {2 uint256 public members = 10;3}Это текст, понятный разработчику.
EVM не исполняет такой Solidity-код напрямую. Сначала его необходимо скомпилировать.
Шаг 2. Код компилируется
Компиляция — это преобразование исходного Solidity-кода в форму, которую понимает EVM.
Компилятор проверяет код и создаёт, среди прочего, bytecode.
Упрощённо:
Solidity → Compiler → Bytecode
Если в коде есть ошибка синтаксиса, например пропущена важная часть инструкции, компиляция может завершиться ошибкой.
В таком случае контракт ещё не отправляется в блокчейн.
Шаг 3. Появляется bytecode
Bytecode — набор низкоуровневых инструкций для EVM.
Он может выглядеть как длинная последовательность символов:
10x6080604052...Разработчику обычно не нужно писать или редактировать его вручную.
Главное понимать:
Solidity удобен человеку, bytecode предназначен для EVM.
Шаг 4. Отправляется deployment-транзакция
После успешной компиляции контракт можно развернуть — deploy.
Deployment выполняется с помощью специальной транзакции.
Она отправляет в сеть данные, необходимые для создания нового smart contract.
То есть deploy — это не просто сохранение файла.
Это настоящее действие в блокчейне:
Bytecode → Deployment transaction → Ethereum
Как и другие транзакции, deployment:
- подписывается;
- отправляется в сеть;
- требует выполнения;
- использует gas;
- может завершиться успешно или с ошибкой.
Шаг 5. Контракт получает адрес
После успешного deployment в блокчейне появляется новый экземпляр контракта.
У него есть собственный адрес.
Например:
10x8A3...F21По этому адресу можно найти контракт и взаимодействовать с ним.
Важно различать:
- адрес пользователя — представляет blockchain account;
- адрес контракта — указывает на размещённый smart contract.
Оба выглядят как Ethereum-адреса, но используются по-разному. Адрес контракта не является секретом.
Один код — несколько контрактов
Один и тот же Solidity-код можно развернуть несколько раз.
Например:
1Guild.sol2 ↓ deploy3Contract A: 0x111...4 ↓ deploy ещё раз5Contract B: 0x222...Это будут два отдельных контракта.
У каждого:
- свой адрес;
- своё состояние;
- свои сохранённые значения.
Даже если их код одинаковый.
Это похоже на создание нескольких независимых экземпляров одной программы.
После развёртывания пользователи и другие контракты могут взаимодействовать с новым адресом.
Например:
1Пользователь2 ↓3Транзакция4 ↓5Адрес контракта6 ↓7EVM выполняет функцию8 ↓9Состояние контракта меняетсяИменно с такими уже развёрнутыми контрактами работают blockchain-приложения.
Начальные данные и constructor
При создании контракта иногда нужно сразу установить начальные данные.
Для этого в Solidity существует специальная функция — constructor.
Например, контракт может при deployment сохранить адрес создателя или начальное значение.
Пока не нужно учить синтаксис constructor.
Важно только понимать:
constructor выполняется один раз — во время создания контракта.
Позже в основном Solidity-курсе мы разберём его подробнее.
Полный путь
Теперь жизненный цикл нового контракта можно представить так:
1Solidity-код2 ↓3Компиляция4 ↓5Bytecode6 ↓7Deployment transaction8 ↓9Выполнение EVM10 ↓11Новый smart contract12 ↓13Адрес контрактаПосле этого контракт существует в блокчейне и может принимать вызовы.
Compile превращает Solidity-код в bytecode.
Deploy создаёт новый контракт в блокчейне.
После успешного deployment контракт получает собственный адрес.
Один и тот же код можно развернуть несколько раз, и каждый экземпляр будет иметь отдельное состояние.
Задание
Соберите путь создания smart contract.
Расположите этапы в правильном порядке — от Solidity-кода разработчика до готового контракта с адресом в блокчейне.
Один из блоков описывает неверное действие.