Как вы можете добавить определенное количество месяцев к метке времени (uint)?

Я пишу контракт, который будет начислять проценты на периодической основе, используя точное количество дней в каждом периоде. Так, например, если я использую в качестве примера период с 1 января 2018 года по 31 марта 2018 года, в этом периоде будет 90 дней. Затем мне нужно сдвинуть период на 3 месяца вперед, чтобы получить интерес к следующему кварталу.

Конкретный код, который я использую сейчас:

function nextPeriod() public {
    lastPeriodDate = currentPeriodDate;
    currentPeriodDate += 1 years/4;
}

Это работает, но это приблизительно.

У кого-нибудь есть предложения?

Спасибо!

Фил

Ответы (1)

На мой взгляд , было бы полезно переформулировать вопрос с большей точностью.

Когда вы говорите «мне нужно», это создает небольшое сомнение в том, что должно произойти. Трудно сказать, нужен ли вам контракт, чтобы определить это, или вам нужен владелец контракта, чтобы определить это, или кто-то еще. Это будет важно.

У твердости нет monthслова, и я подозреваю , что это из-за присущей двусмысленности, поскольку в месяцах разное количество дней. Кажется, что «месяц» и «30 дней» небрежно меняются местами в неформальном разговоре, но контракты — это примерно противоположное неформальному. Нужно будет точно определить, что подразумевается под «месяцем» в контексте контракта.

Отбросив неточность временных меток, вы можете сделать что-то вроде:

now + 30 days

То есть в том случае, если в договоре нужно уметь разобраться.

Или вы можете передать это на аутсорсинг Oracle.

function setNextMonth(uint nextMonth) public onlyOwner ...

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

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

Можно даже представить себе краудсорсинг вычислений через рынки мнений, поскольку правильный выбор очевиден. В этой конструкции «в следующем месяце» — это номер блока, определяемый большинством на такой платформе, как Auger или Gnosis.

Надеюсь, поможет.

Спасибо, Роб. Я вижу ваши точки. Я отредактировал вопрос, чтобы добавить больше точности. Я также понимаю, что вы говорите. Я не буду пытаться злоупотреблять Solidity, чтобы делать то, для чего он не предназначен, а скорее возложу тяжелую работу на внешний интерфейс Javascript. Спасибо за ваши усилия дать мне полный и длинный ответ.