Polys

О смарт-контрактах




Роман Алёшкин
Январь, 2018
В этой статье мы попробуем разобраться, что такое смарт- (умные) контракты и как они работают. Для начала в общих чертах обсудим само понятием, потому немного затронем реализацию смарт контрактов на примере блокчейна Ethereum.

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

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

Это не распределенные вычисления в привычном смысле. Потому, что когда мы говорим о распределенных вычислениях, то привыкли подразумевать распределенную нагрузку. Например: у нас есть задача посчитать в огромном текстовом файле количество определенных слов. Для этого мы «режем» файл на несколько частей, раздаём их разным серверам (например, используя Hadoop), каждый из которых выполняет подсчет и выдаёт результат. Мы суммируем ответы и получаем итоговую цифру. Так мы значительно ускоряем выполнение задачи.

Если говорить о смарт-контрактах — здесь другая ситуация. Используя пример выше, мы не «режем» файл на несколько частей, а отдаём каждому серверу его целиком. Каждый из серверов выполняет подсчет и выдаёт один и тот же результат (в идеале). Получается, что сервера проверяют работу друг друга. Возвращаясь к вопросу, попадает ли такое действие под определение «распределенные вычисления», можно ответить, что да, попадает. Это же вычисления и они распределены. Вероятно нам пора вводить новый дополнительный термин на тему распределенных вычислений.

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

Для чего же полезна такая конструкция? Наиболее известный пример — создание общественного договора (контракта) между двумя и более сторонами. Отсюда и название — «смарт контракт». Стороны фиксируют договоренности и условия выполнения того или иного сценария развития отношений между собой на языке программирования, таким образом, что наступление определенных событий будет автоматически вызывать выполнение предопределенного действия.

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

Здесь необходимо сделать уточнение, что текущие реализации смарт контрактов (Далее мы будем говорить о сети Ethereum) все же по сути история замкнутая в блокчейн среде. Что это значит? Нельзя написать контракт, который будет получать данные из вне (например от поставщиков данных о погоде) и реализовывать логику на этих данных. Конечно, есть для этого оракулы (они требуют определенного доверия к себе) или например Microsoft работает над концептом криплетов, но пока там есть куда расти.

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

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

Положим у вас есть сообщество, в котором необходимо принять решение путем голосования. Это решение крайне важно и сообщество не склонно доверять отдельным своим членам. Какой есть выход? Собраться всем вместе с одном помещении и проголосовать. Всем будет виден результат голосования, доверие будет обеспечено. Но как провести голосование, если сообщество большое и его члены живут в разных местах? Устроить выборы через интернет? Положим мы использовали какой-то сервис для сбора мнений. До определенного предела этот способ голосования отлично работает. Но где этот предел? Как проконтролировать оператора и получить прозрачность?

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

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

Алгоритмическая сторона вопроса

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

В этой сети для написания смарт контрактов используется язык Solidity, который несколько похож на JS и он является Тьюринг-полным (т.е. на нём можно реализовать любую вычислимую функцию).

Сам код выполняется в так называемом Ethereum Virtual Machine (EVM). Надо обратить внимание, что код выполняется и проверяется всеми участниками системы, потому необходим некий механизм, который как-то ограничит потребление ресурсов каждым смарт контрактом (иначе можно бесконечный цикл написать). Потому в Ethereum введена сущность gas (топливо). Контракт в Ethereum может выполнять любые инструкции, вызывать другие контракты, писать и читать данные и так далее. Все эти операции потребляют топливо, топливо оплачивается криптовалютой (Ether). Цена на топливо криптовалюты Ethеr формируется динамически рынком. Тригером выполнения контракта является транзакция. Стоимость топлива, которое сжигается в определенной транзакции снимается с аккаунта, который транзакцию запустил. Кроме того есть лимит потребления топлива, сделан он для того, чтобы защитить аккаунт от ошибок в написании контракта, которые могут привести к бесконтрольному сгоранию всей криптовалюты на данном аккаунте.

Важно отметить, что среда смарт контрактов все же сильно отличается от привычной нам среды выполнения кода. Ошибка может стоить очень дорого, сами операции дорогие и медленные. Затруднен механизм обновления смарт контракта. Вы по сути пишете новый и должны убедить стороны использовать этот новый смарт контракт. Нельзя сказать, что никак не перейти на новую версию своего контракта, но это часто новый общественный договор. Если вдуматься разительное отличие, когда вы привыкли просто выкатывать апдейты вашей централизованной системы потребителям, не слишком интересуясь из мнением. Строя какую-то систему для работы в реальных жизненных сценариях на смарт контрактах стоит понимать эти ограничения.