Начинаем с основ · урок 10

Анатомия Solidity-контракта

Познакомьтесь со структурой Solidity-файла и разберите, где объявляется контракт, где хранится состояние и где описываются действия.

Мы уже разобрались, что smart contract:

  • существует в блокчейне;
  • хранит состояние;
  • принимает вызовы;
  • выполняется EVM;
  • может читать и изменять данные.

Теперь впервые посмотрим, как все эти идеи выглядят в настоящем Solidity-коде.

Не нужно сразу запоминать весь синтаксис. Цель этого урока — научиться смотреть на контракт и понимать его основные части.

Наш первый контракт

Рассмотрим небольшой пример:

solidity
1// SPDX-License-Identifier: MIT
2pragma solidity ^0.8.0;
3
4contract BuildersGuild {
5 uint256 public guildScore = 100;
6
7 function increaseScore() public {
8 guildScore += 1;
9 }
10}

Даже если вы никогда раньше не программировали, этот код уже можно разобрать на несколько понятных частей.

Лицензия и комментарий

Первая строка:

solidity
1// SPDX-License-Identifier: MIT

указывает лицензию исходного кода.

// означает комментарий — текст для разработчиков и инструментов, который не выполняется как команда программы.

SPDX-строка помогает явно указать условия использования исходного кода. Для первых задач курса она уже будет добавлена автоматически.

Версия Solidity

Следующая строка:

solidity
1pragma solidity ^0.8.0;

сообщает, с какими версиями компилятора Solidity должен работать исходный код.

Мы уже знаем, что перед deployment Solidity-код необходимо скомпилировать. pragma помогает компилятору понять, для какой версии языка написана программа.

Пока не нужно запоминать правила записи версий. В заданиях эта строка также будет подготовлена заранее.

Где начинается контракт

Дальше начинается сам smart contract:

solidity
1contract BuildersGuild {
2
3}

Ключевое слово contract сообщает Solidity: здесь начинается описание нового контракта. BuildersGuild — его имя.

Фигурные скобки { } показывают границы контракта. Всё состояние и логика нашей гильдии будут находиться внутри этих скобок.

Где хранится состояние

Внутри контракта находится строка:

solidity
1uint256 public guildScore = 100;

Это state variable — переменная состояния. Такие переменные обычно объявляются на уровне контракта, вне функций. Они хранят данные, которые принадлежат контракту.

В данном случае:

  • uint256 — тип данных;
  • public — значение можно читать извне, но это не разрешение любому менять его;
  • guildScore — имя переменной;
  • 100 — начальное значение.

После deployment это значение становится частью состояния конкретного экземпляра контракта.

Где описано действие

Контракт может не только хранить данные, но и предоставлять действия. Например:

solidity
1function increaseScore() public {
2 guildScore += 1;
3}

function объявляет функцию — действие, которое может выполнить контракт. Здесь функция называется increaseScore.

А её код guildScore += 1; увеличивает сохранённое значение на единицу.

Упрощённо:

1guildScore = 100
2 ↓
3increaseScore()
4 ↓
5guildScore = 101

Если такое изменение выполняется в блокчейне, оно потребует транзакции — именно это мы разбирали в прошлом уроке. Не каждый вызов функции меняет состояние: бывают и функции только для чтения.

Структура всего файла

Теперь можно посмотреть на весь файл ещё раз:

solidity
1// SPDX-License-Identifier: MIT
2pragma solidity ^0.8.0;
3
4contract BuildersGuild {
5 uint256 public guildScore = 100;
6
7 function increaseScore() public {
8 guildScore += 1;
9 }
10}

У него есть несколько уровней:

1Файл Solidity
2│
3├── лицензия
4├── версия Solidity
5│
6└── contract BuildersGuild
7 │
8 ├── состояние
9 │ guildScore
10 │
11 └── функции
12 increaseScore()

Именно такую структуру вы будете видеть почти во всех следующих заданиях.

В Solidity символы имеют значение. Например, строка uint256 public guildScore = 100; заканчивается точкой с запятой ;. Она обозначает конец инструкции.

Фигурные скобки { } используются для обозначения содержимого контракта и функций. Ошибки вроде пропущенной ; или незакрытой } могут не позволить коду скомпилироваться.

Что будет в редакторе

Когда начнётся основной Solidity-курс, часть каркаса будет уже находиться в редакторе:

solidity
1// SPDX-License-Identifier: MIT
2pragma solidity ^0.8.0;
3
4contract BuildersGuild {
5 // ваш код здесь
6}

В первых заданиях вам не придётся создавать весь файл с нуля. Мы будем добавлять новые элементы постепенно: сначала одну переменную, затем другие типы данных, функции, проверки, участников и более сложную логику.

Если перед вами Solidity-код, сначала попробуйте найти три вещи:

  1. 1.Как называется контракт? Ищите contract ....
  2. 2.Что он хранит? Ищите state variables внутри контракта.
  3. 3.Что он умеет делать? Ищите function ....

Необязательно сразу понимать каждую строку. Сначала важно увидеть общую структуру программы.

Как части связаны с предыдущими уроками

Разработчик пишет Solidity-контракт: State + Functions + Rules.

Затем:

1Solidity
2 ↓
3Compile
4 ↓
5Bytecode
6 ↓
7Deploy
8 ↓
9Contract address

После deployment пользователь может читать состояние или отправлять транзакции, вызывать изменяющие функции и сохранять новое состояние.

Вам пока не нужно помнить весь синтаксис. Главное — научиться узнавать настройки компиляции, объявление контракта, state variables, функции и инструкции внутри функций.

Следующий шаг — писать код самому

До этого момента мы разбирались, как работают программы, блокчейн, транзакции и smart contracts.

Теперь вы уже знаете, что происходит вокруг Solidity-кода и из каких основных частей состоит контракт.

В основном курсе мы начнём собирать BuildersGuild самостоятельно — по одной конструкции за раз.

Задание

Соберите структуру первого Solidity-контракта.

Расположите основные элементы файла в том порядке, в котором они могут встретиться в нашем простом контракте. Один из блоков не относится к структуре Solidity-контракта.

Это порядок данного примера, а не требование размещать все state variables перед всеми functions в любом контракте.

Схема

Соберите структуру первого Solidity-контракта. Один блок относится к веб-интерфейсу.

Добавьте первый блок
Доступные блоки

Войдите, чтобы сохранить прохождение.