Bytes (тип данных в Solidity)
Bytes - тип данных, хранящий последовательность байтов произвольной длины. Байтовые массивы могут использоваться для реализации различных функций, таких как шифрование, хеширование, компрессия данных и т.д.
Все данные на низком уровне в EVM хранятся с прямым порядком байтов. Ethereum и EVM — это виртуальная машина, использующая формат Big Endian. EVM использует 32-байтовые массивы для управления данными.
Способы работы с Bytes
В Solidity есть различные способы работы с байтами. Вот некоторые из наиболее распространенных:
Динамические байтовые массивы
bytes
: Это динамический массив байтов, содержащий произвольное количество байтов. Создается переменная bytes
, следующим образом:
bytes memory myBytes = new bytes(10);
Таким образом мы создали переменную bytes
с именем myBytes
, которая содержит 10 байтов.
Фиксированные байтовые массивы
Фиксированные байтовые массивы bytes1
, bytes2
, bytes3
, ...
, bytes32
содержат от 1 до 32 байтов. Создать переменную bytes2
, можно, так:
bytes2 myBytes = 0x1234;
Мы задали переменную bytes2
с именем myBytes
и присвоили ей значение 0x1234
.
Если вы можете ограничится конкретной длиной лучше использовать фиксированные байтовые массивы от bytes1
до bytes32
, для экономии gas.
При работе с байтами в Solidity важно учитывать их размер и правильную обработку, во избежание багов и уязвимостей.
Битовые операции в Solidity
В Solidity доступы следующие битовые операторы:
&
(AND)|
(OR)^
(XOR)~
(NEGATION)
Для эксперимента мы будем использовать тип данных bytes1
( тоже самое, что и byte
) для двух переменных : a
и b
. Мы инициализируем их в Solidity, используя их шестнадцатеричное представление и будем применять к ним операции and, or, xor, negation.
bytes1 a = 0xb5; // [10110101]
bytes1 b = 0x56; // [01010110]
Операция &
(AND) или (логическое И)
Возвращает результат, который является битовым И каждого соответствующего бита двух операндов.
a & b; // Result: 0x14 [00010100]
Операция |
(OR) или (логическое ИЛИ)
Возвращает результат, который является битовым ИЛИ каждого соответствующего бита двух операндов.
a | b; // Result: 0xf7 [11110111]
Операция ^
(XOR) или (исключающее ИЛИ)
Возвращает результат, который является битовым исключающим ИЛИ каждого соответствующего бита двух операндов.
a ^ b; // Result: 0xe3 [11100011]
Операция ~
(NEGATION) или (логическое Отрицание)
Инвертирует каждый бит в операнде.
uint1 a = 0xb5; // 10110101
uint1 b = ~a; // 01001010
Операции смещения
В Solidity можно применять операции смещения вправо или влево по отношению к битам:
<<
(сдвиг влево): Сдвигает биты в операнде на указанное количество позиций влево.
uint8 a = 0x0c; // 00001100
uint8 b = a << 2; // 00110000
>>
(сдвиг вправо): Сдвигает биты в операнде на указанное количество позиций вправо.
uint8 a = 0x0c; // 00001100
uint8 b = a >> 2; // 00000011
Операторы сравнения
К байтовым массивам можно применять операторы сравнения, в следствии чего будет возвращена логическая переменная bool
со значением true
или false
. Доступные операторы сравнения байтовых массивов в языке программирования Solidity:
<=
меньше или равно;<
меньше;==
равно;!=
не равно;>=
больше или равно;>
больше;
Подпишись и получи доступ к бесплатным курсам и обучающим материалам от Solidity University! Изучай Solidity и Блокчейн Разработку вместе с нами!