У меня есть функция, которая использует текущее время ( now
). Контракт в целом является краудфандинговым токеном, и стоимость токенов различается в зависимости от даты и времени их приобретения.
Как имитировать разное время при тестировании смарт-контракта? Например, что касается приведенного ниже кода, я хотел бы провести модульное тестирование, чтобы выяснить, верен ли код для установки цены, но я не могу изменить значение now
.
Было бы хорошим решением просто заменить now
ключевое слово на другую временную переменную тестирования, скажем, now_sim
а затем вручную изменить now_sim
во время моделирования?
if (now < (startTime + 1 days)) {
currentPrice = safeDiv(safeMul(price, 80), 100); // 20 % discount (x * 80 / 100)
}
else if (now < (startTime + 2 days)) {
currentPrice = safeDiv(safeMul(price, 90), 100); // 10 % discount (x * 90 / 100)
}
else if (now < (startTime + 12 days)) {
// 1 % reduction in the discounted rate from day 2 until day 12 (sliding scale per second)
// 8640000 is 60 x 60 x 24 x 100 (100 for 1%) (60 x 60 x 24 for seconds per day)
currentPrice = price - safeDiv(safeMul((startTime + 12 days) - now), price), 8640000);
}
else {
currentPrice = price;
}
В общем, да, наверное, лучше установить статические значения для всех важных тестовых переменных.
В договоре now
есть block.timeStamp
.
Эта временная метка на практике является приблизительной , с отклонением до пятнадцати минут.
Я бы запросил контракт или блокчейн, чтобы получить время, которое было фактически использовано.
В подобных ситуациях у меня был тест, ожидающий добытого блока с отметкой времени, прошедшей время, которое я жду. Я вижу, как это будет проблемой, если вам придется ждать 12 дней.
Было бы неплохо разбить и параметризовать вехи, чтобы вы могли тестировать с меньшими интервалами, чтобы все это могло пройти все тесты за минуту или две. Возможно, неудовлетворительно для «финального» теста, но достаточно для начальных тестов.
Надеюсь, это поможет.
Если вы используете pyethereum для тестирования — что я настоятельно рекомендую, это прекрасно — вы можете напрямую изменить метку времени смоделированного блока, который обрабатывает вашу транзакцию.
self.s = t.state()
self.s.block.timestamp = self.s.block.timestamp + 86400
self.s.mine(1)
some_val = your_contract.do_something(some_parameter)
self.assertEqual(some_val, whatever)
См. рабочий пример здесь (возможно, немного устаревший): https://github.com/realitykeys/subjectivocracy/blob/master/contracts/test.py#L85 .
Роб Хитченс
РФВ
evm_increaseTime
было бы лучшим вариантом для имитации разных времен.РФВ
evm_increaseTime
консоль truffle. Не могли бы вы помочь??Роб Хитченс