Всесторонний обзор синтаксиса Solidity, типов данных и управляющих структур
1. Что такое солидность?
Solidity — это язык программирования, используемый для создания смарт-контрактов, которые представляют собой самоисполняющиеся программы, работающие на блокчейне Ethereum. Он похож на JavaScript по своему синтаксису и структуре и позволяет разработчикам писать код для смарт-контрактов, которые могут выполняться без необходимости в посредниках, таких как банки или правовые системы. С помощью Solidity разработчики могут создавать децентрализованные приложения или dApps, работающие без доверия и безопасности, что является одним из основных преимуществ блокчейна Ethereum.
2. Что такое РЕМИКС?
REMIX (URL — https://remix.ethereum.org) — это IDE на основе браузера. Проще говоря, это чем-то похоже на VS Code, но специально для написания смарт-контрактов. Контракты написаны на языке Solidity.
3. Как использовать РЕМИКС?
Использовать REMIX довольно просто, вам просто нужно написать смарт-контракт, скомпилировать и развернуть его.
4. Основы Solidity
Как и в любом другом языке, в Solidity есть формат, которому необходимо следовать.
Вот так выглядит типовой договор.
Давайте сломаем это для вас.
· прагматическая прочность ^0.8.0; — Это прагма версии, указывающая версию Solidity, используемую для компиляции контракта.
· контракт SomeContract { } — это определение контракта, где «SomeContract» — это имя контракта.
· Код контракта записывается между фигурными скобками ‘{‘ & ‘}’.
5. Типы данных в Solidity
Типы данных в основном классифицируются как значения или ссылки.
· Значения — это данные, в которых хранится значение. Они могут быть многих типов. Например — логическое значение, целое число, строка и т. д.
· Ссылки — в них хранится ссылка (адрес) на место, где хранятся фактические данные.
6. Наиболее распространенные типы значений и ссылок в Solidity
Наиболее распространенным типом значения в Solidity является uint, что означает целое число без знака. Этот тип данных представляет собой неотрицательные целые числа и может иметь различный размер от 8 до 256 бит. Тип данных uint обычно используется для представления таких значений, как балансы, метки времени и другие числовые значения в смарт-контрактах. Он также используется для арифметических операций, таких как сложение, вычитание, умножение и деление.
Другим распространенным типом значения в Solidity является тип данных адреса. Этот тип данных представляет адреса Ethereum и может использоваться для отправки и получения эфира или других токенов.
Solidity также поддерживает другие типы значений, такие как bool (логическое значение), string (текст), bytes (двоичные данные) и массивы. Эти типы значений необходимы для создания сложных смарт-контрактов, которые могут обрабатывать различные типы данных.
7. Базовый синтаксис для написания функции в Solidity
Чтобы написать функцию в Solidity, вам нужно использовать ключевое слово function
, за которым следует имя функции, входные параметры (если есть) и тело функции. Вот основной синтаксис для написания функции в Solidity:
Разберем этот синтаксис:
- функция: ключевое слово, указывающее, что вы определяете функцию.
- functionIntro: Имя функции. Это должно быть описательное имя, указывающее, что делает функция.
- pure или view или payable: модификатор изменчивости состояния функции. Это указывает, изменяет ли функция состояние контракта или нет, и может ли он получать эфир или нет. pure означает, что функция не читает и не изменяет состояние контракта и не получает эфир, view означает, что функция не изменяет состояние контракта, но может читать состояние, а payable означает, что функция может получать эфир и может изменить состояние контракта.
- return: тип возвращаемого значения функции. Если функция не возвращает значение, вы можете использовать void в качестве типа возвращаемого значения.
8. Переменные в Solidity
В Solidity существует три типа переменных: локальные переменные, переменные состояния и глобальные переменные.
· Локальные переменные: Локальные переменные объявляются внутри функции или блока и доступны только в пределах этой области. Они создаются при вызове функции и уничтожаются при выходе из функции. Локальные переменные могут быть любого типа, включая uint
, bool
, string
, bytes
, enum
, struct
, array
и mapping
. Локальные переменные используются для хранения промежуточных результатов или для упрощения кода, избегая необходимости многократного вычисления одного и того же значения.
· Переменные состояния: переменные состояния объявляются вне какой-либо функции и хранятся в блокчейне как часть хранилища контракта. Они доступны из любой функции внутри контракта, а также из внешних контрактов и транзакций. Переменные состояния могут быть любого типа, включая uint
, bool
, string
, bytes
, enum
, struct
, array
и mapping
. Переменные состояния используются для хранения данных, которые необходимо сохранять при вызовах функций, таких как баланс контракта или пользовательские данные.
· Глобальные переменные: глобальные переменные — это предопределенные переменные, доступные для всех контрактов в блокчейне Ethereum. Среди них msg.sender
, msg.value
, block.timestamp
, block.number
и now
. Эти переменные используются для предоставления контекста и информации о текущем состоянии блокчейна, например номер текущего блока, отметка времени и отправитель транзакции.
9. Конструктор в Solidity
Конструктор — это специальный метод в любом объектно-ориентированном языке программирования, который вызывается всякий раз, когда инициализируется объект класса. В случае с Solidity все по-другому: Solidity предоставляет объявление конструктора внутри смарт-контракта и вызывается только один раз при развертывании контракта и используется для инициализации состояния контракта. Конструктор по умолчанию создается компилятором, если нет явно определенного конструктора.
Пример. В приведенном ниже примере в contractstructorExample создается конструктор для инициализации переменной состояния str.
10. Модификатор функции
В Solidity модификатор функции — это отдельный фрагмент кода, который можно применять к нескольким функциям в рамках контракта, что позволяет повторно использовать код и упростить структуру контракта.
Его синтаксис выглядит примерно так
Вот пример простого модификатора функции в Solidity, который добавляет простой контроль доступа к функции:
Эту же функцию можно записать и без модификатора.
11. Выдает ошибку в Solidity
В Solidity вы можете использовать функции revert()
, require()
и assert()
для выдачи ошибок и отмены вызова функции при определенных условиях.
· revert()
: Эта функция используется для отмены текущей транзакции и возврата оставшегося газа вызывающей стороне. Он часто используется для обозначения ожидаемого состояния ошибки, такого как неверный ввод или недостаточно средств. Вы можете включить строку сообщения об ошибке в качестве аргумента, чтобы предоставить больше информации об ошибке.
· require()
: эта функция аналогична revert()
, но обычно используется для проверки ввода и контроля доступа. Если условие, указанное в операторе require()
, не выполняется, функция вернется в исходное состояние, и весь использованный газ будет израсходован.
· assert()
: Эта функция используется для проверки наличия непредвиденных или невозможных условий в коде контракта. Если условие, указанное в операторе assert()
, не выполняется, это указывает на ошибку в коде, и функция вернется.
Вот пример того, как использовать require()
, чтобы проверить, равна ли переменная определенному значению, и вернуть функцию, если это не так:
В этом примере функция myFunction()
проверяет, равен ли аргумент newValue
42
, используя оператор require()
. Если условие не выполняется, функция вернется в исходное состояние, и весь использованный газ будет израсходован. Если условие выполнено, функция установит значение myVariable
в новое значение.
12. События в Solidity
В Solidity событие — это способ отправки контрактом уведомления или сообщения журнала, которые могут быть обнаружены внешними приложениями или другими контрактами. События полезны для отслеживания важных изменений состояния контракта, а также для предоставления пользователям или другим контрактам способа уведомления об этих изменениях.
События определяются с помощью ключевого слова event
и обычно объявляются в верхней части контракта, например:
Вот как это выглядит на REMIX:
13. Что такое ERC?
ERC расшифровывается как Ethereum Request for Comment и представляет собой техническую спецификацию для реализации стандартного интерфейса для смарт-контрактов в блокчейне Ethereum.
Стандарт ERC определяет набор правил и рекомендаций, которым должны следовать разработчики при создании смарт-контрактов на Ethereum. . Целью стандарта ERC является обеспечение функциональной совместимости и совместимости между различными смарт-контрактами и приложениями в сети Ethereum.