Время представлено в смарт-контрактах Solidity в виде отметки времени, количества секунд с 01.01.1970 00:00:00 по всемирному координированному времени. Это та же единица, что и временная метка Unix. В настоящее время нет доступных функций для преобразования этой отметки времени в календарный год / месяц / день и время дня час: минута: секунда.

Газоэффективная библиотека даты и времени твердости BokkyPooBah предоставляет дополнительные функции, необходимые для преобразования метки времени в год / месяц / день, час: минута: секунда и обратно.

Таким образом, функции в этой библиотеке предоставляют следующие возможности:

  • Преобразование из метки времени в год / месяц / день и обратно
  • Преобразование из метки времени в год / месяц / день час: минута: секунда и обратно
  • Определите, представляет ли метка времени високосный год, выходные или будний день.
  • Вычислить день недели для отметки времени
  • Добавить годы, месяцы, дни, часы, минуты или секунды к отметке времени
  • Вычтите годы, месяцы, дни, часы, минуты или секунды из отметки времени
  • Вычислить разницу между двумя отметками времени в годах, месяцах, днях, часах, минутах или секундах.

Эта библиотека была разработана для легкого включения в ваши смарт-контракты - функции объявлены internal, поэтому они будут встроены в ваши смарт-контракты для более простого развертывания.

Исходный код библиотеки доступен на BokkyPooBahsDateTimeLibrary.sol.

Примеры использования смарт-контрактов можно найти в BokkyPooBahsDateTimeContract.sol и TestDateTime.sol. Они были развернуты в testnet Ropsten на 0x947cc35992e6723de50bf704828a01fd2d5d6641 и 0xa068fe3e029a972ecdda2686318806d2b19875d1, и на Mainnet на 0x23d23d8f243e57d0b924bff3a3191078af325101 и 0x78f96b2d5f717fa9ad416957b79d825cc4cce69d. Щелкните ссылки и выберите вкладку Прочитать контракт, чтобы протестировать функции даты / времени / отметки времени.

См. Условные обозначения для ознакомления с условными обозначениями, используемыми в этой библиотеке. См. Функции для получения списка функций, доступных в этой библиотеке. См. Вопросы и ответы для общих вопросов.

А насколько газоэффективна эта библиотека?

Из Стоимость газа timestampToDateTime(…) имеет стоимость исполнительного газа 3 101 газ, а timestampFromDateTime(…) имеет стоимость исполнительного газа 2,566 газа. Вы можете сравнить эти цифры с низким уровнем Стоимость газа в коде операции EVM.

Ниже приведен мой недавний повторный тест с компиляцией Remix с Solidity 0.4.24.

timestampToDateTime(uint timestamp) использовано 1 945 единиц газа:

timestampFromDateTime(uint year, uint month, uint day, uint hour, uint minute, uint second) использовано 1 077 газа:

Итак, для чего можно использовать эту библиотеку?

  • Повторяющиеся подписки на блокчейне, оплачиваемые в определенный день месяца ERC-948 / EIP-1337
  • Смарт-контракты, осуществляющие периодические платежи, например, облигации или акции, где платежи производятся ежеквартально или раз в полгода.
  • Смарт-контракты, которые периодически выпускают платежи, например, выпускают x ETH каждый день рождения.
  • Смарт-контракты, генерирующие периодические календарные события
  • И любой новый вариант использования, возможный благодаря этой библиотеке

Оригинальные алгоритмы преобразования даты

Исходные алгоритмы преобразования дат взяты из Преобразования между датами по юлианскому календарю и датами по григорианскому календарю, разработанного Флигелем и ван Фландерном (1968).

Следующий алгоритм Fortran используется для преобразования даты по григорианскому календарю (год / месяц / день) в дату по юлианскому календарю (количество дней относительно контрольной точки):

И следующий алгоритм Fortran используется для преобразования даты по юлианскому календарю в дату по григорианскому календарю (год / месяц / день):

Газоэффективные алгоритмы преобразования даты твердости

Газоэффективная библиотека DateTime Solidity от BokkyPooBah использует аналогичный алгоритм для преобразования между меткой времени Unix (количество секунд с 01.01.1970 00:00:00 UTC) и DateTime (год / месяц / день час: минута: секунда ).

Следующий алгоритм используется для преобразования года / месяца / дня в количество дней с 1970/01/01:

И следующий алгоритм используется для преобразования количества дней с 01.01.1970 в год / месяц / день:

Газоэффективные алгоритмы преобразования даты и времени твердости

Вышеупомянутые алгоритмы преобразования даты используются для перевода между количеством дней с 01.01.1970 и годом / месяцем / днем.

Поскольку временная метка Unix представляет количество секунд с 01.01.1970 00:00:00 UTC, количество дней с 01.01.1970 умножается на количество секунд в каждом дне (60 * 60 * 24) и представляя час / минуту / секунды числом секунд, которые они представляют.

Спасибо тебе!

Я хотел бы поблагодарить Алекса Кампа, Джеймса Заки и Адриана Герреру за помощь в тестировании и аудите этой библиотеки DateTime. Также спасибо Алексею Матиясевичу за вопрос о дополнительных секундах.

И если вы найдете эту библиотеку DateTime полезной

Если вы найдете эту библиотеку полезной для вашего проекта, особенно для коммерческих проектов, пожертвуйте, пожалуйста, 0xb6dAC2C5A0222f6794265249ACE15568B750c2d1. Я надеюсь покрыть расходы на независимый аудит этой библиотеки.

Наслаждайтесь!
BokkyPooBah / Bok Consulting Pty Ltd - 2 сентября 2018 г.