diff --git a/consensus/clique/clique.go b/consensus/clique/clique.go index bc4aef31518f..6830ad1d83f9 100644 --- a/consensus/clique/clique.go +++ b/consensus/clique/clique.go @@ -328,7 +328,7 @@ func (c *Clique) verifyCascadingFields(chain consensus.ChainHeaderReader, header if parent == nil || parent.Number.Uint64() != number-1 || parent.Hash() != header.ParentHash { return consensus.ErrUnknownAncestor } - if parent.Time+c.config.Period > header.Time { + if header.Time < parent.Time { return errInvalidTimestamp } // Verify that the gasUsed is <= gasLimit @@ -555,7 +555,9 @@ func (c *Clique) Prepare(chain consensus.ChainHeaderReader, header *types.Header return consensus.ErrUnknownAncestor } header.Time = parent.Time + c.config.Period - if header.Time < uint64(time.Now().Unix()) { + // If RelaxedPeriod is enabled, always set the header timestamp to now (ie the time we start building it) as + // we don't know when it will be sealed + if c.config.RelaxedPeriod || header.Time < uint64(time.Now().Unix()) { header.Time = uint64(time.Now().Unix()) } return nil diff --git a/miner/scroll_worker.go b/miner/scroll_worker.go index dedc46096709..2ea095487ea4 100644 --- a/miner/scroll_worker.go +++ b/miner/scroll_worker.go @@ -708,7 +708,14 @@ func (w *worker) startNewPipeline(timestamp int64) { w.currentPipelineStart = time.Now() w.currentPipeline = pipeline.NewPipeline(w.chain, w.chain.GetVMConfig(), parentState, header, nextL1MsgIndex, w.getCCC()).WithBeforeTxHook(w.beforeTxHook) - if err := w.currentPipeline.Start(time.Unix(int64(header.Time), 0)); err != nil { + + deadline := time.Unix(int64(header.Time), 0) + if w.chainConfig.Clique != nil && w.chainConfig.Clique.RelaxedPeriod { + // clique with relaxed period uses time.Now() as the header.Time, calculate the deadline + deadline = time.Unix(int64(header.Time+w.chainConfig.Clique.Period), 0) + } + + if err := w.currentPipeline.Start(deadline); err != nil { log.Error("failed to start pipeline", "err", err) return } diff --git a/params/config.go b/params/config.go index e0e3b4147329..9b0e46ec265b 100644 --- a/params/config.go +++ b/params/config.go @@ -602,8 +602,9 @@ func (c *EthashConfig) String() string { // CliqueConfig is the consensus engine configs for proof-of-authority based sealing. type CliqueConfig struct { - Period uint64 `json:"period"` // Number of seconds between blocks to enforce - Epoch uint64 `json:"epoch"` // Epoch length to reset votes and checkpoint + Period uint64 `json:"period"` // Number of seconds between blocks to enforce + Epoch uint64 `json:"epoch"` // Epoch length to reset votes and checkpoint + RelaxedPeriod bool `json:"relaxed_period"` // Relaxes the period to be just an upper bound } // String implements the stringer interface, returning the consensus engine details. diff --git a/params/version.go b/params/version.go index e3902e1d18bb..10c2108ed287 100644 --- a/params/version.go +++ b/params/version.go @@ -24,7 +24,7 @@ import ( const ( VersionMajor = 5 // Major version component of the current release VersionMinor = 3 // Minor version component of the current release - VersionPatch = 18 // Patch version component of the current release + VersionPatch = 19 // Patch version component of the current release VersionMeta = "mainnet" // Version metadata to append to the version string )