Предположим, нам нужно определить дату истечения срока действия контракта, чтобы после этой даты контракт был уничтожен следующим образом:
uint256 public expiryDate;
constructor(uint256 duration)
public
payable
{
owner= msg.sender;
expiryDate = now + duration;
}
function destryContract() public {
require(now >= expiryDate);
selfdestruct(owner);
}
Теперь представьте, что нам нужно рассчитать точную продолжительность для этой даты истечения срока действия, например, мы хотим аннулировать контракт ровно через один месяц .
Как вычислить значение переменнойduration
какinteger
?
Основываясь на их документации http://solidity.readthedocs.io/en/v0.4.24/units-and-global-variables.html Единицы времени.
Вы можете сделать expiryDate = now + продолжительность * 1 день, где формула (длительность * 1 день) приведет к эквивалентной эпохе unix (это в секундах), которую вы можете сохранить в своем uint expiryDate.
Просто обратите внимание, что свойство now в Solidity на самом деле не относится к реальному DateTime, когда транзакция выполнялась в реальном мире, как, например, DateTime.Now в JavaScript, C# или любых других языках программирования. В достоверности я полагаю, что это относится ко времени, когда блок был создан и проверен. Они также предупреждают большинство разработчиков, чтобы они помнили, что теперь майнеры могут влиять на них.
хорошая вибрация
now
определяет количество секунд, прошедших с 01.01.1970. Поэтому вы должны передать продолжительность в секундах. Это не может быть сделано точно для одного месяца, потому что этот период времени не определен точно (т.е. он может быть любым между 28 - 31 днями). Если вы согласны с приближением одного месяца к 30 дням, вы можете использовать60 * 60 * 24 * 30
.Бриомкез
expiryDate = now() + dayToWait*1 days
, чтобы впоследствии вы могли напрямую сравнивать expiryDate и now. Может быть, если вы хотите сэкономить на умножении прочности и связанных с этим затратах на газ, лучше использовать подход @goodvibration ^^