Основы языка

Завершено

Как правило, все контракты Solidity содержат следующие элементы:

  • Директивы Pragma
  • Переменные состояния
  • Функции
  • События

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

Поняв эти принципы, вы сможете начать создавать собственные смарт-контракты для самых разных целей!

Директивы Pragma

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

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

Определяющая версию директива Pragma выглядит следующим образом:

pragma solidity ^0.7.0;

Эта строка указывает, что для компиляции исходного файла будет использоваться версия компилятора от 0.7.0 до 0.7.9. В результате изменений, которые будут внесены в версии 0.8.0, компиляция этого исходного файла, скорее всего, завершится неудачно.

Переменные состояния

Переменные состояния являются основными элементами любого исходного файла Solidity. Значения переменных состояния навсегда сохраняются в хранилище контрактов.

pragma solidity >0.7.0 <0.8.0;

contract Marketplace {
    uint price; // State variable  

Примечание.

В начале исходного файла контракта всегда указывается определение contract ContractName.

В этом примере используется переменная состояния price с типом uint. Целочисленный тип uint указывает, что эта переменная может содержать целое 256-разрядное число без знака. Таким образом, в ней могут храниться положительные числа в диапазоне от 0 до 2256–1.

В определении любой переменной необходимо указывать ее тип и имя.

Кроме того, вы можете задать видимость переменной состояния следующим образом:

  • public — элемент интерфейса контрактов, доступный из других контрактов.
  • internal — элемент, доступный только из текущего контракта.
  • Закрытый — элемент, доступный только в том контракте, в котором он определен.

Функции

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

Ниже приводится базовый пример определения функции:

pragma solidity >0.7.0 <0.8.0;

contract Marketplace {
    function buy() public {
        // ...
    }
}

В этом коде показана функция с именем buy, которая имеет уровень видимости public и, таким образом, доступна из других контрактов. Поддерживаются следующие описатели видимости функций: public, private, internal и external.

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

Ниже приведен пример функции, которая принимает целочисленный параметр price и возвращает целое число:

pragma solidity >0.7.0 <0.8.0;

contract Marketplace {
    function buy(uint price) public returns (uint) {
        // ...
    }
}

Модификаторы функций

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

pragma solidity >0.7.0 <0.8.0;

contract Marketplace {
    address public seller;

    modifier onlySeller() {
        require(
            msg.sender == seller,
            "Only seller can put an item up for sale."
        );
        _;
    }

    function listItem() public view onlySeller {
        // ...
    }
}

В этом примере используются следующие элементы:

  • Переменная с типом address, в которой будет храниться 20-байтовый Ethereum-адрес пользователя с правами продавца. С этими переменными вы ознакомитесь более подробно далее в рамках этого модуля.
  • Модификатор с именем onlySeller, который описывает, что только продавец может выставлять товар на продажу.
  • Специальный символ _;, который указывает место вставки тела функции.
  • Определение функции, в котором используется модификатор onlySeller.

В определении функции также можно использовать следующие модификаторы:

  • pure — описывает функции, для которых не допускается изменение состояния или доступ к сведениям о нем.
  • view — описывает функции, для которых не допускается изменение состояния.
  • payable — описывает функции, которые могут принимать "эфиры".

События

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

Чтобы вызвать событие, необходимо использовать ключевое слово emit, указав имя события и его параметры.

pragma solidity >0.7.0 <0.8.0;

contract Marketplace {
    event PurchasedItem(address buyer, uint price);

    function buy() public {
        // ...
        emit PurchasedItem(msg.sender, msg.value);
    }
}

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