Как написать и развернуть первый смарт‑контракт на Solidity

Solidity — это язык программирования для написания смарт‑контрактов в сети Ethereum. Он статически типизирован и поддерживает объектно‑ориентированные конструкции. Язык использует семантическое версионирование в формате X.Y.Z: обычно патчи меняются в Z, несовместимые изменения — в Y.
Ниже вы найдёте минимальный практический пример и пошаговую инструкцию по созданию, компиляции и развёртыванию простого контракта. Также включены советы по безопасности, тесты и варианты инструментов, которые пригодятся при развитии DApp.
Чем удобна среда Remix
Remix — это веб‑IDE, предназначенная для написания, компиляции и отладки Solidity‑контрактов в браузере. Она особенно удобна для быстрого прототипирования и обучения: не требует локальной настройки блокчейн‑вузла и позволяет развёртывать контракты в локальной среде без комиссий.
Когда вы впервые откроете Remix, вы увидите стартовую страницу примерно как на изображении ниже.
Написание первого смарт‑контракта
- В панели File Explorers нажмите Create New File (иконка листа бумаги с завернутым уголком). Назовите файл helloWorld.sol — расширение .sol указывает на код Solidity.
- Скопируйте и вставьте следующий код в новый файл. После кода следует подробное объяснение каждой строки.
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.1;
contract FirstContract {
uint var1;
function set(uint x) public {
var1 = x;
}
function get() public view returns (uint) {
return var1;
}
}Краткие пояснения:
- Первая строка указывает лицензию (SPDX). В примере используется GPL‑3.0; при желании её можно заменить на MIT или другую совместимую лицензию.
- Директива pragma сообщает компилятору, какие версии Solidity допустимы. Запись ^0.8.1 означает: принимать версии от 0.8.1 (включительно) до, но не включая, 0.9.0. Это помогает избежать проблем совместимости с новыми несовместимыми версиями.
- Ключевое слово contract похоже на class в других ООП‑языках. Контракт содержит состояния (state variables) и функции.
- var1 — это беззнаковое целое типа uint, хранящее состояние контракта.
- set и get — простые setter/getter функции. Ключевое слово public делает их доступными для вызова извне.
Важно: в Solidity версии 0.8.x арифметические переполнения уже обрабатываются встроенно — это одна из серьёзных перемен по сравнению с ранними версиями.
Компиляция и развёртывание в Remix
- Нажмите кнопку Solidity compiler в левом меню. При наведении курсора появится подсказка с названием кнопки.
- Нажмите Compile helloWorld.sol. Если компилятор не выдаёт ошибок, контракт готов к развёртыванию.
- Перейдите в раздел Deploy & run transactions, убедитесь, что имя контракта отображается правильно, и нажмите Deploy. В локальной среде Remix развёртывание выполнится без сетевых комиссий.
Что делать дальше: создание DApp на Ethereum
После того как вы умеете писать и развёртывать смарт‑контракты, следующим шагом станет интеграция контракта с фронтендом для создания DApp — децентрализованного приложения, работающее через P2P‑сеть Ethereum. Интерфейс DApp может вызывать функции контракта и отображать состояние блокчейна пользователю.
Альтернативы и инструменты для разработки
- Hardhat — локальная среда разработки, скрипты компиляции/тестов, плагинная архитектура. Подходит для более сложных проектов.
- Truffle — набор инструментов для компиляции, миграций и тестирования контрактов.
- Visual Studio Code + расширение Solidity — удобно для разработчиков, предпочитающих локальную среду.
- Ganache — локальная тестовая сеть для быстрого развёртывания и тестирования.
Каждый инструмент подходит для разных стадий: Remix — быстрое прототипирование, Hardhat/Truffle — CI/CD и автоматизированные тесты.
Мини‑методология: от идеи до DApp (шаги)
- Спланировать логику контракта и границы ответственности (какие данные хранятся на цепочке, какие — вне её).
- Написать минимальный контракт в Remix или локально (helloWorld для начала).
- Скомпилировать и запустить в локальной среде (Remix/ganache/hardhat network).
- Написать модульные тесты (используйте JavaScript/TypeScript + Mocha/Chai с Hardhat/Truffle).
- Провести аудит критичных функций (внешние вызовы, управление правами, обработка средств).
- Развернуть на тестнете (Goerli, Sepolia и т. п.), затем — на основномnet после валидации.
- Интегрировать фронтенд (web3.js, ethers.js) и подготовить UX для взаимодействия с пользователем.
Контроль качества: тесты и критерии приёмки
Примеры тестов для контракта FirstContract:
- set присваивает значение: вызов set(42) → get() возвращает 42.
- Границы: присвоение 0 и максимально ожидаемого значения (в рамках uint).
- Проверка видимости: убедиться, что функции public доступны извне.
- Регрессионные тесты при обновлении компилятора.
Критерии приёмки:
- Контракт компилируется без ошибок в заявленной версии pragma.
- Набор модульных тестов пройден локально и на CI.
- Развёртывание на тестнете успешно, базовые вызовы работают как ожидается.
Контроль безопасности и лучшие практики
- По возможности делайте переменные приватными и предоставляйте контролируемые геттеры/сеттера.
- Используйте механизмы контроля доступа (modifier, Ownable из OpenZeppelin) для критичных функций.
- Помните о reentrancy — защищайте функции, изменяющие баланс, шаблоном checks‑effects‑interactions или ReentrancyGuard.
- Используйте OpenZeppelin‑библиотеки для стандартных паттернов (ERC, Ownable, SafeMath не обязателен в 0.8+, но библиотеки остаются полезными).
- Проводите аудит кода перед развёртыванием на mainnet.
Советы по совместимости и миграции версий Solidity
- Версии 0.8.x внесли важные изменения (встроенные проверки переполнения). При переходе с 0.7.x или ниже проверьте части кода, где ожидалось поведение wraparound.
- Зафиксируйте версиями компилятора в CI/CD, чтобы избежать неожиданного принятия новых мажорных версий.
Ментальные модели и эвристики
- «Контракт как база данных + API»: контракт хранит состояние и предоставляет функции для чтения/записи.
- «Каждый вызов — платная операция»: воздействие на состояние требует газа, поэтому оптимизируйте операции, которые изменяют state.
- «Публичный ≠ безопасный»: публичная видимость означает доступ, но не авторизацию.
Ролевые чек‑листы
Разработчик:
- Написал контракт и простые тесты.
- Проверил компиляцию в целевой версии.
- Оптимизировал критичные по газу участки.
Аудитор/ревьювер:
- Проверил возможные векторные атаки (reentrancy, overflow, access control).
- Проверил использование сторонних библиотек и их версии.
DevOps/релиз-инженер:
- Закрепил версию компилятора в CI.
- Настроил пайплайн для тестнета и продакшн‑развёртывания.
Быстрый глоссарий (1 строка)
- Solidity — язык для контрактов Ethereum.
- Pragma — директива компилятора, задаёт допустимые версии.
- Contract — эквивалент класса, хранит состояние и функции.
- State variable — переменная, сохраняемая в блокчейне.
- Gas — плата за выполнение операций в Ethereum.
- DApp — децентрализованное приложение, использующее блокчейн.
Когда этот подход не подходит
- Для сложных систем с множеством контрактов и интеграций лучше использовать локальные фреймворки (Hardhat/Truffle) и CI, а не только Remix.
- Для приложений, где приватность данных критична, стоит рассмотреть приватные блокчейны или L2‑решения с шифрованием.
Итог
В этом руководстве вы научились: создать файл .sol в Remix, написать минимальный контракт, понять pragma и лицензию, скомпилировать и развернуть контракт локально. Дальше — покрывайте код тестами, проводите аудит и интегрируйте контракт с фронтендом, чтобы получить полноценный DApp.
Примечание: перед развёртыванием в основной сети проведите независимый аудит критичных контрактов и внимательно проверьте настройки компилятора и зависимости.
Похожие материалы
TRANSLATE и DETECTLANGUAGE в Excel — руководство
Самоподписанный SSL на IIS — создание и развёртывание
Настройка интерфейса Gmail — подсказки и шаги
Генеративный ИИ в Google Поиске: как попасть в список
Многозадачность iPad в iOS 11