Разница между смарт-контрактами в публичных и приватных сетях
Блокчейн эволюционирует от платежных систем к платформам, поддерживающим децентрализованные приложения. Чарльз Хоскинсон приводит хороший пример: при работе над платформой Ethereum ее создатели поняли, что перевод токенов — отдельная история, в которой можно задавать определенные условия осуществления перевода. Благодаря дальнейшему развитию технологий пользователи блокчейна увидели более широкие возможности, чем просто перевод токенов, и начали создавать полезные — и даже прикольные — децентрализованные приложения. В рамках публичных блокчейнов существует несколько основных пользовательских кейсов:
- Игры — Crypto Kitties, Ride on waves и т. д.
- Обмен токенов
- Надежные системы голосования
- Краудфандинг (ICO).
Благодаря росту популярности публичных блокчейн-платформ компании поняли, что технология блокчейн может очень эффективно применяться в их бизнес-процессах. В совокупности с фокусом на потребности бизнеса это дало толчок развитию смарт-контрактов. Из нашего опыта работы с корпоративными клиентами можно выделить несколько популярных кейсов, в которых смарт-контракты на приватном блокчейне могут проявить себя с лучшей стороны:
- Документооборот компании
- Бизнес-процессы цепи поставок
- Страхование
- Надежные системы голосования
- Исполнение взаимных обязательств с поставщиками
- Лизинг и аренда оборудования
- Создание деривативных финансовых инструментов, обеспеченных материальными и нематериальными активами (например, токенизация долга)
- Аукционы любого вида и сложности
- Предиктивная аналитика данных на блокчейне.
Как вы понимаете, смарт-контракты для публичных и приватных блокчейнов отличаются. Основные отличия смарт-контрактов на приватном блокчейне:
- Данные, с которыми работают смарт-контракты, более чувствительны, чем в публичных сетях.
- Общеизвестно, что смарт-контракты должны работать с документами и данными, хранящимися вне блокчейна, что невозможно для публичных блокчейн-платформ. В публичных сетях существуют оракулы, которым или доверяют, или позволяют напрямую хранить на блокчейне лишь ограниченный объем данных. Оба случая представляют серьезные ограничения для приватного блокчейна.
- Иногда требуется шифрование транзакций, вызывающих смарт-контракты, чтобы только авторизованные участники могли расшифровать и исполнить приватный смарт-контракт.
Чего ожидают от функциональности смарт-контрактов в бизнес-приложениях корпоративные клиенты?
Ответ на этот вопрос относительно прост: они хотят перевести свои сложные бизнес-процессы в логику блокчейна с минимальными трудностями. Чтобы понять, как сделать наши смарт-контракты максимально соответствующими потребностям клиентов, мы провели исследование и сформулировали ряд вопросов:
Вопрос: На каком языке должны быть написаны смарт-контракты, и каким должен быть их уровень безопасности?
Ответ: Как вы знаете, у Waves есть язык Ride, удобный и хорошо интегрированный в блокчейн, но он работает лишь с приложениями, логика которых ограничена блокчейном. Для приложений, работающих с большим числом документов Ride неудобен, и мы должны использовать что-то более удобное для разработчиков.
Вопрос: Может ли система выразить сложные бизнес-правила в простой форме?
Ответ: Для большинства языков ответ, к сожалению, отрицательный. На это много причин. Корпоративные разработчики не знают специфику блокчейна и языки разработки смарт-контрактов, а подходящие языки не могут работать с данными вне блокчейна.
Вопрос: Можем ли мы в будущем доработать контакты, не переписывая все блокчейн-структуры?
Ответ: Нет — для большинства решений на рынке (кроме Hyperledger Fabric). Основная причина — в том, что контакты интегрированы в блокчейн слишком глубоко. Это — наследие публичных блокчейнов, где повторная интеграция является прямой угрозой безопасности системы.
Вопрос: Насколько легко интегрировать смарт-контракты в существующую инфраструктуру клиента и использовать с другими бизнес-приложениями?
Ответ: К сожалению, большинство бизнес-приложений или их API потребуют ре-дизайна, и их сложно запускать из смарт-контрактов. Использование блокчейна в проекте приведет к дополнительным расходам для бизнеса.
Сейчас мы расскажем о нашем подходе к решению этих проблем и о готовом решении.
Смарт-контракты Waves Enterprise
Итак, какие смарт-контракты доступны на Waves Enterprise?
Ride
Вы уже знаете, что Waves Enterprise поддерживает Ride, но, как едва ли не любой язык смарт-контрактов, изначально разработанный для публичных платформ, он не может работать с данными вне блокчейна. Поскольку Ride — очень быстрый и хорошо интегрирован в блокчейн, мы предлагаем использовать его для реализации простой логики, не требующей обработки данных из внешних источников. Например, на языке Ride могут быть реализованы публичные аукционы, публичное голосование, публичное страхование. В других случаях мы рекомендуем нашу новую функциональность — контейнеризированные смарт-контракты.
Контейнеризированные смарт-контракты
Контейнеризированные смарт-контракты Waves Enterprise — программы, упакованные в Docker-контейнер. Docker-контейнер помещается в Docker-репозиторий (один или несколько). У каждого контракта есть адрес на блокчейне и связанный с ним хэш Docker-образа контракта (чтобы гарантировать использование валидного контракта, при создании контракта транзакцией Docker Create хэш от исходного кода контракта записывается в блокчейн: подробнее об этом рассказано в нашей документации). Для исполнения смарт-контракта создается блокчейн-транзакция с требуемыми параметрами вызова, контракт вычисляет, а затем записывает результат в блокчейн. Благодаря Docker-контейнерам можно использовать любые языки программирования и фреймворки — в отличие от Hyperledger Fabric, где разработчики ограничены его SDK. Отметим, что Docker изолирует приложение от ноды Waves Enterprise, и у нас нет доступа к ноде на уровне кода. Но у нас есть сетевое подключение, и мы можем при необходимости выполнять HTTP-запросы. Это значит, что запрос может быть отправлен не только нашей ноде, но и любому другому известному сервису. Суммируя все вышесказанное, выделим основные преимущества контейнеризированных смарт-контрактов Waves Enterprise:
- Выбор языка программирования. Разработчики могут использовать любой язык программирования и любые удобные им фреймворки и библиотеки.
- В результате мы можем использовать в смарт-контрактах нейросети и другие модели машинного обучения, дополняя блокчейн-приложения искусственным интеллектом.
- Наши смарт-контракты можно подключать к внешним источникам данных, получая информацию в реальном времени и работая с приложениями вне блокчейна.
- Сложность смарт-контрактов ограничена только вычислительными мощностями виртуальной машины, на которой развертывается контакт. Время исполнения ограничено лишь временем генерации микро-блока и может быть еще сокращено по желанию пользователя.
- Параметры вызова и стейт контракта могут быть зашифрованы, чтобы другие участники сети не могли получить к ним доступ.
Что происходит при вызове контракта?
Как описано в предыдущем разделе, Docker-контейнер содержит некоторое ПО. Но что на самом деле происходит, когда транзакция вызова контракта попадает в пул транзакций ноды? Процедура такова:
- Если нет активного контейнера, то он будет развернут из образа, который хранится в репозитории.
- Он загружает exec, файрвол, если подключение к интернету для этого контракта запрещено, и доменная нода инициализируется переменными среды.
- Затем выполняется скрипт run.sh, который инсталлирует зависимости, если контейнер не существует.
- Контракт может получать информацию о ноде и транзакции через переменные среды операционной системы.
- Если вычисление контракта занимает слишком много времени, он будет отменен по причине тайм-аута (точное время тайм-аута пользователь может задать в настройках).
- Результат исполнения контракта должен быть отпечатан в STDOUT и отформатирован как List [DataEntry]. Более подробная информация о формате и выводе находится в документации.
- Если контракт успешно исполнен, майнер создаст ExecutedContractTransaction и подпишет ее. Транзакция содержит транзакцию вызова, инициировавшую контракт, и результат. Затем, как и любая другая транзакция, она записывается в блок добавляется в стейт.
- Все участники, получающие блок, могут подтвердить, что транзакция была подписана участником с ролью miner и добавить ее в стейт.
Примеры и необходимые шаги развертывания есть в этом гайде в нашей официальной документации.
Краткое сравнение с ‘лучшими’ решениями на рынке
Преимущества этих технологических решений важны, и здесь мы сравним наши контейнеризированным смарт-контракты с другими известными смарт-контрактами.
1. Ethereum имеет многочисленное сообщество и долгое время является платформой номер один для разработки dApp в сфере публичных блокчейнов. Также существуют версии для использования в приватных блокчейнах (например, Quorum и Masterchain). Но с точки зрения исполнения в публичной сети языки Solidity и EVM в целом имеют, в отличие от контейнеризированных смарт-контрактов Waves Enterprise, ряд ограничений.
- «Газ». Языки EVM — полные по Тьюрингу, но для стабильной работы в случае атаки, которая может парализовать систему бесконечными вычислениями, существуют ограничения по числу операций EVM в рамках исполнения одного контракта и по сложности. В результате при сложном контракте может быть выдана ошибка «не хватает газа». В приватной сети это неудобно, потому что бизнес-процессы всегда должны быть завершены.
- Данные вне блокчейна. В смарт-контракты Ethereum можно добавить некоторое количество данных, но их хранение ограничено и дорого. Например, вы не можете написать контракт, который запросит текущие биржевые котировки и будет использовать их для других операций. Другими словами, вы не можете создать мини-веб-сервер с помощью Solidity, но можете это сделать с помощью Waves Enterprise — и даже выбрать язык программирования и фреймворк.
2. Hyperledger Fabric — на сегодня самая известная платформа для приватных блокчейн-решений, и она тоже использует смарт-контракты в Docker-контейнере. Но они ограничены использованием SDK и доступны только на языках Go, JS и т. д. Разработчикам приходится совершать много операций низкого уровня — например, диспетчеризацию и вычисление аргументов. В результате даже простейшая программа в духе «Hello world» на Go потребует 90 строк кода. Для многих разработчиков это неудобно.
Что дальше?
Мы постоянно работаем над улучшением нашей технологии, и сейчас в разработке несколько ключевых функций, которые будут выпущены в ближайшие месяцы. Среди них — повышение уровня безопасности для существующего протокола. В будущем смарт-контракты могут потребовать мульти-подпись майнеров, участвующих в исполнении контракта. Мы также работаем над улучшением процесса генерации блоков, чтобы обеспечить параллельное исполнение стандартных транзакций и нескольких контейнеризированных смарт-контрактов.