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

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

Ответы (2)

2 основные причины:

  1. Контракты в настоящее время не могут читать astring , возвращенное другим контрактом.
  2. EVM имеет размер слова 32 байта , поэтому он « оптимизирован» для работы с данными фрагментами по 32 байта. (Компиляторы, такие как Solidity, должны выполнять больше работы и генерировать больше байт-кода, когда данные не представляют собой куски по 32 байта, что фактически приводит к более высокой стоимости газа.)
Означает ли это, что если использовать строку вместо byte32, это приведет к тому, что контракт разделит строку на 32-байтовый фрагмент, а затем будет иметь непредсказуемое количество фрагментов и, следовательно, непредсказуемое использование газа в этой части кода?
Звучит правильно для меня, и непредсказуемое использование газа - еще одно хорошее соображение.

У меня есть тест на этом сайте https://ethfiddle.com/zLxE5Y-8B4

contract TestGas {
    string constant statictext = "Hello World";
    bytes11 constant byteText11 = "Hello World";
    bytes32 constant byteText32 = "Hello World";

    function  getString() payable public  returns(string){
        return statictext;
    }

    function  getByte11() payable public returns(bytes11){
        return byteText11;
    }

    function  getByte32() payable public returns(bytes32){
        return byteText32;
    }
}

И функция getStringпотратила 21875 газа,

функция getByte11израсходована 21509 газа,

функция getByte32израсходована 21487 газа.

Поэтому, если длина вашей строки фиксирована, просто используйте bytes32.

почему getByte11бензин дороже getByte32?
@SaadMalik EVM работает с 32-байтовыми словами. Когда ваши данные меньше 32 байт, каждая операция, связанная с этими данными, будет уменьшена с 256 бит до 8 бит (32 байта = 256 бит), поэтому EVM нужно гораздо больше газа.