У разработчиков, желающих писать смарт-контракты, есть несколько хороших вариантов. Вот различия, которые помогут вам решить

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

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

Новый язык смарт-контрактов, разработанный для блокчейна Flow, Cadence, учится на упущениях Solidity и изначально решает многие присущие ему проблемы. И если вы уже знакомы с Solidity, научиться этому очень просто!

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

О Каденс

Cadence — это язык программирования, лежащий в основе блокчейна Flow, созданный Dapper Labs для поддержки крупномасштабных криптоигр и проектов NFT. (Вы, наверное, слышали об NBA Top Shots — одном из их самых успешных проектов.) Его синтаксис может быть вам знаком, поскольку он был вдохновлен популярными современными языками, такими как Swift, Rust и Kotlin. Cadence является статически и строго типизированным, с ресурсно-ориентированным подходом и моделью безопасности, основанной на возможностях.

Это означает, что Cadence оптимизирован для создания и управления цифровыми активами.

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

Как каденс улучшается по сравнению с твердостью

Cadence превосходит Solidity во многих отношениях. Давайте рассмотрим три примера: небольшие ошибки в коде, безопасность и контроль доступа, а также развертывание по контракту.

Эти маленькие ошибки кодирования

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

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

Безопасность и контроль доступа

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

С моделью безопасности Cadence, основанной на возможностях, учетные записи могут выполнять только те функции, к которым у них есть доступ. Это означает, что Cadence имеет контроль доступа, встроенный в сам язык. Кроме того, методы, определенные для объектов ресурсов в Cadence, не могут быть подвержены атакам с повторным входом, о чем разработчики Solidity должны хорошо знать при создании своего логического потока.

Развертывание смарт-контракта

Когда в смарт-контрактах Solidity обнаруживаются проблемы, разработчики не могут их исправить без развертывания совершенно нового контракта. И даже тогда уязвимый контракт все еще существует. Разработчики должны обеспечить переход своей пользовательской базы на новый контракт.

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

В целом, Cadence — более безопасный и надежный язык смарт-контрактов, который оставляет меньше места для ошибок.

Теперь давайте посмотрим на различия между смарт-контрактами, написанными на Solidity и Cadence. Мы рассмотрим простой контракт Hello World и более сложную реализацию NFT.

Простой контракт

Начнем с вечной классики. Мы все написали «Hello World» на нескольких языках, так что это простое знакомство с Cadence.

Давайте рассмотрим это шаг за шагом.

Определение контракта

Во-первых, у нас есть определение контракта. Очевидное отличие состоит в том, что в контракте Cadence есть модификатор управления доступом: в данном случае pub. Этот модификатор гарантирует, что каждый в сети Flow может получить доступ к контракту, что является поведением по умолчанию для контрактов Solidity.

Однако в Cadence мы также можем установить контроль доступа на access(account). Это ограничивает доступ к контракту учетной записью, которая развернула этот контракт. Здесь мы уже видим большую разницу между Flow и Ethereum. Мы не просто размещаем контракты в блокчейне Flow; мы развертываем их в хранилище нашей учетной записи. В блокчейне Flow каждая учетная запись инициализируется хранилищем, в котором могут храниться ресурсы и структуры. Это хранилище имеет свои собственные разрешения, что позволяет нам точно контролировать, кто может выполнять методы нашего контракта.

Переменные контракта

Следующая строка определяет строковую переменную, связанную с нашим контрактом. В Cadence точки с запятой необязательны, а ключевое слово let используется для определения переменной.

В Cadence есть два типа переменных — изменяемые и неизменяемые. Переменные, созданные с помощью let, являются неизменяемыми, иначе называемыми константами; мы можем установить их только один раз, и их нельзя изменить в течение срока действия контракта. Мы определяем изменяемые переменные (которые можно изменить) с помощью ключевого слова var.

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

Методы

Метод Cadence, эквивалентный методу Solidity constructor, представляет собой метод init. Этот метод вызывается ровно один раз — во время развертывания контракта.

Внутри метода init мы устанавливаем значение для нашей переменной приветствия. В то время как Solidity по умолчанию записывает в переменные контракта, Cadence записывает в локальные переменные и требует, чтобы вы использовали собственный объект для доступа к переменным контракта. Это решение защищает от случайной записи в переменную контракта при опечатке.

Второй метод нашего контракта возвращает переменную приветствия. В Cadence и Solidity мы должны объявить доступ к методу общедоступным, и оба языка требуют, чтобы мы определили тип возвращаемого значения. В данном случае это строка.

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

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

NFT-контракт

Далее давайте рассмотрим базовый контракт NFT на обоих языках:

Поскольку оба языка по-разному подходят к этому примеру, давайте рассмотрим их по отдельности: сначала рассмотрим пример Solidity, затем Cadence.

Солидность

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

В этом примере NFT не имеет дополнительных данных, но вы можете добавить другой идентификатор сопоставления в URI. Контракт гарантирует, что каждый вновь выпущенный NFT сопоставляется с адресом владельца.

Это простой пример, конечно. Обычно вам нужно будет расширить несколько интерфейсов, чтобы получить удаленно защищенный контракт NFT и такие функции, как метаданные, используемые для присоединения известных JPG к вашему NFT, но основные механизмы одинаковы.

Каденс

Теперь давайте посмотрим на версию Cadence и на то, как она улучшает этот пример Solidity.

Определение ресурса

Пример Cadence начинается с типа ресурса с именем NFT. Обратите внимание на символ @ перед NFT? Этот символ является обязательным, так как он гарантирует, что использование и поведение типов ресурсов останутся явными.

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

Внутри типа ресурса NFT есть поле id. Поле id представляет собой целое число UInt64 и представляет собой уникальный идентификатор, присвоенный каждому ресурсу NFT. Этот id будет разным для каждого ресурса NFT, что означает, что ресурс нельзя дублировать или объединять. Далее поле id инициализируется с помощью функции init.

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

Создание ресурсов

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

Когда мы вызовем функцию монетного двора, она создаст новый экземпляр нашего ресурса NFT. Эта функция возвращает ресурс с типом NFT и принимает поле id из ресурса, определенного ранее. Ключевое слово create немного похоже на оператор new в объектно-ориентированном программировании, создающий новый ресурс. <-, или оператор перемещения, указывает, что этот ресурс недоступен в источнике после того, как мы его вызвали.

Хранение ресурса

Переменная self.account будет указывать на учетную запись, которую мы использовали в качестве цели развертывания для нашего контракта. Как мы узнали ранее: смарт-контракты развертываются не в глобальном пространстве имен в сети Flow, а в специальном сетевом хранилище, принадлежащем вашей учетной записи. Таким образом, смарт-контракт знает, в какой учетной записи он был развернут, и может использовать эту информацию в своих методах.

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

Поскольку наш NFT является ресурсом, ни один объект в сети Flow не может его скопировать; нам не нужно явно отслеживать его уникальность.

Краткое содержание

Cadence — это свежий взгляд на языки программирования смарт-контрактов, оптимизированные для создания активов и управления ими. Это современная альтернатива, которая смягчает недостатки Solidity за счет таких средств, как принудительное управление переменными и ресурсами, контроль безопасности и доступа на базовом уровне, а также возможность обновлять смарт-контракты, прежде чем сделать их неизменяемыми. Cadence открывает вам возможности экосистемы Flow и включает в себя множество функций из таких языков, как Rust.

Итак, если вы разработчик, желающий писать смарт-контракты на принципиально более безопасном языке, Cadence — отличный вариант. Чтобы узнать больше, ознакомьтесь с Документацией Cadence и Порталом разработчиков Flow.

Хорошего дня!