From dd96ceced8af6b5b9dee410cc8887dba1352563a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96mer=20Faruk=20Irmak?= Date: Wed, 22 May 2024 12:34:43 +0300 Subject: [PATCH] feat: implement relaxed period in clique (#763) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: implement relaxed period in clique and enable it on Sepolia * simplify if check * chore: auto version bump [bot] * Update clique.go --------- Co-authored-by: omerfirmak --- consensus/clique/clique.go | 6 ++++-- miner/scroll_worker.go | 9 ++++++++- params/config.go | 5 +++-- params/version.go | 2 +- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/consensus/clique/clique.go b/consensus/clique/clique.go index bc4aef3151..6830ad1d83 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 dedc460967..2ea095487e 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 e0e3b41473..9b0e46ec26 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 e3902e1d18..10c2108ed2 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 )