Мы уже разобрались, что smart contract:
- существует в блокчейне;
- хранит состояние;
- принимает вызовы;
- выполняется EVM;
- может читать и изменять данные.
Теперь впервые посмотрим, как все эти идеи выглядят в настоящем Solidity-коде.
Не нужно сразу запоминать весь синтаксис. Цель этого урока — научиться смотреть на контракт и понимать его основные части.
Наш первый контракт
Рассмотрим небольшой пример:
1// SPDX-License-Identifier: MIT2pragma solidity ^0.8.0;34contract BuildersGuild {5 uint256 public guildScore = 100;67 function increaseScore() public {8 guildScore += 1;9 }10}Даже если вы никогда раньше не программировали, этот код уже можно разобрать на несколько понятных частей.
Лицензия и комментарий
Первая строка:
1// SPDX-License-Identifier: MITуказывает лицензию исходного кода.
// означает комментарий — текст для разработчиков и инструментов, который не выполняется как команда программы.
SPDX-строка помогает явно указать условия использования исходного кода. Для первых задач курса она уже будет добавлена автоматически.
Версия Solidity
Следующая строка:
1pragma solidity ^0.8.0;сообщает, с какими версиями компилятора Solidity должен работать исходный код.
Мы уже знаем, что перед deployment Solidity-код необходимо скомпилировать. pragma помогает компилятору понять, для какой версии языка написана программа.
Пока не нужно запоминать правила записи версий. В заданиях эта строка также будет подготовлена заранее.
Где начинается контракт
Дальше начинается сам smart contract:
1contract BuildersGuild {23}Ключевое слово contract сообщает Solidity: здесь начинается описание нового контракта. BuildersGuild — его имя.
Фигурные скобки { } показывают границы контракта. Всё состояние и логика нашей гильдии будут находиться внутри этих скобок.
Где хранится состояние
Внутри контракта находится строка:
1uint256 public guildScore = 100;Это state variable — переменная состояния. Такие переменные обычно объявляются на уровне контракта, вне функций. Они хранят данные, которые принадлежат контракту.
В данном случае:
uint256— тип данных;public— значение можно читать извне, но это не разрешение любому менять его;guildScore— имя переменной;100— начальное значение.
После deployment это значение становится частью состояния конкретного экземпляра контракта.
Где описано действие
Контракт может не только хранить данные, но и предоставлять действия. Например:
1function increaseScore() public {2 guildScore += 1;3}function объявляет функцию — действие, которое может выполнить контракт. Здесь функция называется increaseScore.
А её код guildScore += 1; увеличивает сохранённое значение на единицу.
Упрощённо:
1guildScore = 1002 ↓3increaseScore()4 ↓5guildScore = 101Если такое изменение выполняется в блокчейне, оно потребует транзакции — именно это мы разбирали в прошлом уроке. Не каждый вызов функции меняет состояние: бывают и функции только для чтения.
Структура всего файла
Теперь можно посмотреть на весь файл ещё раз:
1// SPDX-License-Identifier: MIT2pragma solidity ^0.8.0;34contract BuildersGuild {5 uint256 public guildScore = 100;67 function increaseScore() public {8 guildScore += 1;9 }10}У него есть несколько уровней:
1Файл Solidity2│3├── лицензия4├── версия Solidity5│6└── contract BuildersGuild7 │8 ├── состояние9 │ guildScore10 │11 └── функции12 increaseScore()Именно такую структуру вы будете видеть почти во всех следующих заданиях.
В Solidity символы имеют значение. Например, строка uint256 public guildScore = 100; заканчивается точкой с запятой ;. Она обозначает конец инструкции.
Фигурные скобки { } используются для обозначения содержимого контракта и функций. Ошибки вроде пропущенной ; или незакрытой } могут не позволить коду скомпилироваться.
Что будет в редакторе
Когда начнётся основной Solidity-курс, часть каркаса будет уже находиться в редакторе:
1// SPDX-License-Identifier: MIT2pragma solidity ^0.8.0;34contract BuildersGuild {5 // ваш код здесь6}В первых заданиях вам не придётся создавать весь файл с нуля. Мы будем добавлять новые элементы постепенно: сначала одну переменную, затем другие типы данных, функции, проверки, участников и более сложную логику.
Если перед вами Solidity-код, сначала попробуйте найти три вещи:
- 1.Как называется контракт? Ищите
contract .... - 2.Что он хранит? Ищите state variables внутри контракта.
- 3.Что он умеет делать? Ищите
function ....
Необязательно сразу понимать каждую строку. Сначала важно увидеть общую структуру программы.
Как части связаны с предыдущими уроками
Разработчик пишет Solidity-контракт: State + Functions + Rules.
Затем:
1Solidity2 ↓3Compile4 ↓5Bytecode6 ↓7Deploy8 ↓9Contract addressПосле deployment пользователь может читать состояние или отправлять транзакции, вызывать изменяющие функции и сохранять новое состояние.
Вам пока не нужно помнить весь синтаксис. Главное — научиться узнавать настройки компиляции, объявление контракта, state variables, функции и инструкции внутри функций.
Следующий шаг — писать код самому
До этого момента мы разбирались, как работают программы, блокчейн, транзакции и smart contracts.
Теперь вы уже знаете, что происходит вокруг Solidity-кода и из каких основных частей состоит контракт.
В основном курсе мы начнём собирать BuildersGuild самостоятельно — по одной конструкции за раз.
Задание
Соберите структуру первого Solidity-контракта.
Расположите основные элементы файла в том порядке, в котором они могут встретиться в нашем простом контракте. Один из блоков не относится к структуре Solidity-контракта.
Это порядок данного примера, а не требование размещать все state variables перед всеми functions в любом контракте.