Какой тип uint должен быть объявлен для временных меток unix?

Я пытаюсь указать тип uint для uint16 вместо того, чтобы просто использовать uint или uint256 при работе с отметками времени, но он говорит, что я должен использовать как минимум uint24. Он работает с uint24, но разве uint16 не должно быть достаточно?

Ответы (2)

Не совсем ответ на то, что вы спрашиваете, но...

Уменьшение размера uintдо менее чем 256 бит увеличит затраты на попутный газ, а не снизит их, как вы могли бы ожидать. Лучше всего будет оставить его как uint256.

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


Редактировать:

Отметив, что временные метки — это количество секунд, прошедших с эпохи Unix:

  • uint16максимальное значение = 65536 -> 01.01.1970, 18:12 (UTC)
  • uint24максимальное значение = 16777216 -> 14.07.1970, 4:20 (UTC)

Так что эти значения слишком малы.

Вызов block.timestamp(или now) в настоящее время возвращает 1508618011, то есть 0b1011001111010111010111100011011. Для этого требуется 31 бит. Таким образом, вы ищете как минимум uint32, но больше, если хотите быть ориентированным на будущее.

Что, если бы мы говорили о чем-то, что будет сохранено в хранилище? Я предполагаю, что было бы лучше, например, использовать uint8 вместо uint256 для десятичных знаков, что также экономит затраты на газ.
Да, верно для переменных, записываемых в хранилище — запись меньшего количества дешевле. Вы захотите поэкспериментировать в зависимости от того, как вы используете метки времени.
Память записывается блоками по 32 байта. Использование меньших значений не дешевле
Хорошо, не знал размер блока - то, что сказал Тьяден :-)
так что нет разницы объявлять uint8 и uint32? разумный газ? То же самое относится к байтам?
uint32на мой взгляд более чем достаточно: 2^32 - 1равно , 4294967295т.е. Sun Feb 07 2106Никто из нас, вероятно, не будет жив в то время, и я очень сомневаюсь, что Solidity все еще будет использоваться для написания распределенных приложений :)
При хранении в структуре они выстраиваются в блоки по 32 байта, поэтому вы можете разместить несколько uint32 в структуре и значительно сэкономить на затратах на хранение...
Знаменитые последние слова @skozin :)
Не только в структурах, но и вообще, когда вы определяете несколько переменных хранения одну за другой, Solidity попытается сделать компактное хранение, то есть попытается сохранить несколько переменных в одном и том же 32-байтовом слове. Это означает, что в следующем примере первый более эффективен по газу: uint48 переменная1 uint48 переменная2 uint256 переменная, чем: uint48 переменная1 uint256 переменная2 uint48 переменная3

Согласно документам Solidity block.timestamp, uintэто псевдоним дляunit256

block.timestamp (uint): current block timestamp

Так что я лично буду использовать то же самое на случай, если Solidity все еще будет в 33658 году :)

Документы