Я пишу контракт, который будет начислять проценты на периодической основе, используя точное количество дней в каждом периоде. Так, например, если я использую в качестве примера период с 1 января 2018 года по 31 марта 2018 года, в этом периоде будет 90 дней. Затем мне нужно сдвинуть период на 3 месяца вперед, чтобы получить интерес к следующему кварталу.
Конкретный код, который я использую сейчас:
function nextPeriod() public {
lastPeriodDate = currentPeriodDate;
currentPeriodDate += 1 years/4;
}
Это работает, но это приблизительно.
У кого-нибудь есть предложения?
Спасибо!
Фил
На мой взгляд , было бы полезно переформулировать вопрос с большей точностью.
Когда вы говорите «мне нужно», это создает небольшое сомнение в том, что должно произойти. Трудно сказать, нужен ли вам контракт, чтобы определить это, или вам нужен владелец контракта, чтобы определить это, или кто-то еще. Это будет важно.
У твердости нет month
слова, и я подозреваю , что это из-за присущей двусмысленности, поскольку в месяцах разное количество дней. Кажется, что «месяц» и «30 дней» небрежно меняются местами в неформальном разговоре, но контракты — это примерно противоположное неформальному. Нужно будет точно определить, что подразумевается под «месяцем» в контексте контракта.
Отбросив неточность временных меток, вы можете сделать что-то вроде:
now + 30 days
То есть в том случае, если в договоре нужно уметь разобраться.
Или вы можете передать это на аутсорсинг Oracle.
function setNextMonth(uint nextMonth) public onlyOwner ...
То есть в том случае, если вы хотите точно определить, когда начинается каждый месяц, и не хотите чрезмерно усложнять договор.
Третий подход заключается в выполнении довольно громоздких расчетов с учетом разного количества дней в каждом месяце и високосных лет. Это противоречит (довольно сильно) идеалу минимализма в контрактном дизайне.
Можно даже представить себе краудсорсинг вычислений через рынки мнений, поскольку правильный выбор очевиден. В этой конструкции «в следующем месяце» — это номер блока, определяемый большинством на такой платформе, как Auger или Gnosis.
Надеюсь, поможет.
Филип Рутовиц