преобразовать "сейчас" в "день"?

Предположим, нам нужно определить дату истечения срока действия контракта, чтобы после этой даты контракт был уничтожен следующим образом:

uint256 public expiryDate;

constructor(uint256 duration)
        public
        payable
    {
        owner= msg.sender;
        expiryDate = now + duration; 
    }

function destryContract() public {
        require(now >= expiryDate);
        selfdestruct(owner);
    }

Теперь представьте, что нам нужно рассчитать точную продолжительность для этой даты истечения срока действия, например, мы хотим аннулировать контракт ровно через один месяц .

Как вычислить значение переменнойdurationкакinteger?

Глобальная единица nowопределяет количество секунд, прошедших с 01.01.1970. Поэтому вы должны передать продолжительность в секундах. Это не может быть сделано точно для одного месяца, потому что этот период времени не определен точно (т.е. он может быть любым между 28 - 31 днями). Если вы согласны с приближением одного месяца к 30 дням, вы можете использовать 60 * 60 * 24 * 30.
Если вы посмотрите на документацию по солидности media.readthedocs.org/pdf/solidity/develop/solidity.pdf Раздел 7.4.4 (Единицы времени), там приведены некоторые примеры. Если вы используете в качестве соглашения 30 дней, вы можете, например, написать expiryDate = now() + dayToWait*1 days, чтобы впоследствии вы могли напрямую сравнивать expiryDate и now. Может быть, если вы хотите сэкономить на умножении прочности и связанных с этим затратах на газ, лучше использовать подход @goodvibration ^^

Ответы (1)

Основываясь на их документации 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# или любых других языках программирования. В достоверности я полагаю, что это относится ко времени, когда блок был создан и проверен. Они также предупреждают большинство разработчиков, чтобы они помнили, что теперь майнеры могут влиять на них.