go-ethereum: SimulateBackend AdjustTime вообще не регулирует время или либо неожиданным образом

При использовании SimulateBackend я попытался перемотать время смоделированной цепочки блоков AdjustTime(604800 *time.Second), что должно перемотать время вперед на неделю. Проверка возвращаемого значения ошибки показывает, что оно равно нулю, однако из всех моих тестов видно, что время на самом деле не перематывается вперед, а используется локальное системное время. Попытки вызвать функции, которые должны работать после отката времени, не работают.

перейти версия:go1.10.11 linux/amd64

Использование последней версии go-ethereum.

Ответы (1)

Вы делаете client.Commit() после этого. Я не могу вспомнить, нужно ли это, но у меня есть привычка делать это, поэтому я предполагаю, что это так.

Единственный способ, которым вы сможете протестировать эту функцию, — это иметь функцию, которая возвращает nowилиblock.timestamp

Я делаю это, имея небольшой контракт:

pragma solidity ^0.4.24;

contract Canary {

    function timeStamp() constant returns (uint256) {
        return now;
    }
}

Это позволяет вам проверять время до и после корректировки времени - или (например) во время краудсейла - корректировать время в соответствии с конкретным новым временем, например, началом распродажи.

now, err := canary.TimeStamp(nil)
if err != nil {
    log.Fatal(err)
}

timeOffset := new(big.Int).Sub(targetTime, now).Int64()
c.AdjustTime(time.Duration(timeOffset) * time.Second)
c.Commit()

Это не удастся, только если вы попытаетесь опережать смоделированную цепочку вашего реального времени.

Так вот в чем дело! Я подозревал, что это было ограничено вашим системным временем, хотя я никогда не мог подтвердить это, поскольку документация по моделируемому времени скудна. Проблема, с которой я столкнулся, заключается в том, что я не могу перенести время вперед в будущем (на 1 неделю раньше системного времени и т. д.).
Я справляюсь с этим, помещая все даты назад во времени на год или другую подходящую константу в подпрограмме общего назначения. Это позволило мне тестировать код в течение 20 лет.