Эффективные смарт-контракты в широких масштабах
Автор: Сильвио Микали
Смарт-контракты — один из самых прекрасных и мощных подарков блокчейна миру, но они также очень сложны с технической точки зрения. Традиционные смарт-контракты реализуются на втором уровне блокчейна и являются медленными, дорогими и уязвимыми. В противоположность этому, смарт-контракты на платформе Algorand в значительной мере более эффективные, безопасные и реализованы на первом и втором уровне протокола.
Смарт-контракты Algorand выполняются на самом базовом уровне, так называемом консенсусном уровне, наиболее безопасном слое в любом блокчейне, без заметного влияния на скорость подтверждения блоков. Таким образом, они столь же эффективны и надежны, как и обычные транзакции. Смарт-контракты Algorand еще называют TEAL контракты, потому что они написаны на специальном языке: TEAL, сокращение от Transaction Execution Approval Language.
Платформа смарт-контрактов Algorand состоит из двух компонентов, а именно:
- TEAL контракты без сохранения состояния (Stateless TEAL contracts)
Эта технология была представлена в ноябре 2019 года и обсуждалась ранее в одной из моих статей.
- TEAL контракты с отслеживанием состояния (Stateful TEAL contracts)
Эта технология была выпущена в августе 2020 года и является предметом обсуждения в данной статье.
Следующий и окончательный компонент платформы смарт-контрактов Algorand будет состоять из “Smart2 Contracts”. Как обсуждалось ранее в моей статье, эти контракты будут работать на втором уровне блокчейна, но принципиально новым способом. Эта технология будет внедрена в следующем году.
Прежде чем описывать TEAL контракт с отслеживанием состояния, лучше всего быстро вспомнить его мощного “предшественника”.
0. TEAL контракты без сохранения состояния
Контракты TEAL без сохранения состояния — это очень эффективные логические программы, предназначенные для утверждения или отклонения транзакции на момент ее отправки. Они состоят из небольшой последовательности команд до 1KB и могут включать несколько из 30 основных инструкций, таких как COMPARE (X, Y), где X и Y — целые числа, или VERIFY (X), где X — цифровая подпись. Они называются контракты без сохранения состояния, потому что имеют доступ только к информации доступной в самой транзакции, что является одной из причин их эффективности.
Технология TEAL контрактов без сохранения состояния является очень мощной, так как она позволяет настраивать узкоспециализированные ограничения на транзакции и группы транзакций с целью устранения дорогостоящих посредников, а также позволяет добавить беспрецедентный уровень прозрачности к зачастую непрозрачной экономической деятельности.
Например, с помощью смарт-контрактов без сохранения состояния вы можете выставить на продажу товар вместе с возможным списком того, что вы можете принять взамен. После этого от вас не потребуется никакого дальнейшего взаимодействия, можно даже уехать в отпуск!
Контракт гарантирует, что ваш товар будет автоматически продан первому пользователю, который принимает ваше предложение. Если ваши условия не будут выполнены полностью, сделка не состоится и ваш товар останется непроданным. В то же время защищена и другая сторона, так как сделка является «атомарной операцией» (от греческого atomos — неделимое), которая либо выполняется целиком, либо не выполняется вовсе. Кем бы ни был второй участник, вы оба гарантированно получите то, что вы соответственно хотите. В противном случае статус-кво сохраняется.
Дополнительными примерами смарт-контрактов без сохранения состояния могут быть: выдача обеспеченных ссуд, создание целевых депозитных счетов, либо набор сложных взаимосвязанных платежей.
1. TEAL контракты с сохранением состояния.
Смарт-контракты без сохранения состояния – это здорово, но что, если вам нужен контракт, который будет действовать исходя из условий и информации не содержащихся в составе входящей транзакции? Для такого случая и были разработаны TEAL контракты с сохранением состояния.
Как следует из названия, такие программы поддерживают отслеживание состояния и написаны на языке TEAL. Фактически TEAL был обогащен несколькими новыми функциями, не только для правильной обработки информации о состоянии, но и также для работы с деревом Меркла и другими ценными функциями.
Проблема
Смарт-контракты с отслеживанием состояния должны соответствовать фундаментальному принципу Algorand: каждый блок должен гарантированно генерироваться в течение нескольких секунд и иметь окончательный характер транзакций.
Гарантировать такую высокую производительность не так-то просто, особенно если необходимо поддерживать низкие расходы пользователей.
Первый примитивный подход к решению проблемы
Хранение информации о состоянии непосредственно в блокчейне, безусловно, самый простой подход, но вряд ли самый эффективный. В этом подходе информация о состоянии приложения, которое выполняется продолжительное время рассредоточилась бы по широко распределенным блокам, что сделало бы невозможным его реализацию на первом уровне блокчейна без значительного замедления производства блоков.
Кроме того, данные, однажды записанные в блокчейне, не могут быть изменены, но эффективное обновление информации о состоянии требует их перезаписи. Имитация такой перезаписи путем добавления новых данных сделает этот первый подход чрезвычайно неэффективным.
Второй подход с низкой конкурентностью.
В другом подходе приложение может хранить информацию о своем состоянии вне сети, сохраняя только отпечаток (например, хэш Меркла) этой информации в самой цепочке, чтобы гарантировать ее целостность.
В этом подходе для изменения части данных, скажем, с X на Y, требуется представление доказательства целостности X относительно предыдущего значения, а также создание и сохранение нового отпечатка, которое отражает замену X на Y.
Однако такой способ работы не позволяет добиться большого параллелизма. Рассмотрим две транзакции, выполнение каждой из которых требуется в определенный момент времени.
Первая транзакция требует изменения части состояния с X на Y, таким образом она оперирует доказательством правильности значения X относительно последнего отпечатка состояния.
Вторая транзакция требует замены другой части состояния с U на V. Каждая из этих транзакций может быть действительной не только индивидуально, но и также, если бы она выполнялась после того, как другая транзакция уже была выполнена.
Однако в этом втором подходе любая из двух транзакций которая будет выполнена первой, остановит выполнение другой!
Предположим, что фиксация текущего состояния приложения это C (хеш от всех переменных), и что первая транзакция описанная выше выполняется первой.
Затем, после проверки доказательства правильности значения X относительно C, первым шагом (а) выполняемым вне цепочки, меняем значение X на Y, а вторым шагом (б) выполняемым в цепочке, меняем отпечаток состояния приложения с C на C’.
Таким образом, как только поступит вторая транзакция, она не будет выполнена, потому что доказательство правильности значения U больше не действует. Ведь это доказательство остается привязанным к предыдущему отпечатку состояния C, а не к новому C’!
Если бы масштабируемость не была нашей целью, то этот второй подход можно было бы с некоторыми дополнительными усилиями внедрить в блокчейн так, чтобы он справлялся с несколькими транзакциями в секунду. Но он не сможет обрабатывать сотни транзакций за секунду. Поэтому второй подход для нас неприемлем, поскольку он не может параллельно обрабатывать транзакции при масштабировании. Нам нужно другое решение.
Подход Algorand
Algorand решает эти проблемы, сохраняя состояние приложения в аккаунтах участвующих стороны, а именно, создателя приложения и пользователей, которые решили участвовать.
Первая причина выбора этого подхода заключается в том, что в Algorand учетные записи чрезвычайно эффективны. Они легко генерируются их владельцами, любой желающий может проверить их состояние, и в целом они очень дёшевы в эксплуатации.
Настолько, что Algorand не взимает комиссию за обслуживание учетной записи, а единственное требование — это поддерживать очень скромный баланс в 0.1 ALGO.
Если же владелец аккаунта планирует создать какое-нибудь децентрализованное приложение, то тогда требуется дополнительный баланс еще в 0.1 ALGO. Это обеспечит хранение в параметрах учетной записи 64 пар (x,y), где значением переменных x и y может быть строка размером до 64 байт. Каждая дополнительная пара повышает требование к минимальному балансу на 0.05 ALGO. Увеличение баланса может составлять всего 0.035 ALGO, если сохраненное значение является целым числом, а не произвольной 64-байтовой строкой.
Как правило, x определяет открытый ключ, а y — количество токенов (взаимозаменяемых “fungible” или конкретных незаменимых “non-funglible” токенов), управляемый ключом x.
Тем не менее, никаких ограничений ни на x, ни на y не накладывается.
Таким образом, в смарт-контракте TEAL с отслеживанием состояния (x, y) — это пара переменная-значение: то есть x — это имя переменной, а y ее текущее содержимое. Эти переменные и их содержимое и обеспечивают сохранение информации о состоянии смарт-контракта.
В частности, учетная запись создателя смарт-контракта хранит глобальные переменные, а учетные записи всех пользователей, которые с ним взаимодействуют хранят локальные переменные.
Обратите внимание, что любой может получить доступ к информации, хранящейся в любой учетной записи. Однако только смарт-контракт может изменять свои собственные глобальные и локальные переменные. Это ничем не отличается от того, как в учетной записи пользователя хранится количество принадлежащих ему токенов ALGO, но сам пользователь не может изменять (например, увеличивать) количество собственных ALGO!
Конкурентность
Также обратите внимание, что подход Algorand допускает масштабируемое параллельное выполнение смарт-контракта. Действительно, две корректные транзакции могут свободно изменять внутреннее состояние смарт-контракта, не блокируя друг друга (т.к. меняются их локальные переменные). Такой параллелизм действительно является главным преимуществом распределения данных смарт-контракта между учетными записями всех своих пользователей, преимущество, которое становится все более значительным по мере роста количества пользователей и транзакций.
Ресурсы, эффективность и расходы
Смарт-контракт с отслеживанием состояния не имеет возможности хранить произвольно большое количество данных. Как уже упоминалось, учетная запись создателя приложения может хранить до 64 пар «переменных-значений» глобального состояния. Каждая подключающаяся к нему учетная запись может хранить до 16 пар «переменных-значений» локального состояния. Эти ограничения для хранения данных необходимы для гарантии того, что смарт-контракты с отслеживанием состояния, написанные на языке программирования TEAL, не замедлят выпуск новых блоков в блокчейне Algorand. Фактически, этот подход позволяет Algorand исполнять на первом уровне блокчейна до тысячи транзакций со смарт-контрактами в секунду, независимо от того, насколько большим может быть количество подключившихся пользователей.
Хотя размер локального хранилища переменных для каждой учетной записи может показаться небольшим, обратите внимание, что общее количество информации, записанной в локальных переменных, будет расти линейно с числом подключившихся пользователей.
Таким образом, он будет на самом деле большим, если с приложением будут взаимодействовать много пользователи, что делает вероятным то, что объем доступной информации о состоянии смарт-контракта может быть достаточным для многих типов децентрализованных приложений. В разделе 2 мы еще раз обратим на это внимание, что смарт-контракты с отслеживанием состояния могут успешно применяться во многих важных децентрализованных приложениях.
Что касается затрат, как уже упоминалось, аккаунт, осуществляющий входящую транзакцию, не платит никакой комиссии за хранение своих локальных переменных. Наоборот, от него требуется только поддерживать дополнительный баланс в размере 0.05 ALGO для каждой пары “переменная-значение” локального состояния, которое требуется сохранить. Такое дополнительное требование на размер баланса немедленно отменяется в момент, когда учетная запись прекращает взаимодействие со смарт-контрактом, путем выполнения соответствующей транзакции в блокчейне.
В общем, смарт-контракты с отслеживанием состояния являются очень важным дополнением к существующим технологиям первого уровня блокчейна Algorand (стандартные активы ASA, атомарные свопы, TEAL контракты без отслеживания состояния) и имеют такую же производительность и экономическую эффективность, к которой уже привыкли пользователи Algorand.
2. Примеры приложений на основе смарт-контрактов TEAL с отслеживанием состояния
Смарт-контракты TEAL с отслеживанием состояния могут эффективно и безопасно использоваться во многих видах децентрализованных приложений. Ниже приведены только некоторые из них.
Аукционы
С помощью смарт-контракта можно проводить различные аукционы. Рассмотрим, например, голландский аукцион.
Предположим, у меня есть N новых токенов для продажи на голландском аукционе. Тогда я создаю новый смарт-контракт с отслеживанием состояния с тремя глобальными переменными:
(a) доступное количество токенов, N,
(b) текущая цена P, инициализированная некоторой начальной ценой, и
(c) общая сумма зарезервированных денег CM изначально установлена на 0.
Через определенные промежутки времени (например, каждые 50 блоков) мое приложение снижает текущую цену P на заданное значение (например, 0.1 ALGO) до тех пор, пока не будет достигнута некоторая определенная цена или пока токены не будут проданы на основе текущих ставок.
Каждый участвующий в аукционе пользователь может подать заявку по текущей цене, потому что переменная P является частью глобального состояние и, следовательно, является публичной.
В частности, при обращении пользователя к моему приложению он
(1) указывает ставку состоящей из количества A токенов ALGO которые он готов потратить и максимальной цены B.
(2) переносит ALGO в размере A на депозитный счет.
Этими действиями пользователь показывает свое обязательство использовать A токенов ALGO для покупки моих токенов по максимальной цене B за один токен в ALGO (или, конечно, по более низкой цене). Выбранная пользователем цена B обычно равна текущей цене P, но может быть и выше.
В ответ на его обращение к смарт-контракту, после проверки передачи токенов ALGO в размере A на депозитный счет и убедившись, что B как минимум равной текущей цене P, мое приложение:
(1) сохраняет числовое значение A в локальных переменных пользователя,
(2) увеличивает на A переменную глобального состояния CM.
Обратите внимание, что причина, по которой пользователю необходимо указать максимальную цену за токен B, заключается в том, что в случае асинхронности операций цена P может стать ниже к тому моменту, когда ставка пользователя попадет в блокчейн.
Конечно, пользователь может разместить несколько ставок. Фактически, до 16 ставок, если он использует одну учетную запись. Если же он захочет добавить еще больше ставок, то можно открыть дополнительные аккаунты.
Этот процесс торгов продолжается до тех пор, пока соотношение CM / P не станет N. В этот момент приложение перестает снижать текущую цену, и расчетной цене C присваивается значение цены P последней ставки.
Как только торги заканчиваются, что можно легко обнаружить из глобального состояния смарт-контракта, каждый пользователь тот, кто ранее делал ставку, может снова вызвать приложение.
Избегая описание «крайних случаев», которые в любом случае должны быть корректно обработаны, действия после торгов выглядят следующим образом.
Для каждой из ставок, на основе своего локального и глобального состояния приложение определяет, выиграла она токены или нет. В последнем случае депозит в размере A токенов ALGO освобождается и возвращается на счет участника. Если ставка выиграла, приложение рассчитывает какое точное количество токенов получает участник по расчетной цене и исходя из суммы его депозита, в отсутствии ничьей или других «крайних случаев» оно равняется значению A/C. Это количество токенов будет немедленно переведено с моего счета на счет участника, а депозит в размере A токенов ALGO немедленно освобождается и также переводится на мой счет. Всё это происходит одновременно одной атомарной транзакцией!
ПРИМЕЧАНИЕ. Способность Algorand проводить аукционы на первом уровне блокчейн протокола была одной из основных причин почему Правительство Маршалловых Островов выбрало Algorand для своей цифровой валюты центрального банка (CBDC).
Security-токены или цифровые аналоги ценных бумаг
Стандартные активы Algorand (ASA) позволяют пользователю создавать собственные токены с указанием отдельных адресов для управления, замораживания, резервирования и возврата активов. ASA решают большинство задач возникающих при выпуске security-токенов без необходимости писать смарт-контракт. Однако для вашего случая может потребоваться больше, чем может предоставить функционал создания ASA токенов. Вы можете захотеть выпустить security-токен с настраиваемыми ограничениями, например таким как, кто и с кем может торговать токеном.
Смарт-контракты с отслеживанием состояния позволяют вам это делать. Если в общих чертах то, в глобальных параметрах смарт-контракта могут быть указаны общие параметры такие как адреса для управления, заморозки токенов, матрица групп доступа и как эти группы могут торговать друг с другом, в то время как принадлежность аккаунта к той или иной группе будет храниться в его локальных параметрах.
ПРИМЕЧАНИЕ. Возможность смарт-контрактов с отслеживанием состояния реализовывать такую сложную функциональность на первом уровне протокола блокчейна является одной из главных причин, по которой Republic, консорциум из сотен тысяч аккредитованных инвесторов, выбрали Algorand для запуска собственного security-токена Republic Note.
Краудфандинг
Пользователь может использовать смарт-контракт с отслеживанием состояния Algorand для создания своего приложения по краудфандингу. Если цель фонда достигнута, создателю приложения будет разрешено получить средства, в противном случае средства будут возвращены спонсорам.
В этом примере приложение использует глобальное состояние для отслеживания цели фонда, текущего количества пожертвований, а также время начала и окончания. Когда пользователь соглашается на пожертвование, сумма его пожертвования записывается в локальных переменных. В отдельном смарт-контракте без сохранения состояния хранится общая сумма пожертвований, с логикой, которая позволяет тратить на вышеупомянутых условиях.
Децентрализованные биржи
Атомарные переводы, один из основных примеров технологии TEAL без отслеживания состояния. Они позволяют пользователям торговать определенными активами, которыми они владеют, наиболее безопасным и эффективным способом, не полагаясь на третьих лиц.
Однако, для того чтобы использовать атомарный своп, вы должны знать, кто готов продать, что и по какой цене. Но что делать, если у вас нет таких знаний?
Приложения TEAL с отслеживанием состояния могут восполнить этот пробел, выступая в качестве книги заказов. Пользователь может разместить заказ на покупку или продажу токенов, который будут сохранены в его локальном хранилище.
Логика приложения гарантирует, что переводы будут происходить только в том случае, если условия покупателя и продавца совпадают. Отдельный контракт TEAL без сохранения состояния выполняет передачу токенов со счета пользователя, если соблюдаются его собственные условия продажи/покупки и условия другого пользователя.
Прозрачный банкинг и DeFi
Algorand позволяет пользователям хранить ALGO и другие цифровые активы в блокчейне. Но простое хранение не добавляет активам ценности и здесь как раз есть возможность для реализации широкого спектра DeFi приложений. Данные решения могут предоставить дополнительную ценность как для владельцев цифровых активов, так и для компаний или индивидуальных пользователей, которые заинтересованы в получении кредита или финансовой помощи.
По сути, пользователь решает передать какую-то часть своих средств DeFi приложению, которому он доверяет, благодаря полной прозрачности из-за используемой в основе блокчейн технологии.
DeFi приложение отслеживает баланс пользователя, который хранится в локальных переменных его аккаунта и выплачивает проценты этому пользователю по его депозиту.
Также приложение может хранить информацию по общей сумме вкладов и сумме резервов в глобальных переменных. Управление резервами может быть связано с отдельным смарт-контрактом без сохранения состояния. Логика работы этих двух типов смарт-контрактов как с сохранением состояния, так и без него гарантируют, что:
(1) DeFi приложение не может опуститься ниже определенного минимума в своих резервах, и
(2) пользователи могут выводить средства (с соответствующими ограничениями) свободно.
Все это на блокчейне, безопасно и прозрачно.
Обусловленная продажа активов
Представьте себе, что у вас есть возможность добиться того, чтобы любая продажа определенного актива требовала бы выплаты 5% комиссионных создателю актива или, возможно, государственному учреждению в качестве налога.
Это условие трудно реализовать вне блокчейна, поскольку мы должны полагаться исключительно на честность продавцов и покупателей. С помощью смарт-контрактов Algorand можно разработать приложение, которое гарантированно обеспечит честность сделок с выполнением таких условий.
В частности, я могу создать актив, замороженный по умолчанию, который можно разморозить и передать только при группировке с набором транзакций, обеспечивающих выплату комиссии. Одна из этих групповых транзакций — это вызов управляющего смарт-контракта, который используя свои глобальные переменные, для указания идентификатора актива и любых условий, необходимых для передачи актив, может проверить, действительно ли эти условия выполняются.
Группа транзакций также может включать транзакции для размораживания актива, до проверки условий, а затем для повторного замораживания актива после его передачи.
3. PyTEAL: создание смарт-контрактов с отслеживанием состояния на Python
Написание смарт-контрактов может быть очень трудным делом. Код должен тщательно подтверждать или отклонять транзакции, а приложение должно быть продумано до мелочей. В этом случае писать смарт-контракты на языке программирования Python намного проще, чем использовать коды операций TEAL. Это сравни тому, что проще писать на языке высокого уровня, а не на ассемблере. По этим причинам Algorand и разработал пакет PyTEAL.
Оригинальный PyTEAL
Ранее в этом году Algorand представила инструмент PyTEAL для разработки на Python своих смарт-контрактов без сохранения состояния.
Вместо того, чтобы иметь дело с основными арифметическими и условными операциями, добавлением и извлечением переменных из стека, PyTEAL позволяет разработчику создавать объекты, представляющие локальные переменные и выполнять над ними арифметические действия, операции сравнения, проверки подписи и хеширования и другие.
Затем код Python компилируется в код TEAL. По сути, PyTEAL открывает перед разработчиками всю мощь языка программирования смарт-контрактов TEAL.
Новый PyTEAL
Сегодня мы расширяем PyTEAL до смарт-контрактов с отслеживанием состояния. Таким образом, разработчики могут сосредоточиться на разработке логики приложения, в то время как PyTEAL упрощает доступ к операциям с локальными и глобальными переменными.
По сути, PyTEAL предоставляет простой Python API, который позволяет помещать, получать и удалять переменные смарт-контракта. PyTEAL переводит эти команды в коды операций TEAL, которые их и выполняют. Следовательно, он позволяет писать сложные приложения гораздо более простым способом и при относительно небольшом количестве строк кода. В качестве одного из примеров мы использовали PyTEAL для создания смарт-контракта, реализующего security-токены. Этот пример доступен онлайн: https://github.com/jasonpaulos/pyteal/blob/logicsig-v2-backup/examples/security_token.py
Почему PyTEAL?
PyTEAL великолепен:
Модульность – легко систематизируйте код смарт-контракта в логические разделы, используя популярный и всем известный язык.
Совместимость – PyTEAL это обыкновенная библиотека Python, используйте ее вместе с другими библиотеками Python, для повышения своих возможностей и для более продуктивного программирования.
Простота – легко импортировать данные между нескольких смарт-контрактами в единой среде разработки.
Таким образом, смарт-контракты с отслеживанием состояния и новое расширение PyTEAL не только расширяют возможности смарт-контрактов первого уровня на блокчейне Algorand, но они мощнее и эффективнее, чем когда-либо и намного проще в использовании.
Так что не идите, а скорее бегите, чтобы воспользоваться ими!
Об авторе. Сильвио Микали, основатель Algorand
Сильвио Микали работал на факультете электротехники и компьютерных наук Массачусетского технологического института с 1983 года. Сфера научных интересов Сильвио — криптография, доказательство с нулевым разглашением, генерация псевдослучайных чисел, протоколы безопасности, а также блокчейн. В частности, Сильвио является соавтором алгоритма вероятностного шифрования, доказательства с нулевым разглашением (Zero-Knowledge Proofs), проверяемых случайных функций (VRF) и многих других протоколов, которые являются основой современной криптографии.
В 2017 году Сильвио основал Algorand, полностью децентрализованный, безопасный и масштабируемый блокчейн, который обеспечивает платформу для создания продуктов и услуг для экономики без границ. В Algorand Сильвио курирует все исследования, включая теорию, безопасность и крипто-финансы.
Сильвио — лауреат премии Тьюринга (в области информатики), премии Гёдела (в области теоретической компьютерной науки) и премии RSA (в области криптографии). Он является членом Национальной академии наук, Национальной инженерной академии, Американская академии искусств и наук и итальянской Accademia dei Lincei.
Сильвио получил степень бакалавра по математике в Римском университете и докторскую степень в области компьютерных наук в Калифорнийском университете в Беркли.
Источник: Algorand Foundation