Типы значений

Завершено

В этом модуле описываются основные типы значений в языке Solidity. Типы значений передают значения и копируются при использовании. Основные типы значений, которые будут использоваться при написании контрактов, включают целое число, логическое число, string literalадрес и перечисление.

Целые числа

Целочисленные типы используются в любом исходном файле Solidity. Они представляют целые числа и могут быть со знаком или без него. Размер целых чисел варьируется от 8 бит до 256 бит.

  • Со знаком: включает отрицательные и положительные числа. Может быть представлено как int.
  • Unsigned: включает только положительные числа. Может быть представлено как uint.

Если число бит не задано явно, оно равно 256 битам по умолчанию.

К целым числам могут применяться следующие операции:

  • Операторы сравнения: <=, <, ==, !=, >=, >
  • Двоичные операторы: & (and), | (or), ^ (bitwise exclusive), ~ (bitwise negation)
  • Арифметические операторы: + (addition),- (subtraction), * (multiplication), / (division), % (modulo), ** (exponential)

Ниже приведены примеры определения целочисленных значений:

int32 price = 25; // signed 32 bit integer
uint256 balance = 1000; // unsigned 256 bit integer

balance - price; // 975
2 * price; // 50
price % 2; // 1

Логические значения

Логические значения определяются с помощью ключевого слова bool. Они всегда имеют значение либо true, либо false.

Ниже показано, как их можно определить:

bool forSale; //true if an item is for sale
bool purchased; //true if an item has been purchased

Логические значения обычно используются в инструкциях сравнения. Например:

if(balance > 0 & balance > price) {
    return true;
}

if(price > balance) {
    return false;
}

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

function buy(int price) returns (bool success) {
    // ...
}

Строковые литералы

String literals также используются в большинстве файлов контрактов. Они представляют собой последовательность символов или слов, заключенную в двойные или одинарные кавычки.

    String shipped = "shipped"; // shipped
    String delivered = 'delivered'; // delivered
    String newItem = "newItem"; // newItem

Кроме того, вместе со string literals можно использовать следующие escape-символы:

  • \<newline> — escape-последовательность для новой строки
  • \n — новая строка
  • \r — возврат каретки
  • \t — табуляция

Адрес

Адрес — это тип с 20-байтовым значением, которое представляет учетную запись пользователя Ethereum. Для определения адреса можно использовать обычный тип address или address payable.

Разница между ними заключается в том, что тип address payable определяет адрес, по которому можно отправлять "эфиры", для чего в нем используются дополнительные члены transfer и send.

address payable public seller; // account for the seller
address payable public buyer; // account for the user

function transfer(address buyer, uint price) {
    buyer.transfer(price); // the transfer member transfers the price of the item
}

Перечисления

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

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

enum Status { 
    Pending,
    Shipped,
    Delivered 
}

Status public status;

constructor() public {
    status = Status.Pending;
}