Лекция
Привет, Вы узнаете о том , что такое solidity, Разберем основные их виды и особенности использования. Еще будет много подробных примеров и описаний. Для того чтобы лучше понимать что такое solidity, самовыполняющийся контракт , настоятельно рекомендую прочитать все из категории Объектно-ориентированное программирование ООП.
Solidity — объектно-ориентированный, предметно-ориентированный язык программирования самовыполняющихся контрактов для платформы Ethereum.
Смарт-контракт (англ. Smart contract — умный контракт) — компьютерный алгоритм, предназначенный для формирования, контроля и предоставления информации о владении чем-либо. Чаще всего речь идет о применении технологии блокчейна. В более узком смысле под смарт-контрактом понимается набор функций и данных (текущее состояние), находящихся по определенному адресу в блокчейне .
Смарт-контракты Ethereum разрабатываются на одном из языков, спроектированных для трансляции в байт-код виртуальной машины Ethereum — Solidity (похож на Си или JavaScript), Vyper и Serpent (похожи на Python), LLL (низкоуровневая версия Лисп), Mutan (основан на Go) .
Стороны подписывают умный контракт, используя методы, аналогичные подписанию отправки средств в действующих криптовалютных сетях. После подписания сторонами контракт сохраняется в блокчейне и вступает в силу. Для обеспечения автоматизированного исполнения обязательств контракта непременно требуется среда существования (узлы блокчейна Ethereum), которая позволяет полностью автоматизировать выполнение пунктов контракта. Это означает, что умные контракты смогут существовать только внутри среды, имеющей беспрепятственный доступ исполняемого кода к объектам умного контракта.
Схема архитектуры узла Эфириум
Все условия контракта должны иметь программное описание и ясную логику исполнения. В связи с этим первые умные контракты имеют задачу формализации наиболее простых взаимоотношений, состоящих из небольшого количества условий. Имея беспрепятственный доступ к объектам контракта, умный контракт отслеживает по указанным условиям достижения или нарушения пунктов и принимает самостоятельные решения, основываясь на запрограммированных условиях. Таким образом, основной принцип умного контракта состоит в полной автоматизации и достоверности исполнения договорных отношений .
Для того, чтобы умные контракты могли существовать, требуются определенные условия:
Язык был предложен в августе 2014 года Гэйвином Вудом (Gavin Wood ). В дальнейшем разработка языка была выполнена под руководством Кристиана Райтвизнера (Christian Reitwiessner) командой Solidity в рамках проекта Ethereum. Это один из четырех языков (среди Serpent, LLL и Mutan), спроектированных для трансляции в байт код виртуальной машины Ethereum. Получил широкое распространение с появлением технологий блокчейна, в частности стека технологий на основе Ethereum, для создания программного обеспечения умных контрактов.
Код контракта
Ethereum не только хранит данные транзакции в цепочке, но и может хранить код договора в цепочке.
На уровне базы данных роль блокчейна заключается в хранении данных транзакций. Так в чем же логика голосования за кандидатов или получения результатов голосования? В мире Ethereum вы можете использовать язык Solidity для написания бизнес-логики / кода приложения (то есть contract: Contract), затем скомпилировать код контракта в байт-код Ethereum и развернуть байт-код в блокчейне. :
Для написания кода контракта могут использоваться другие языки, но Solidity - безусловно, самый популярный выбор.
Виртуальная машина Ethereum
Важно отметить, что виртуальная машина Ethereum полностью изолирована. Это означает, что код, который в настоящее время выполняется в EVM, не имеет доступа к сети или файловой системе и может ограниченно обращаться к другим контрактам.
Блокчейн Ethereum не только хранит данные и код, каждый узел также содержит виртуальную машину (EVM: Ethereum Virtual Machine) для выполнения кода контракта - он звучит как операционная система компьютера.
Фактически, это ключевой момент, который отличает Ethereum от Биткойна: существование виртуальной машины привело к появлению блокчейна в эпоху 2.0, а также сделало блокчейн первой удобной для разработчиков платформой для разработчиков. ,
Статически типизированный JavaScript-подобный язык программирования, создан для разработки самовыполняющихся контрактов, исполняющихся на виртуальной машине Ethereum (EVM). Программы транслируются в байткод EVM. Позволяет разработчикам создавать самодостаточные приложения, содержащие бизнес-логику, результирующую в неотменяемые транзакционные записи блокчейна.
Использование синтаксиса ECMAScript по замыслу Вуда должно помочь принятию языка действительными веб-разработчиками. Однако, в отличие от ECMAScript, язык получил статическую типизацию переменных и динамические типы возвращаемых значений. По сравнению с компилируемыми в такой же байт код языками Serpent и Mutan язык имеет важные отличия. Поддерживаются комплексные переменные контрактов, включая произвольные иерархические отображения (mappings) и структуры. Контракты поддерживают наследование, включая множественное и C3-линеаризацию. Поддерживается бинарный интерфейс программирования (ABI), имеющий множество типобезопасных функций в каждом контракте (впоследствии появился также и в Serpent). Специфицирована система документирования кода для пользовательского пояснения последовательности вызовов, получившая название «Спецификации на естественном языке Ethereum» (Ethereum Natural Specification Format) В Solidity вместо привычных классов объявляются контракты (contract). Существуют библиотеки для написания смарт-контрактов такие как: Open Zeppelin, Truffle. Библиотеки позволяют создать свою монету (токен) на основе готовых шаблонов, со всеми спецификациями (ERC20) и проверками на безопасность (библиотека safemath).
Контракты в solidity могут наследоваться друг на друга. Это значит что функции и переменные контракта от которого мы наследуемся будут доступны в контракте который наследует. В solidity как и в C++ есть множественное (ромбовидное) наследование.
Пример программы на языке Solidity :
Архитектура DAPP
На следующем рисунке показана децентрализованная архитектура приложения на основе Ethereum:
Диаграмма архитектуры DAPP
Каждый клиент (браузер) взаимодействует с соответствующим экземпляром приложения узла, а не запрашивает услуги у централизованного сервера.
В идеальной децентрализованной среде каждый, кто хочет взаимодействовать с DApp, должен запускать полный узел блокчейна на своем компьютере или мобильном телефоне - короче говоря, каждый запускает полный узел , Это означает, что перед тем, как реально использовать децентрализованное приложение, пользователи должны загрузить весь блокчейн.
Тем не менее, мы не живем в утопии. Об этом говорит сайт https://intellect.icu . Нереально ожидать, что каждый пользователь запустит полный узел перед использованием вашего приложения. Но основная идея децентрализации заключается в том, что она не зависит от централизованного сервера. Поэтому в сообществе блокчейнов появились некоторые решения, такие как Infura, которая предоставляет общедоступные узлы блокчейна, и Metamask, плагин для браузера. Благодаря этим решениям вам не нужно тратить много жесткого диска, памяти и времени на загрузку и запуск полного узла блокчейна, а также вы можете воспользоваться преимуществами децентрализации.
все контракты Solidity содержат следующие элементы:
Чтобы программировать смарт-контракты для рабочих сред, вам потребуется ознакомиться с ними ближе, однако здесь вы получите общую информацию, которая послужит отправной точкой для изучения этой технологии.
Поняв эти принципы, вы сможете начать создавать собственные смарт-контракты для самых разных целей!
Pragma — это ключевое слово, с помощью которого компилятор проверяет соответствие версии Solidity требуемой. Если версии совпадают, файл может быть выполнен. В противном случае компилятор возвращает ошибку.
В определение контракта необходимо всегда включать последнюю версию Solidity. Сведения о текущей версии можно получить на веб-сайте Solidity. В исходном файле необходимо использовать самую последнюю версию.
Определяющая версию директива Pragma выглядит следующим образом:
Эта строка указывает, что для компиляции исходного файла будет использоваться версия компилятора от 0.7.0
до 0.7.9
. В результате изменений, которые будут внесены в версии 0.8.0
, компиляция этого исходного файла, скорее всего, завершится неудачно.
Переменные состояния являются основными элементами любого исходного файла Solidity. Значения переменных состояния навсегда сохраняются в хранилище контрактов.
Примечание
В начале исходного файла контракта всегда указывается определение contract ContractName.
В этом примере используется переменная состояния price с типом uint. Целочисленный тип uint указывает, что эта переменная может содержать целое 256-разрядное число без знака. Таким образом, в ней могут храниться положительные числа в диапазоне от 0 до 2256–1.
В определении любой переменной необходимо указывать ее тип и имя.
Кроме того, вы можете задать видимость переменной состояния следующим образом:
В рамках контракта исполняемые единицы кода называются функциями. С помощью функций описываются отдельные действия, необходимые для выполнения общей задачи. Функции можно использовать повторно и вызывать из других исходных файлов, например библиотек. Поведение функций в Solidity аналогично другим языкам программирования.
Ниже приводится простой пример определения функции:
В этом коде показана функция с именем buy
, которая имеет уровень видимости public и, таким образом, доступна из других контрактов. Поддерживаются следующие описатели видимости функций: public, private, internal и external.
Вызов функции может быть как внутренним, так и внешним (из другого контракта). Функции могут принимать параметры и возвращать переменные, с помощью которых осуществляется передача параметров и значений между ними.
Ниже приведен пример функции, которая принимает целочисленный параметр price
и возвращает целое число:
С помощью модификаторов можно изменять поведение функций. Если задан модификатор, перед выполнением функции проверяется соответствующее условие. Например, таким образом функция может проверять наличие прав продавца у пользователя, прежде чем выставить какой-либо товар на продажу.
В этом примере используются следующие элементы:
onlySeller
, который описывает, что только продавец может выставлять товар на продажу._;
, который указывает место вставки тела функции.onlySeller
.В определении функции также можно использовать следующие модификаторы:
С помощью событий описываются действия, которые выполняются в контракте. Как и функции, события используют параметры, которые необходимо задавать при их вызове.
Чтобы вызвать событие, необходимо использовать ключевое слово emit, указав имя события и его параметры.
При вызове события оно фиксируется как транзакция в журнале транзакций, который представляет собой специальную структуру данных в блокчейне. Такие журналы связываются с адресом контракта, включаются в блокчейн и остаются в нем навсегда. Журнал и содержащиеся в нем данные о событиях недоступны из контрактов и не могут быть изменены.
Типы значений передают значения и копируются при использовании. К основным типам значений, которые будут
использоваться при написании контрактов, можно отнести целочисленные, логические, строковые литералы, адреса и перечисления.
Целочисленные типы используются в любом исходном файле Solidity. Они представляют целые числа и могут быть со знаком или без него. В целочисленных типах может храниться от 8 до 256 разрядов.
Если число бит не задано явно, оно равно 256 битам по умолчанию.
К целым числам могут применяться следующие операции:
<=
, <
, ==
, !=
, >=
, >
& (and)
, | (or)
, ^ (bitwise exclusive)
, ~ (bitwise negation)
+ (addition)
,- (subtraction)
, * (multiplication)
, / (division)
, % (modulo)
, ** (exponential)
Ниже приведены примеры определения целочисленных значений:
Логические значения определяются с помощью ключевого слова bool. Они всегда имеют значение либо true
, либо false
.
Ниже показано, как их можно определить:
Логические значения обычно используются в инструкциях сравнения. Пример:
Кроме того, логические значения можно использовать в параметрах функций и типах возвращаемых значений.
Строковые литералы также используются в большинстве файлов контрактов. Они представляют собой последовательность символов или слов, заключенную в двойные или одинарные кавычки.
Кроме того, вместе со строковыми литералами можно использовать следующие escape-символы:
\
— escape-последовательность для новой строки\n
— новая строка\r
— возврат каретки\t
— табуляцияАдрес — это тип с 20-байтовым значением, которое представляет учетную запись пользователя Ethereum. Для определения адреса можно использовать обычный тип address или address payable.
Разница между ними заключается в том, что тип address payable определяет адрес, по которому можно отправлять "эфиры", для чего в нем используются дополнительные члены transfer
и send
.
В языке Solidity можно использовать перечисления для создания определяемого пользователем типа данных. Как следует из названия, содержащиеся в таких типах значения определяет создатель контракта. С помощью перечислений можно определять набор вариантов выбора, один из которых является обязательным.
Например, с помощью перечисления можно задать набор возможных состояний элемента. Для удобства перечисление можно представить как несколько заранее определенных вариантов ответа на вопрос, из которых необходимо выбрать один. Перечисления можно объявлять в определениях контракта или библиотеки.
Для написания контрактов вам также потребуется понимать принципы использования ссылочных типов.
В отличие от типов значений, которые всегда передают независимую копию значения, ссылочные типы указывают на расположение данных для значения. Поддерживаются следующие ссылочные типы: структуры, массивы и сопоставления.
При использовании ссылочного типа необходимо явно указать место хранения данных для него. Расположение данных для типа можно указать следующими способами:
memory:
storage:
calldata:
Ссылочные типы всегда создают независимую копию данных.
Ниже приведен пример использования ссылочного типа:
Массивы используются для хранения схожих данных в структуре набора данных. Размер массива может быть фиксирован или задаваться динамически. Индекс массива начинаются с 0.
Чтобы создать массив фиксированного размера k
, содержащий элементы типа T
, следует использовать выражение T[k]
. Массивы динамического размера задаются следующим образом: T[]
.
Элементы массива могут иметь любой тип. Например, массив может содержать элементы типа uint, memory или byte. Также массивы могут включать сопоставления или структуры.
В следующем примере показано создание массива:
Для управления массивами и получения сведений о них можно использовать следующие члены:
Ниже приводится несколько примеров.
Структуры — это настраиваемые типы, с помощью которых пользователь может определять представление реальных объектов. Как правило, структуры используются в качестве схемы или для представления записей.
Примеры:
Сопоставления представляют собой пары из ключа и значения, которые инкапсулируются или упаковываются вместе. Ближайшими аналогами сопоставлений являются словари или объекты JavaScript. Как правило, сопоставления используются для моделирования реальных объектов и более быстрого поиска данных. Благодаря поддержке различных типов значений, включая такие сложные, как структуры, этот тип является универсальным и удобным для восприятия человеком.
В следующем примере кода используется структура Items_Schema
и сохраняется словарь со списком элементов, представленных структурой Items_Schema
. Таким образом, с помощью сопоставлений можно имитировать базу данных.
Примечание
В сигнатуре сопоставления uint256 => Items_Schema указывается, что ключи имеют целочисленный тип без знака, а значения являются структурой Items_Schema.
Рассмотрим основные компоненты этого смарт-контракта более подробно:
buyer
, seller
и balances
;ListItem
и PurchasedItem
;ItemAvailable
и ItemPurchased
.msg.sender
и устанавливает начальное состояние ItemAvailable
. Этот конструктор вызывается при создании контракта.buy
, которая принимает три параметра: seller
, buyer
и price
. Перед совершением покупки проверяется наличие у покупателя достаточных средств. Если это так, осуществляется перевод денег от покупателя продавцу, после чего выдается сообщение.
event PurchasedItem
Event()
. Все необходимые аргументы указываются внутри круглых скобок.
Исследование, описанное в статье про solidity, подчеркивает ее значимость в современном мире. Надеюсь, что теперь ты понял что такое solidity, самовыполняющийся контракт и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Объектно-ориентированное программирование ООП
Комментарии
Оставить комментарий
Объектно-ориентированное программирование ООП
Термины: Объектно-ориентированное программирование ООП