Как сделать смарт-контракт: пошаговое руководство (Solidity, Ethereum)

Как сделать смарт-контракт: пошаговое руководство (Solidity, Ethereum)

Для того, чтобы создать смарт-контракт, сначала его логику надо описать на одном из языков программирования (например, на Solidity), потом скомпилировать код, протестировать его в тестовой сети и запустить в блокчейне (например, на сети Ethereum). Чтобы создать первый смарт-контракт, проще всего воспользоваться браузерной средой Remix IDE и кошельком MetaMask — никаких дополнительных приложений устанавливать не потребуется.

Давайте разберём весь этот процесс в деталях, от момента появления идеи и выбора платформы до создания смарт-контракта и его запуска.

Что такое смарт-контракт простыми словами

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

Данная терминология происходит из английского языка: smart contract. Такие смарт контракты ещё в девяностых годах были описаны криптографом Ником Сабо. Массовое использование смарт-контрактов стало возможным только с появлением блокчейна Ethereum, поддерживающего программируемый код.

Смарт-контракт имеет три основных характеристики. В первую очередь, он является децентрализованным: вместо выполнения на одном сервере он выполняется сетью узлов. Также он является прозрачным — код и результаты его выполнения доступны для всего сообщества участников. Кроме того, он является неизменяемым, и его правила нельзя переписать задним числом.

Физическое выполнение программы осуществляется одновременно на всех узлах сети: на каждом узле исполняется одна и та же программа до получения одного результата. Такое дублирование и приводит к столь высокой предсказуемости — подменить результат в одиночку не получится.

Другими словами, блокчейн и смарт контракты взаимодействуют вместе, когда блокчейн предоставляет непрерывное хранилище данных и саму сеть для выполнения, а смарт контракт — свои правила. Именно поэтому смарт контракт и блокчейн часто используются совместно, за связкой «смарт контракт блокчейн» стоит довольно простая концепция: правила находятся в распределённой сети и выполняются автоматически. В смарт контрактах договор не устный, ведь то, что не обозначено в коде, не выполнится.

Как работают смарт-контракты

Каждая операция с контрактом — это транзакция в блокчейне. Запускается функция пользователем или другими контрактами, проверяются условия и, если всё в порядке, меняются данные в блокчейне. Результат такой транзакции виден всем и его невозможно подделать.

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

Благодаря такому подходу можно автоматизировать процессы, требующие посредника и основанные на взаимном доверии: выпуска токенов, обмена активов, выплаты денег и пр. Автоматизация здесь заложена в самой сети, а не в добросовестности одной из сторон.

Что понадобится, чтобы создать смарт-контракт

Что понадобится, чтобы создать смарт-контракт

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

  •       Язык программирования. В Ethereum стандартом является язык Solidity, однако существуют и альтернативы, такие как Vyper.
  •       Интегрированная среда разработки (IDE). Самый доступный вариант для начинающих — это Remix IDE, работающая через браузер.
  •       Кошелек. MetaMask хранит ваш адрес (address) и отвечает за подписи транзакций в процессе развертывания.
  •       Минимальное количество монет для тестирования. Крошечное количество тестовых ETH (через faucet).

Газ — это стоимость вычислений в сети. В тестовой сети оплату газа покрывают тестовые монеты, полученные через faucet, а в основной сети — реальный ETH. Именно поэтому все дальнейшие эксперименты стоит проводить в тестовой сети, где цена ошибки равна нулю.

Самые опытные разработчики переходят на использование локальных фреймворков, ранее популярным среди которых был Truffle, сейчас же его поддержка прекращена, и большинство команд предпочитают использовать Hardhat и Foundry. Для начального этапа разработки все это вовсе не требуется, достаточно будет одной Remix.

Шаг 1. Определение цели смарт-контракта

Сначала определите задачу, которую решает контракт, и на этом этапе построение дальнейшей архитектуры будет зависеть исключительно от нее. Разные ситуации — токены, голосование в DAO, простое хранение данных, эскроу сделки — требуют своего уникального подхода.

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

Шаг 2. Определение блокчейна и языка программирования

Само собой, начинают работу большинство новичков со смарт-контрактов на блокчейне Ethereum и с языком программирования на нём — в данном случае Solidity. В экосистеме блокчейна Ethereum есть самая развитая документация, множество различных библиотек и инструментов. Язык Solidity — фактически стандарт отрасли при написании смарт-контрактов на Ethereum.

Кроме того, существует множество других блокчейнов, совместимых с системой Ethereum (вроде BNB Chain или Polygon). Смарт-контракт, написанный на Solidity, можно развернуть на любом из этих блокчейнов с минимальными изменениями кода, так как они все поддерживают одну и ту же виртуальную машину — EVM.

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

Написание кода смарт-контракта

Шаг 3. Написание кода смарт-контракта

Теперь самое интересное — написание кода смарт-контракта. Разберём минимальный пример на Solidity: контракт, который хранит одно число и умеет его читать и обновлять.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract SimpleStorage {
	uint256 private value;

	function set(uint256 newValue) public {
    	value = newValue;
	}

	function get() public view returns (uint256) {
    	return value;
    }
} 

 

Давайте рассмотрим код построчно. Программный комментарий с пометкой MIT указывает на использование определённой лицензии. Строка pragma solidity устанавливает версию компилятора. Затем следует ключевое слово contract и название контракта — SimpleStorage.

Внутри объявлена переменная value типа uint256 (целое беззнаковое число). Метод set с модификатором public устанавливает значение переменной, а метод get (public view returns) лишь считывает данные и возвращает значение через return. Ключевое слово public означает возможность вызова функции извне.

Чтобы не начинать каждый проект с нуля, при разработке для типовых задач используют проверенные шаблоны. Набор функциональности из библиотеки OpenZeppelin предоставляет уже разработанные безопасные контракты, такие как стандартный токен ERC-20 или NFT. Так работа выполняется быстрее и с минимальными рисками уязвимостей кода.

 

Нужен готовый смарт-контракт без ошибок и с проверкой безопасности?

Тогда специалисты команды Nomium спроектируют, разработают, протестируют и внедрят смарт-контракт под ваши требования — от токенов и NFT до логики децентрализованных финансов. Сообщите о вашем проекте, и мы предложим вам вариант решения.

Расскажите про ваш проект →

Шаг 4. Компиляция и тестирование смарт-контракта

Компиляция нужна для готового кода. Компиляция конвертирует программу, написанную на языке Solidity, в байт-код, который будет понятен для Ethereum Virtual Machine. Для этой цели в Remix существует всего одна кнопка, а в случае возникновения ошибок компилятор даст знать, в какой строке их следует искать.

Далее нужно провести тестирование. Лучше всего выполнить несколько уровней тестирования — юнит-тестирование отдельных функций, проверку на некорректные данные и работу контракта в целом. Сначала протестируйте локальную логику работы, а потом выложите контракт в тестовую сеть, до того как он появится в основной сети. Как правило, тестовые сети Ethereum работают точно так же, как сам Ethereum, только монеты, которые здесь используются, бесплатны.

Обратите внимание на то, что список актуальных на данный момент тестовых сетей Ethereum постоянно обновляется. Так что перед тем как начать работу, стоит убедиться в том, какая testnet актуальна в данный момент. Это главный способ защиты от возможных ошибок до выпуска в mainnet.

Шаг 5. Развертывание смарт-контракта

Развертывание — это публикация смарт-контракта в блокчейне. В Remix выберите нужную сеть, подключите MetaMask и нажмите Deploy. Кошелек запросит ваше согласие для совершения транзакции и списания газа за развертывание.

Логичным было бы сперва развернуть смарт-контракт в тестовой сети и проверить, что всё работает корректно, а затем уже развернуть смарт-контракт в основной сети, где уже будут списываться реальные ETH за газ. С этого момента смарт-контракт будет работать в системе блокчейн и станет доступен другим пользователям и контрактам.

После развертывания следует верифицировать смарт-контракт в обозревателе блокчейна, к примеру Etherscan. Верификация позволит опубликовать исходный код и даст возможность любому проверить, что программное обеспечение делает именно то, что от него требуется. Это повышает уровень доверия к программе и облегчает взаимодействие с ней через веб-интерфейс.

Процесс развертывания в основном блокчейне требует реальной платы, поэтому торопиться не стоит. Развертывать смарт-контракт в основной сети и выпускать его в свет можно только после всех проверок.

Шаг 6. Поддержка, безопасность и обновление

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

До выпуска в основную сеть серьёзные проекты делают аудит — независимую проверку кода на наличие уязвимостей. При необходимости обновления смарт-контракта ещё на этапе его создания используют шаблоны (прокси-контракты), которые позволяют менять логику контракта, не меняя данных.

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

Можно ли создать смарт-контракт без программирования

Есть конструкторы смарт-контрактов, а также no-code платформы, создающие типовой контракт (токен и прочие) по шаблону и не требующие написания кода вручную.

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

Сфера применения смарт-контрактов

Сфера применения смарт-контрактов

Смарт-контракты являются фундаментом целых направлений блокчейн-индустрии:

  •       Токены и NFT. Создание, выпуск и передача цифровых активов и токенов;
  •       Децентрализованные финансы (DeFi) — кредитование, обмен и стейкинг без банков;
  •       Управление (DAO) — голосования и распределение казны сообщества;
  •       Логистика и страхование — автоматические выплаты по заранее определённым условиям.

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

Ошибки при разработке смарт-контракта

Исходя из собственного опыта, начинающие разработчики делают одни и те же типичные ошибки:

  •       Не проводят тестирование. Код работает вроде бы исправно, однако сюрпризы обнаруживаются в процессе тестирования в тестовой сети.
  •       Разворачивают сразу в mainnet. Из-за спешки ошибка обходится в реальные деньги.
  •       Забывают о защищённости. Безопасность легко потерять, если писать всё с нуля вместо проверенных библиотек.
  •       Перегружают код избыточной логикой. Чем больше кода, тем больше шансов на ошибки и тем дороже операции по расходу газа.

Если следовать простому правилу: сначала тестирование, потом проверка кода и только после этого развертывание в mainnet — это значительно уменьшит число ошибок. Этот подход сэкономит время и деньги.

Часто задаваемые вопросы (FAQ)

Что такое смарт-контракт простыми словами?

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

На каких языках пишут смарт-контракты?

Основной язык для Ethereum и для сетей, совместимых с ним, — это Solidity. Реже используется Vyper. Для других блокчейнов используются другие языки, такие как Rust. Для новичков удобнее всего начать с Solidity.

Сколько стоит создание смарт-контракта?

Стоимость формируется из двух составляющих — платы за газ при деплое в блокчейн и разработки. Тестирование контрактов в тестовой сети бесплатно, а деплой в mainnet и заказная разработка контракта со сложной логикой стоят дороже. Конкретная стоимость зависит от цели и загруженности сети.

Можно ли сделать смарт-контракт без навыков программирования?

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

Можно ли переписать смарт-контракт после развертывания?

Нельзя — код в блокчейне неизменяем. Правда, обновление кода возможно только в том случае, если оно предусмотрено изначально при помощи прокси-контрактов.

Как сделать смарт-контракт безопасным?

Использовать проверенные библиотеки (например, OpenZeppelin), внимательно тестировать контракт в тестовой сети и проводить независимую экспертизу кода перед запуском в основной сети.

Когда используются смарт-контракты?

В токенах и NFT, децентрализованном финансовом секторе (DeFi), DAO, логистике, страховании и во многих других областях, где требуется автоматизация без посредников.

Сколько времени уходит на разработку смарт-контракта?

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

Поделиться

Скопировать ссылку Ссылка скопирована!

Оцени эту статью!

Оставьте свой комментарий

Отправить Нажимая на кнопку «Отправить» Вы даете свое согласие на обработку персональных данных и соглашаетесь с политикой конфинденциальности