feat: implement relaxed period in clique (#763)

* 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 <omerfirmak@users.noreply.github.com>
This commit is contained in:
Ömer Faruk Irmak 2024-05-22 12:34:43 +03:00 committed by GitHub
parent c7990a3eb1
commit dd96ceced8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 16 additions and 6 deletions

View file

@ -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

View file

@ -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
}

View file

@ -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.

View file

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