contract A {
uint8 a = 0;
}
стоит 20150 + 2000 газа при создании.
по сравнению с
contract A {
uint a = 0; // or uint256
}
стоимость 5050 + 2000 газа при создании
Странно, что переменная, занимающая меньше места для хранения, стоит больше газа. Почему это так?
EVM работает со словами 256 бит/32 байта (спорное конструктивное решение). Каждая операция основана на этих базовых единицах. Если ваши данные меньше, необходимы дальнейшие операции для уменьшения масштаба с 256 бит до 8 бит, поэтому вы видите увеличение затрат.
Кстати, если вы переключите «Подробности» в онлайн-компиляторе Solidity, он даст вам точный дамп сборки, откуда берутся дополнительные коды операций. У меня не было времени интерпретировать их, но если вы это сделаете и обнаружите что-то еще, я уверен, что команда Solidity будет рада добавить оптимизации, чтобы обойти их.
Однако следует отметить, что в структуре uint8 ДЕЙСТВИТЕЛЬНО стоит меньше, чем традиционный uint, из-за функции плотной упаковки. Также убедитесь, что ваши uint находятся рядом с другими вашими uint, а байты рядом с байтами и т. д. Это еще больше увеличивает плотно упакованные функции.
struct
следует uints
определить один за другим и другие типы, а почему? @VoR0220SOLC 0.4.18: теперь разница небольшая
https://ethfiddle.com/6lt852gx7K
Контракт A с uint8
затратами 75414 на развертывание
Контракт B с uint256
затратами 73867 на развертывание
Разница 1547 газ.
Обновление в декабре 2021 года:
Если вы протестируете что-то вроде этого: 5 переменных вместо 1, что может быть больше похоже на реальный сценарий с несколькими переменными, а не только с одной.
contract A {
uint8 a = 0;
uint8 b = 0;
uint8 c = 0;
uint8 d = 0;
uint8 e = 0;
}
Тогда это дешевле, чем его версия uint256.
Из ремикса:
uint8: 69484газ uint256: 78420газ
Обновление от июня 2022 г. (0.8.15)
uint8: 83524газ uint256: 90183газ
Таким образом, вы экономите на газе, используя uint меньшего размера, как говорится в других комментариях, если это массивы, вы экономите больше.
узын
uint256
. Следующий вопрос Интересно, всегда ли имеет смысл просто придерживаться uint256 и никогда меньше.Ник Джонсон
альпер
uint32
внутри astruct
вместо того , чтобыuint256
помещать ее в массив, это стоит гораздо меньше газа.