Почему uint8 стоит больше газа, чем uint256?

contract A {
  uint8 a = 0;
}

стоит 20150 + 2000 газа во время создания.

по сравнению с

contract A {
  uint a = 0;   // or uint256
}

стоимость 5050 + 2000 газа при создании

Нечетно, что переменная, занимающая меньше места для хранения, стоит больше газа. Почему это так?

28 голосов | спросил uzyn 16 PMpSat, 16 Apr 2016 12:24:32 +030024Saturday 2016, 12:24:32

3 ответа


35

EVM работает с 256bit /32byte слов (спорно дизайн решения). Каждая операция основана на этих базовых единицах. Если ваши данные меньше, необходимы дальнейшие операции для уменьшения масштаба с 256 бит до 8 бит, поэтому вы видите увеличенные затраты.

Btw, если вы переключите «Детали» в онлайн-компиляторе целостности, он даст вам точный сборщик, где есть дополнительные коды операций. У меня не было времени теперь их интерпретировать, но если вы это сделаете и найдете что-то дополнительное, я уверен, что команда Solidity будет счастлива добавить оптимизацию, чтобы обойти их.

ответил Péter Szilágyi 16 PMpSat, 16 Apr 2016 17:30:32 +030030Saturday 2016, 17:30:32
20

Следует отметить, однако, что в структуре, uint8 ДОЛЖЕН стоить меньше, чем традиционный uint, из-за плотной упаковки. Также убедитесь, что ваши uints находятся рядом с вашими другими uint и байтами рядом с байтами и т. Д. ... это еще больше увеличивает плотно упакованные функции.

ответил VoR0220 17 AMpSun, 17 Apr 2016 08:22:01 +030022Sunday 2016, 08:22:01
4

SOLC 0.4.18: теперь разница небольшая

https://ethfiddle.com/6lt852gx7K

Контракт A с использованием uint8 стоит 75414 для развертывания

Контракт B с использованием uint256 стоит 73867 для развертывания

Разность 1547 газа.

ответил tikonoff 3 AMpTue, 03 Apr 2018 11:26:42 +030026Tuesday 2018, 11:26:42

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

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

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