go-ethereum: SimulateBackend AdjustTime passt die Zeit überhaupt nicht an, oder auf unerwartete Weise

Bei der Verwendung von SimulateBackend habe ich versucht, die Zeit der simulierten Blockchain vorzurücken, AdjustTime(604800 *time.Second)die die Zeit um eine Woche vorrücken sollte. Die Überprüfung des zurückgegebenen Fehlerwerts zeigt, dass er null ist, aber nach all meinen Tests scheint es, dass die Zeit nicht wirklich vorwärts rollt und die lokale Systemzeit verwendet wird. Der Versuch, Funktionen aufzurufen, die funktionieren sollten, nachdem die Zeit vorwärts gerollt wurde, funktioniert nicht.

go-Version:go1.10.11 linux/amd64

Verwenden der neuesten Go-Ethereum-Version.

Antworten (1)

Machst du danach ein client.Commit()? Ich kann mich nicht erinnern, ob es notwendig ist - aber ich habe es mir angewöhnt, also nehme ich an, dass es so ist.

Sie können diese Funktion nur testen, wenn Sie eine Funktion haben, die nowoder zurückgibtblock.timestamp

Ich mache das, indem ich einen kleinen Vertrag habe:

pragma solidity ^0.4.24;

contract Canary {

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

So können Sie die Uhrzeit vor und nach dem Einstellen der Uhrzeit überprüfen – oder (zB) während eines Crowdsales – um die Uhrzeit auf einen bestimmten neuen Zeitpunkt, zB Verkaufsstart, einzustellen.

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()

Dies schlägt nur fehl, wenn Sie versuchen, die simulierte Kette vor Ihrer realen aktuellen Zeit zu nehmen.

Das ist also das Problem! Ich hatte vermutet, dass es durch Ihre Systemzeit begrenzt war, obwohl ich dies nie bestätigen konnte, da die Dokumentation zur simulierten Zeit spärlich ist. Das Problem, das ich hatte, ist, dass ich die Zeit nicht in die Zukunft verschieben kann (1 Woche vor der Systemzeit usw.).
Ich handhabe das, indem ich alle Daten um ein Jahr oder eine andere geeignete Konstante in einer Allzweckroutine zurückstelle. Dadurch konnte ich Code über einen Zeitraum von 20 Jahren testen.