Solidity - это наиболее используемый язык для написания смарт контрактов. Он компилируется для виртуальной машины EVM Ethereum. Это статически типизированный язык высокого уровня, который включает в себя несколько функций ООП.
Смарт контракты - это маленькие программы, способные изменять состояния в сети Ethereum. Состояния - это информация (обычно создаваемая переменными, определенными в смарт контрактах), хранящаяся в блокчейне. Например, баланс Эфира (или другой базовой монеты) на данном счете - это состояние Ethereum. В широком смысле EVM - это машина, которая меняет состояния на основе транзакций.
Главная особенность Ethereum заключается в том, что это децентрализованная сеть. Ее мировое состояние (полное состояние) реплицируется на нескольких компьютерах (клиентах/серверах) по всему миру, называемых узлами. То, что все узлы поддерживают одинаковое состояние мира, обеспечивается механизмом консенсуса блокчейна.
Тот факт, что Ethereum является децентрализованной сетью, основанной на протоколе p2p (peer-to-peer), предполагает, что приложения, взаимодействующие с блокчейном, мы называем децентрализованными приложениями (dApps).
В этом курсе мы научим вас создавать смарт контракты для EVM, то есть смарт контракты, которые будут работать на любом блокчейне, реализующем EVM. Попутно мы разберемся, что такое мировое состояние и как транзакции изменяют такие состояния.
Remix IDE (среда проектирования и выполнения кода)
Виртуальная машина Ethereum имеет свой собственный язык ассемблера, и какой бы язык высокого уровня ни использовался, его необходимо скомпилировать для EVM. Компилятор, который компилирует Solidity для EVM, - это solc. Существуют и другие языки, которые компилируются для EVM, например Vyper, но наиболее используемым языком является Solidity.
Самый простой способ написать, скомпилировать и развернуть смарт контракт - это использование интегрированной платформы разработки, IDE. В этом курсе мы будем использовать онлайн IDE под названием Remix.
Доступ к Remix можно получить по адресу remix.ethereum.org.
![Онлайн IDE Remix. Онлайн IDE Remix.](https://habrastorage.org/getpro/habr/upload_files/ab8/8c6/91e/ab88c691e06d3682becdb4961a0e9a52.jpg)
Чтобы начать делать новый контракт, создайте новый файл в папке \textit{contracts}, расположенной в левой части экрана. Мы можем видеть это на рисунке ниже.
![Создание нового файла на Remix. Создание нового файла на Remix.](https://habrastorage.org/getpro/habr/upload_files/5ca/ea0/7b5/5caea07b5795dd29fcd5ea443aae4222.jpg)
Назовем этот новый файл HelloWorld.sol. Расширение для файлов Solidity указывается как - ".sol". Remix откроет этот новый файл, и мы сможем начать писать смарт контракт.
Начнем с указания версии компилятора, которую мы хотим запустить, с помощью директивы pragma, как
pragma solidity ^0.8.7;
Существует несколько способов определить используемую версию компилятора. Самый простой - указать полную версию, например, 0.8.7. В общем случае, однако, мы хотим использовать любую версию, большую, чем указанная, если она не претерпела изменений, которые могут нарушить обратную совместимость. Для этого мы используем символ "^''". Это означает, что компилятор может быть версии 0.8.8, 0.8.9 и т.д., но не версии 0.9.x и выше.
Привет Мир (Hello World)
Чтобы указать, что мы начнем писать новый контракт, мы используем предложение contract, как в примере ниже
contract HelloWorld {...}
Solidity использует синтаксис, основанный на фигурных скобках { }, подобно C, Java, JavaScript и т.д. Все, что находится внутри contract, будет частью нашего контракта, но компилятор также будет использовать объявления за пределами этой области, как мы увидим в последующих уроках.
Программисты могут подумать, что объявление контракта похоже на объявление нового класса. На самом деле, контракты могут быть инстанцированы другими контрактами, подобно тому, как мы делаем это с объектами. Это мы увидим позже.
Структура контракта состоит из нескольких компонентов. Первое, что мы увидим - это объявление переменных состояния, которые станут частью мирового состояния блокчейна. В этом примере мы начнем с объявления переменной состояния типа string.
string name = "Hello World";
Solidity - типизированный язык, поэтому нам необходимо явно указать тип объявляемой переменной. Строка - это ссылочный тип Solidity (подробнее об этом в последующих уроках). Имя переменной - name, и она инициализируется значением Hello World.
В Solidity переменные не нужно инициализировать явно, но если они не инициализированы во время объявления, то они инициализируются значением по умолчанию. В случае со строкой это будет пустое значение или '' ''.
Все переменные, которые мы определяем вне функций, называются переменными состояния и являются постоянными в блокчейне. Во время развертывания контракта выделяется специальное место для хранения их значения. Все переменные, которые мы хотим сделать постоянными (то есть создать состояния), должны быть объявлены в этом пространстве.
Чтобы сохранить контракт, используйте Ctrl+S (или эквивалент в вашей операционной системе). Контракт автоматически скомпилируется. При этом обратите внимание, что компилятор выдал предупреждение, обозначенное оранжевым восклицательным знаком. См. рисунок ниже.
![Remix предупреждает, что в коде что-то не так. Remix предупреждает, что в коде что-то не так.](https://habrastorage.org/getpro/habr/upload_files/f16/134/0a4/f161340a445be315d3f7714bc5f39e87.jpg)
При наведении курсора на восклицательный знак указывается причина предупреждения. В нашем случае причина предупреждения следующая:
Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing “SPDX-License-Identifier: “ to each source file.
(Предупреждение: Идентификатор лицензии SPDX не указан в исходном файле. Перед публикацией рассмотрите возможность добавления комментария, содержащего "SPDX-License-Identifier: " к каждому исходному файлу.)
Предупреждение возникло потому, что рекомендуется включить указание лицензии, поскольку ваш код будет публичным. Хотя это не является обязательным, давайте сделаем это, добавив следующую строку перед директивой компилятора.
//SPDX-License-Identifier: MIT
Мы должны помнить о предупреждениях компилятора. Хотя они не препятствуют компиляции контракта, их необходимо исправить перед публикацией.
Включив приведенную выше строку в качестве первой строки кода, сохраните файл и обратите внимание, что предупреждение исчезнет. Поздравляем, вы написали свой первый смарт-контракт на Solidity, хотя он не делает ничего, кроме хранения значения Hello World в качестве переменной состояния на Ethereum.
Развертывание контракта (деплой)
После компиляции контракта мы должны развернуть его на блокчейне. Отправка контракта в сеть Ethereum стоит Ether, чего мы хотим избежать. Поэтому мы развернем контракт в тестовой сети.
Первоначально мы внедрим его в локальную тестовую сеть, которая имитирует поведение Ethereum. В Remix четвертый пункт меню слева открывает экран развертывания, как показано на рисунке ниже.
![Развертывание может быть выполнено в четвертом пункте меню. Развертывание может быть выполнено в четвертом пункте меню.](https://habrastorage.org/getpro/habr/upload_files/23a/47c/255/23a47c255d5bf8fcdc192a2fe8158f2a.jpg)
Пока не обращайте особого внимания на опции на экране. Просто убедитесь, что среда установлена на JavaScript VM (Лондон или Берлин). London и Berlin - это разные версии EVM, но разница между ними невелика.
Нажмите Deploy и обратите внимание, что в нижней части Remix появится новая информация.
![Remix укажет, была ли транзакция успешной или нет, и покажет адрес контракта. Remix укажет, была ли транзакция успешной или нет, и покажет адрес контракта.](https://habrastorage.org/getpro/habr/upload_files/19b/819/53d/19b81953d09be56d3504909f8738eba1.jpg)
В нижней левой части экрана Remix перечисляет опубликованные контракты. Обратите внимание, что теперь он будет показывать наличие опубликованного контракта, а также его соответствующий адрес.
В правом нижнем углу экрана Remix отображает результат последних транзакций. В данном случае транзакция только одна - разблокировка контракта. Зеленая отметка означает, что транзакция прошла успешно.
Еще раз поздравляем, помимо написания первого контракта, вы только что опубликовали его на блокчейне (пусть и локальном тестовом).
Заключение
На данный урок это всё.
Кстати, мы сейчас ищем командных людей или желающих ими стать, для работы над единой большой целью. Если интересно, более подробную информацию смотрите в ссылках ниже.
Да прибудет с вами МуркаChain! :)