Введение в Ethereum. Смарт-контракты

Ethereum стал доказательством концепции для будущего веб-коммуникаций, главным образом благодаря своей основной функции — смарт-контракту. Объяснение того, как это работает.

Ethereum Sphere as a Crystal
Visualisation an abstract concept of Ethereum smart contracts

Что такое Ethereum?

В первую очередь, Ethereum — это платформа для создания децентрализованных онлайн-сервисов, работающих на основе технологии блокчейн. Во вторую очередь — это криптовалюта. Главное отличие между Ethereum и, например, Bitcoin — это смарт-контракты. Они позволяют программировать внутри блокчейна. Это позволяет интегрировать более сложные механизмы в Ethereum, такие как NFT.

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

Смарт-контракты

По сути, контракт — это текстовый файл с кодом, написанным на языке программирования Solidity. Он предоставляет определённый API в виде функций и триггеров, которые могут использоваться внутри смарт-контракта.

Логика выполнения смарт-контрактов в Ethereum

Выполнение контракта в Ethereum происходит в нескольких этапах:

  1. Создание транзакции

    Всё начинается с создания и отправки транзакции пользователем. Эта транзакция содержит инструкции для вызова функций смарт-контракта и может включать данные и ETH для передачи в контракт.

  2. Распространение транзакции

    Отправленная транзакция распространяется по сети узлов Ethereum. Она ожидает в пуле транзакций, пока майнер (или валидатор в PoS) не выберет её для включения в новый блок.

  3. Обработка транзакции майнерами

    Майнер выбирает транзакцию из пула и начинает обработку. Это включает проверку подлинности транзакции (подпись) и достаточности средств для оплаты газа.

  4. Выполнение контракта

    После проверки майнер (или валидатор) выполняет код смарт-контракта. Это происходит в Ethereum Virtual Machine (EVM) — изолированной среде, где каждая операция стоит определённое количество газа.

  5. Изменение состояния

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

  6. Подтверждение блока

    После завершения формирования блока с транзакциями майнер распространяет этот блок по сети. Другие узлы проверяют блок и, при успешной верификации, добавляют его в свою копию блокчейна.

  7. Оплата газа

    Пользователь, отправивший транзакцию, оплачивает комиссию за газ в ETH. Эта комиссия поступает майнеру (или валидатору) в качестве вознаграждения за обработку транзакции и поддержку сети.

  8. Финализация

    После подтверждения блока транзакция и все её результаты (включая выполнение контракта) считаются окончательными и необратимыми.

Кто оплачивает вычисления смарт-контрактов

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

Что влияет на комиссию за газ?

Комиссия за газ зависит от нескольких факторов:

  1. Сложность вычислений

    Более сложные операции требуют больше вычислительных ресурсов и, следовательно, стоят дороже.

  2. Загруженность сети

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

  3. Лимит газа

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

Майнеры или валидаторы (в зависимости от используемого консенсуса — Proof of Work или Proof of Stake) выбирают транзакции с более высокими комиссиями за газ, поскольку это увеличивает их доход. Эти комиссии служат стимулом для поддержания работы сети Ethereum.

Какие функции доступны в контракте

Смарт-контракты в Ethereum могут выполнять широкий спектр вычислений, но существуют определённые ограничения и особенности:

  1. Тьюринг-полнота

    Языки программирования смарт-контрактов, такие как Solidity и Vyper, являются тьюринг-полными, что теоретически позволяет выполнять любые вычисления, подобные обычным языкам программирования.

  2. Ограниченные ресурсы

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

  3. Детерминированность

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

  4. Отсутствие внешних сетевых запросов

    Смарт-контракты не могут напрямую обращаться к внешним серверам или API. Для получения внешних данных используются оракулы.

  5. Хранение данных

    Контракты могут хранить данные в своём состоянии, но из-за стоимости газа хранение больших объёмов данных может быть дорогостоящим.

  6. Математические и логические операции

    Контракты могут выполнять различные математические и логические операции, управлять потоком исполнения (циклы, условные конструкции), создавать и взаимодействовать с другими контрактами.

  7. Обработка криптографических функций

    Ethereum поддерживает некоторые криптографические функции, такие как хеширование и проверка цифровых подписей.

  8. Ограничения по времени выполнения

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

Эти ограничения и возможности определяют, какие типы приложений и вычислений могут эффективно реализовываться с помощью смарт-контрактов в Ethereum.

Доступ к внешним ресурсам из блокчейна, таким как API веб-сайта

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

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

Это связано с несколькими ключевыми особенностями блокчейна и смарт-контрактов:

  1. Детерминированность

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

  2. Безопасность и изоляция

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

  3. Синхронизация и скорость

    Ethereum работает в синхронном режиме, и зависимость от внешних асинхронных запросов может существенно замедлить или нарушить процесс майнинга и проверки транзакций.

Хранение данных в смарт-контрактах

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

  1. Переменные состояния: Контракты могут определять переменные состояния, которые хранятся в блокчейне и могут быть изменены через функции контракта. Эти переменные могут содержать числа, строки, массивы и более сложные структуры данных.

  2. Изменение состояния: При выполнении контракта в результате транзакции и изменении переменных состояния эти изменения записываются в блокчейн после успешного выполнения транзакции.

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

  4. Чтение данных: Контракты могут включать функции для чтения сохранённых данных. Такие функции могут вызываться внешними пользователями или другими контрактами без отправки транзакции и без расхода газа.

  5. Ограничения газа и стоимость: Хранение данных в блокчейне требует газа и может быть дорогостоящим, особенно при больших объёмах данных. Это требует оптимизации и экономного использования хранилища.

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

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

Изменение смарт-контракта после развёртывания в сети

После того как смарт-контракт развёрнут в сети Ethereum, его код становится неизменным. Это означает, что после развёртывания невозможно изменить логику или функциональность контракта. Основные аспекты этой особенности:

  1. Неизменность кода: Код смарт-контракта и все его операции записываются в блокчейн Ethereum и становятся частью его истории. После развёртывания код не может быть изменён или удалён.

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

  3. Обновления и модификации: Если необходимо обновить или изменить логику контракта, разработчики обычно развёртывают новый контракт и, при необходимости, мигрируют данные из старого. Иногда в контракт включают механизмы для обновления некоторых его аспектов (например, адресов других контрактов), но основная логика остаётся неизменной.

  4. Самоуничтожение: В Solidity есть функция selfdestruct, позволяющая "уничтожить" контракт, освобождая место в блокчейне и возвращая оставшиеся средства на указанный адрес. Однако после её вызова контракт становится неработоспособным, а его код остаётся в блокчейне как часть истории.

  5. Архитектура прокси-контрактов: Для создания более гибких систем, которые можно обновлять, иногда используют прокси-контракты. Логика хранится в отдельном контракте, а прокси делегирует вызовы функций. Это позволяет обновлять логику, изменяя только контракт с логикой, но такой подход имеет свои нюансы и риски.

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

Резюме

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