Гид по технологиям

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

6 min read Solidity Обновлено 21 Dec 2025
Первый смарт‑контракт на Solidity: шаг за шагом
Первый смарт‑контракт на Solidity: шаг за шагом

Ноутбук с отображённым кодом Solidity

Solidity — это язык программирования для написания смарт‑контрактов в сети Ethereum. Он статически типизирован и поддерживает объектно‑ориентированные конструкции. Язык использует семантическое версионирование в формате X.Y.Z: обычно патчи меняются в Z, несовместимые изменения — в Y.

Ниже вы найдёте минимальный практический пример и пошаговую инструкцию по созданию, компиляции и развёртыванию простого контракта. Также включены советы по безопасности, тесты и варианты инструментов, которые пригодятся при развитии DApp.

Чем удобна среда Remix

Remix — это веб‑IDE, предназначенная для написания, компиляции и отладки Solidity‑контрактов в браузере. Она особенно удобна для быстрого прототипирования и обучения: не требует локальной настройки блокчейн‑вузла и позволяет развёртывать контракты в локальной среде без комиссий.

Когда вы впервые откроете Remix, вы увидите стартовую страницу примерно как на изображении ниже.

Главная страница редактора Remix

Написание первого смарт‑контракта

  1. В панели File Explorers нажмите Create New File (иконка листа бумаги с завернутым уголком). Назовите файл helloWorld.sol — расширение .sol указывает на код Solidity.
  2. Скопируйте и вставьте следующий код в новый файл. После кода следует подробное объяснение каждой строки.
// 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

  1. Нажмите кнопку Solidity compiler в левом меню. При наведении курсора появится подсказка с названием кнопки.

Кнопка компилятора Solidity

  1. Нажмите Compile helloWorld.sol. Если компилятор не выдаёт ошибок, контракт готов к развёртыванию.

Компиляция файла helloWorld.sol в Remix

  1. Перейдите в раздел Deploy & run transactions, убедитесь, что имя контракта отображается правильно, и нажмите Deploy. В локальной среде Remix развёртывание выполнится без сетевых комиссий.

Развернуть и запустить смарт-контракт в Remix

Что делать дальше: создание DApp на Ethereum

После того как вы умеете писать и развёртывать смарт‑контракты, следующим шагом станет интеграция контракта с фронтендом для создания DApp — децентрализованного приложения, работающее через P2P‑сеть Ethereum. Интерфейс DApp может вызывать функции контракта и отображать состояние блокчейна пользователю.

Альтернативы и инструменты для разработки

  • Hardhat — локальная среда разработки, скрипты компиляции/тестов, плагинная архитектура. Подходит для более сложных проектов.
  • Truffle — набор инструментов для компиляции, миграций и тестирования контрактов.
  • Visual Studio Code + расширение Solidity — удобно для разработчиков, предпочитающих локальную среду.
  • Ganache — локальная тестовая сеть для быстрого развёртывания и тестирования.

Каждый инструмент подходит для разных стадий: Remix — быстрое прототипирование, Hardhat/Truffle — CI/CD и автоматизированные тесты.

Мини‑методология: от идеи до DApp (шаги)

  1. Спланировать логику контракта и границы ответственности (какие данные хранятся на цепочке, какие — вне её).
  2. Написать минимальный контракт в Remix или локально (helloWorld для начала).
  3. Скомпилировать и запустить в локальной среде (Remix/ganache/hardhat network).
  4. Написать модульные тесты (используйте JavaScript/TypeScript + Mocha/Chai с Hardhat/Truffle).
  5. Провести аудит критичных функций (внешние вызовы, управление правами, обработка средств).
  6. Развернуть на тестнете (Goerli, Sepolia и т. п.), затем — на основномnet после валидации.
  7. Интегрировать фронтенд (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.

Примечание: перед развёртыванием в основной сети проведите независимый аудит критичных контрактов и внимательно проверьте настройки компилятора и зависимости.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

TRANSLATE и DETECTLANGUAGE в Excel — руководство
Excel

TRANSLATE и DETECTLANGUAGE в Excel — руководство

Самоподписанный SSL на IIS — создание и развёртывание
Инфраструктура

Самоподписанный SSL на IIS — создание и развёртывание

Настройка интерфейса Gmail — подсказки и шаги
Gmail

Настройка интерфейса Gmail — подсказки и шаги

Генеративный ИИ в Google Поиске: как попасть в список
Поиск

Генеративный ИИ в Google Поиске: как попасть в список

Многозадачность iPad в iOS 11
iPad

Многозадачность iPad в iOS 11

Создание элементов с помощью jQuery
Веб-разработка

Создание элементов с помощью jQuery