Ethereum стал доказательством концепции для будущего веб-коммуникаций, главным образом благодаря своей основной функции — смарт-контракту. Объяснение того, как это работает.
В первую очередь, Ethereum — это платформа для создания децентрализованных онлайн-сервисов, работающих на основе технологии блокчейн. Во вторую очередь — это криптовалюта. Главное отличие между Ethereum и, например, Bitcoin — это смарт-контракты. Они позволяют программировать внутри блокчейна. Это позволяет интегрировать более сложные механизмы в Ethereum, такие как NFT.
Благодаря смарт-контрактам мы можем исследовать новые способы ведения бизнеса, прозрачные финансовые институты, прозрачное патентование, прозрачное голосование и создание прозрачных контрактов. Фактически, сфера применения смарт-контрактов чрезвычайно широка, и новые идеи продолжают появляться ежедневно.
По сути, контракт — это текстовый файл с кодом, написанным на языке программирования Solidity. Он предоставляет определённый API в виде функций и триггеров, которые могут использоваться внутри смарт-контракта.
Выполнение контракта в Ethereum происходит в нескольких этапах:
Создание транзакции
Всё начинается с создания и отправки транзакции пользователем. Эта транзакция содержит инструкции для вызова функций смарт-контракта и может включать данные и ETH для передачи в контракт.
Распространение транзакции
Отправленная транзакция распространяется по сети узлов Ethereum. Она ожидает в пуле транзакций, пока майнер (или валидатор в PoS) не выберет её для включения в новый блок.
Обработка транзакции майнерами
Майнер выбирает транзакцию из пула и начинает обработку. Это включает проверку подлинности транзакции (подпись) и достаточности средств для оплаты газа.
Выполнение контракта
После проверки майнер (или валидатор) выполняет код смарт-контракта. Это происходит в Ethereum Virtual Machine (EVM) — изолированной среде, где каждая операция стоит определённое количество газа.
Изменение состояния
В результате выполнения контракта может произойти изменение состояния блокчейна. Например, это может быть передача токенов, изменение данных в контракте и т.д.
Подтверждение блока
После завершения формирования блока с транзакциями майнер распространяет этот блок по сети. Другие узлы проверяют блок и, при успешной верификации, добавляют его в свою копию блокчейна.
Оплата газа
Пользователь, отправивший транзакцию, оплачивает комиссию за газ в ETH. Эта комиссия поступает майнеру (или валидатору) в качестве вознаграждения за обработку транзакции и поддержку сети.
Финализация
После подтверждения блока транзакция и все её результаты (включая выполнение контракта) считаются окончательными и необратимыми.
Вычисления, связанные с выполнением смарт-контрактов в сети Ethereum, оплачиваются пользователями, отправляющими транзакции. Эти пользователи платят комиссию за газ, которая компенсирует ресурсы, необходимые для обработки транзакций и выполнения смарт-контрактов.
Комиссия за газ зависит от нескольких факторов:
Сложность вычислений
Более сложные операции требуют больше вычислительных ресурсов и, следовательно, стоят дороже.
Загруженность сети
В периоды высокой загруженности сети цена газа может увеличиваться, так как пользователи конкурируют за быстрое включение своих транзакций в блок.
Лимит газа
Пользователь устанавливает максимальное количество газа, которое он готов потратить на выполнение транзакции. Если лимит слишком низкий, транзакция может не выполниться.
Майнеры или валидаторы (в зависимости от используемого консенсуса — Proof of Work или Proof of Stake) выбирают транзакции с более высокими комиссиями за газ, поскольку это увеличивает их доход. Эти комиссии служат стимулом для поддержания работы сети Ethereum.
Смарт-контракты в Ethereum могут выполнять широкий спектр вычислений, но существуют определённые ограничения и особенности:
Тьюринг-полнота
Языки программирования смарт-контрактов, такие как Solidity и Vyper, являются тьюринг-полными, что теоретически позволяет выполнять любые вычисления, подобные обычным языкам программирования.
Ограниченные ресурсы
Каждая операция в контракте требует определённого количества газа, и количество газа в одной транзакции ограничено. Это означает, что очень сложные или ресурсоёмкие вычисления могут быть непрактичными из-за высоких затрат на газ или ограничений блока.
Детерминированность
Вычисления в смарт-контрактах должны быть детерминированными, то есть при одинаковых входных данных всегда давать одинаковый результат. Это необходимо для согласованности состояния блокчейна.
Отсутствие внешних сетевых запросов
Смарт-контракты не могут напрямую обращаться к внешним серверам или API. Для получения внешних данных используются оракулы.
Хранение данных
Контракты могут хранить данные в своём состоянии, но из-за стоимости газа хранение больших объёмов данных может быть дорогостоящим.
Математические и логические операции
Контракты могут выполнять различные математические и логические операции, управлять потоком исполнения (циклы, условные конструкции), создавать и взаимодействовать с другими контрактами.
Обработка криптографических функций
Ethereum поддерживает некоторые криптографические функции, такие как хеширование и проверка цифровых подписей.
Ограничения по времени выполнения
Из-за лимита газа на каждую транзакцию смарт-контракты не подходят для долгих вычислений.
Эти ограничения и возможности определяют, какие типы приложений и вычислений могут эффективно реализовываться с помощью смарт-контрактов в Ethereum.
В коде смарт-контрактов Ethereum невозможно напрямую сделать запрос к внешнему веб-сайту или вызвать внешний API. Однако для взаимодействия с внешними данными и API в смарт-контрактах Ethereum используются оракулы. Оракулы — это сторонние сервисы, предоставляющие данные из внешнего мира в блокчейн. Они действуют как посредники, собирая необходимые смарт-контрактам данные и предоставляя их в блокчейн в надёжной и проверенной форме.
Примеры использования оракулов включают получение информации о ценах на активы, погодных данных, результатов спортивных событий и многое другое. Использование оракулов требует доверия к поставщику данных и правильного управления рисками, связанными с централизацией этого аспекта децентрализованных приложений.
Это связано с несколькими ключевыми особенностями блокчейна и смарт-контрактов:
Детерминированность
Блокчейн требует, чтобы каждая транзакция и выполнение контракта были детерминированными. Это означает, что каждый узел сети должен прийти к одному и тому же результату при выполнении кода контракта. Внешние запросы могут приводить к разным результатам в разное время, нарушая этот принцип.
Безопасность и изоляция
Включение внешних данных или запросов в блокчейн может создать потенциальные уязвимости и векторы атак в безопасности сети.
Синхронизация и скорость
Ethereum работает в синхронном режиме, и зависимость от внешних асинхронных запросов может существенно замедлить или нарушить процесс майнинга и проверки транзакций.
Смарт-контракты в Ethereum способны сохранять результаты вычислений. Эти данные хранятся в состоянии блокчейна и доступны как внутри самого контракта, так и для других контрактов или внешних запросов. Ключевые аспекты хранения данных:
Переменные состояния: Контракты могут определять переменные состояния, которые хранятся в блокчейне и могут быть изменены через функции контракта. Эти переменные могут содержать числа, строки, массивы и более сложные структуры данных.
Изменение состояния: При выполнении контракта в результате транзакции и изменении переменных состояния эти изменения записываются в блокчейн после успешного выполнения транзакции.
Долгосрочное хранение: Данные записываются в блокчейн и являются долгосрочными и неизменными, то есть будут храниться, пока существует сеть Ethereum.
Чтение данных: Контракты могут включать функции для чтения сохранённых данных. Такие функции могут вызываться внешними пользователями или другими контрактами без отправки транзакции и без расхода газа.
Ограничения газа и стоимость: Хранение данных в блокчейне требует газа и может быть дорогостоящим, особенно при больших объёмах данных. Это требует оптимизации и экономного использования хранилища.
Смарт-контракты могут использовать хранилище для различных целей, включая отслеживание балансов криптовалют, результатов голосования, уникальных идентификаторов для NFT и многое другое.
Таким образом, механизмы хранения и управления данными являются ключевыми компонентами в дизайне и функциональности смарт-контрактов на Ethereum.
После того как смарт-контракт развёрнут в сети Ethereum, его код становится неизменным. Это означает, что после развёртывания невозможно изменить логику или функциональность контракта. Основные аспекты этой особенности:
Неизменность кода: Код смарт-контракта и все его операции записываются в блокчейн Ethereum и становятся частью его истории. После развёртывания код не может быть изменён или удалён.
Безопасность и доверие: Эта неизменность обеспечивает безопасность и доверие в сети. Пользователи, взаимодействующие с контрактом, могут быть уверены, что его логика не изменится после развёртывания.
Обновления и модификации: Если необходимо обновить или изменить логику контракта, разработчики обычно развёртывают новый контракт и, при необходимости, мигрируют данные из старого. Иногда в контракт включают механизмы для обновления некоторых его аспектов (например, адресов других контрактов), но основная логика остаётся неизменной.
Самоуничтожение: В Solidity есть функция selfdestruct
, позволяющая "уничтожить" контракт, освобождая место в блокчейне и возвращая оставшиеся средства на указанный адрес. Однако после её вызова контракт становится неработоспособным, а его код остаётся в блокчейне как часть истории.
Архитектура прокси-контрактов: Для создания более гибких систем, которые можно обновлять, иногда используют прокси-контракты. Логика хранится в отдельном контракте, а прокси делегирует вызовы функций. Это позволяет обновлять логику, изменяя только контракт с логикой, но такой подход имеет свои нюансы и риски.
Основная логика и функциональность смарт-контракта остаются неизменными после развёртывания, и для внесения изменений обычно требуется создание нового контракта.
Ethereum — это не просто криптовалюта. Такие платформы предоставляют нам не только свободу платёжных транзакций, но и обеспечивают коммуникацию между различными бизнесами без необходимости бюрократии. Отсутствие бюрократии ведёт к более быстрому прогрессу человечества.