Время представлено в смарт-контрактах 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 г.