Каковы преимущества использования string
типов данных bytes32
для представления текстовых данных. Кажется, мой контракт сталкивается с исключением из газа, когда я переключаю структуры данных с bytes32
на string
.
string
вместо bytes32
?Используйте string
для строковых данных произвольной длины (UTF-8), длина которых превышает 32 байта. Фронтенды могут проще декодировать длинную строку, используя такие методы, как web3.toAscii или UTF-8 (когда проблемы устранены), вместо того, чтобы реализовывать логику декодирования UTF-8 серии файлов bytes32
.
Как правило, используйте
bytes
для необработанных байтовых данныхstring
произвольной длины и строковых данных произвольной длины (UTF-8). Если вы можете ограничить длину определенным количеством байтов, всегда используйте один из нихbytes1
,bytes32
потому что они намного дешевле.
Строковые литералы также могут быть полезны или удобны:
Строковые литералы пишутся либо с двойными, либо с одинарными кавычками ("foo" или "bar")...
Строковые литералы поддерживают escape-символы, такие как \n, \xNN и \uNNNN. \xNN принимает шестнадцатеричное значение и вставляет соответствующий байт, а \uNNNN принимает кодовую точку Unicode и вставляет последовательность UTF-8.
bytes32
вместо string
?Ответ на вопрос Почему в примерах Solidity используется тип bytes32 вместо строки?
bytes32
использует меньше газа, потому что он умещается в одном слове EVM и string
представляет собой тип с динамическим размером, который имеет текущие ограничения в Solidity (например, не может быть возвращен из функции в контракт).
Как сказано в другом посте, вы хотите использовать строки только для динамически распределяемых данных, иначе Byte32 будет работать лучше. Bytes32 также будет лучше в газе. Если вы хотите поиграть с этим, я сделал небольшую скрипку https://ethfiddle.com/70ipaEIFdk .
Байт использовал газ 21465
Струна использовала газ 21897
pragma solidity ^0.4.18;
contract SampleOverflow {
string constant statictext = "HelloStackOverFlow";
bytes32 constant byteText = "HelloStackOverFlow";
function getString() payable public returns(string){
return statictext;
}
function getByte() payable public returns(bytes32){
return byteText;
}
}
Получить строку https://ethfiddle.com/70ipaEIFdk
bytes32 означает строку с максимальной длиной 32. Она занимает меньше памяти, чем строка для той же длины строки.
Итак, когда ваши данные не превышают 32 байта (32 слова), используйте bytes32.
Если длина строки не определена, используйте только bytes
.
также доступны byte8, byte16, byte32. Вы можете использовать любой в соответствии с условиями.
Микко Отамаа
эт
эфирный
эт
Курт
КлементВальтер
эт