Глава 3
____________________________________
[ 68 ]
___________________________________
ры) — это
memory
, по умолчанию для локальных переменных — это
storage
. Для
статических переменных обычно также назначается расположение
storage
.
Расположение данных имеет значение, поскольку от него зависит поведение опера-
торов присваивания:
присваивание между переменными в хранилище (
storage
) и переменными в па-
мяти (
memory
) всегда создает независимую копию данных. Но операция присваи-
вания между сложными типами данных, если они оба расположены в памяти, не
приводит к созданию копии;
присваивание статической переменной (даже если источником является другая
статическая переменная) всегда создает независимую копию данных;
вы не можете присвоить данные сложного типа, находящиеся в памяти, статиче-
ской переменной, находящейся в локальном хранилище;
в случае, когда статическая переменная присваивается локальной переменной,
локальная переменная получает указатель на статическую переменную. Это зна-
чит, что локальная переменная становится указателем.
Что такое типы данных?
Solidity — это язык со статической типизацией, то есть типы переменных должны
быть заранее определены. По умолчанию все биты переменных сброшены
в ноль. Если переменная объявлена внутри функции, областью видимости пере-
менной является вся функция, независимо от места объявления.
Рассмотрим различные типы данных в языке Solidity:
самый простой тип данных —
bool
. Он может хранить только булевы значения
true
или
false
;
типы
uint8
,
uint16
,
uint24
…
uint256
применяются для хранения беззнаковых
целых чисел длиной 8 битов, 16 битов, 24 бита … 256 битов соответственно.
Аналогично,
int8
,
int16
…
int256
хранят целые числа со знаком длиной 8 битов,
16 битов … 256 битов соответственно. Служебные слова
uint
и
int
являются
псевдонимами для
uint256
и
int256
. Служебные слова
ufixed
и
fixed
обозначают
дробные числа. Типы
ufixed0x8
,
ufixed0x16
…
ufixed0x256
— это беззнаковые
дробные числа длиной 8 битов, 16 битов … 256 битов соответственно. Если тре-
буется сохранить число с разрядностью большей, чем 256, то используется
256-битовый тип, и в этом случае хранится приближенное (усеченное) значение;
тип
address
применяется для хранения шестнадцатеричного литерала длиной до
20 байтов, используемого для адресов Ethereum. Тип
address
расширяется свой-
ствами
balance
и
send
: свойство
balance
применяется при проверке баланса опре-
деленного адреса Ethereum, а свойство
send
— при переводе эфира на указанный
адрес. Метод
send
получает сумму в Wei, которую надо перевести, и возвращает
значение
true
или
false
в зависимости от того, был ли перевод успешно выпол-
Разработка
смарт-контрактов
____________________________________
[ 69 ]
___________________________________
нен. Сумма в Wei вычитается из контракта, который вызвал метод
send
. Вы мо-
жете использовать в коде Solidity префикс
0x
для обозначения шестнадцатерич-
ного представления значений переменных.
Массивы
Solidity поддерживает обычные и байтовые массивы. Размер массива может быть
постоянным или динамически изменяемым. Также поддерживаются многомерные
массивы.
bytes1
,
bytes2
,
bytes3
, ...,
bytes32
— это типы байтовых массивов.
byte
является
псевдонимом типа
bytes1
.
Рассмотрим пример использования обычных массивов (листинг 3.2).
Листинг 3.2. Пример использования массивов
contract sample{
//массив с динамическим размером
//везде, где виден литерал массива, создается новый массив
//здесь myArray хранит массив с размером [0, 0].
//тип массива определяется типом его значений,
//следовательно, вы не можете назначить пустой литерал массива
int[] myArray = [0, 0];
function sample(uint index, int value){
//индекс массива должен иметь тип uint256
myArray[index]
=
value;
//myArray2 хранит указатель на myArray
int[]
myArray2
=
myArray;
//массив постоянного размера в памяти
//здесь мы вынуждены применить uint24, потому что
//максимальное значение 99999,
//и требуется 24 бита для хранения
//данное ограничение действует для литералов в памяти,
//потому что стоимость памяти высока.
//так как [1, 2, 99999] - это тип uint24, следовательно
//myArray3 тоже
//должен иметь такой же тип, чтобы хранить указатель
uint24[3] memory myArray3 = [1, 2, 99999];
Do'stlaringiz bilan baham: |