Использовать строковый тип или bytes32?

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

22 голоса | спросил ethereal 21 Jam1000000amSat, 21 Jan 2017 01:58:05 +030017 2017, 01:58:05

2 ответа


31

Почему string вместо bytes32?

Используйте string для данных длины строки (UTF-8), длина которых превышает 32 байта. Фронтальные элементы могут декодировать длинную строку проще с помощью таких методов, как web3.toAscii или UTF -8 (когда проблемы ), вместо реализации логики декодирования UTF-8 серии из bytes32.

От Документы Solidity:

  

Как правило, используйте bytes для необработанных байтовых данных произвольной длины и   string для данных строки длины (UTF-8). Если вы можете ограничить   длина до определенного количества байтов, всегда используйте один из bytes1 для   bytes32, потому что они намного дешевле.

Строковые литералы также могут быть полезными или удобными:

  

Строковые литералы написаны либо с двойными, либо с одиночными кавычками ("foo"   или «бар») ...

     

Строковые литералы поддерживают escape-символы, такие как \ n, \ xNN и   \ UNNNN. \ xNN принимает шестнадцатеричное значение и вставляет соответствующий байт, тогда как   \ uNNNN принимает код Unicode и вставляет последовательность UTF-8.


Почему bytes32 вместо string?

Отвечено в Почему в примерах Solidity используется тип bytes32 вместо строка?

bytes32 использует меньше газа, потому что он вписывается в одно слово EVM, а string - это тип динамического размера, который имеет текущие ограничения в Solidity (например, 't возвращается из функции в контракт).

ответил eth 21 Jam1000000amSat, 21 Jan 2017 03:55:21 +030017 2017, 03:55:21
10

Как и в других сообщениях, вы хотите использовать строки для динамически распределенных данных, иначе 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

ответил Matthew Campbell 16 42017vEurope/Moscow11bEurope/MoscowThu, 16 Nov 2017 14:01:31 +0300 2017, 14:01:31

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132