From ebb74e089f8423425ce19559f58ebda024992753 Mon Sep 17 00:00:00 2001 From: blxdyx Date: Wed, 4 Sep 2024 11:17:52 +0800 Subject: [PATCH] Refactor the reset snapshots --- consensus/consensus.go | 2 ++ consensus/parlia/api.go | 10 +++++----- consensus/parlia/parlia.go | 20 ++++++++++---------- eth/stagedsync/stage_snapshots.go | 13 +++++-------- 4 files changed, 22 insertions(+), 23 deletions(-) diff --git a/consensus/consensus.go b/consensus/consensus.go index 76e54c4ab4d..db2a231e3c8 100644 --- a/consensus/consensus.go +++ b/consensus/consensus.go @@ -23,6 +23,7 @@ package consensus import ( "context" "github.com/erigontech/erigon-lib/kv" + "github.com/erigontech/erigon/consensus/parlia" "math/big" "github.com/holiman/uint256" @@ -225,6 +226,7 @@ type PoSA interface { AllowLightProcess(chain ChainReader, currentHeader *types.Header) bool GetJustifiedNumberAndHash(chain ChainHeaderReader, header *types.Header) (uint64, libcommon.Hash, error) GetFinalizedHeader(chain ChainHeaderReader, header *types.Header) *types.Header + Snapshot(chain ChainHeaderReader, number uint64, hash libcommon.Hash, parents []*types.Header, verify bool) (*parlia.Snapshot, error) } type AsyncEngine interface { diff --git a/consensus/parlia/api.go b/consensus/parlia/api.go index a62f17dff18..5b870263f64 100644 --- a/consensus/parlia/api.go +++ b/consensus/parlia/api.go @@ -43,7 +43,7 @@ func (api *API) GetSnapshot(number *rpc.BlockNumber) (*Snapshot, error) { if header == nil { return nil, errUnknownBlock } - return api.parlia.snapshot(api.chain, header.Number.Uint64(), header.Hash(), nil, false /* verify */) + return api.parlia.Snapshot(api.chain, header.Number.Uint64(), header.Hash(), nil, false /* verify */) } // GetSnapshotAtHash retrieves the state snapshot at a given block. @@ -52,7 +52,7 @@ func (api *API) GetSnapshotAtHash(hash libcommon.Hash) (*Snapshot, error) { if header == nil { return nil, errUnknownBlock } - return api.parlia.snapshot(api.chain, header.Number.Uint64(), header.Hash(), nil, false /* verify */) + return api.parlia.Snapshot(api.chain, header.Number.Uint64(), header.Hash(), nil, false /* verify */) } // GetValidators retrieves the list of validators at the specified block. @@ -68,7 +68,7 @@ func (api *API) GetValidators(number *rpc.BlockNumber) ([]libcommon.Address, err if header == nil { return nil, errUnknownBlock } - snap, err := api.parlia.snapshot(api.chain, header.Number.Uint64(), header.Hash(), nil, false /* verify */) + snap, err := api.parlia.Snapshot(api.chain, header.Number.Uint64(), header.Hash(), nil, false /* verify */) if err != nil { return nil, err } @@ -81,7 +81,7 @@ func (api *API) GetValidatorsAtHash(hash libcommon.Hash) ([]libcommon.Address, e if header == nil { return nil, errUnknownBlock } - snap, err := api.parlia.snapshot(api.chain, header.Number.Uint64(), header.Hash(), nil, false /* verify */) + snap, err := api.parlia.Snapshot(api.chain, header.Number.Uint64(), header.Hash(), nil, false /* verify */) if err != nil { return nil, err } @@ -100,7 +100,7 @@ func (api *API) GetTurnLength(number *rpc.BlockNumber) (uint8, error) { if header == nil { return 0, errUnknownBlock } - snap, err := api.parlia.snapshot(api.chain, header.Number.Uint64(), header.Hash(), nil, false /* verify */) + snap, err := api.parlia.Snapshot(api.chain, header.Number.Uint64(), header.Hash(), nil, false /* verify */) if err != nil || snap.TurnLength == 0 { return 0, err } diff --git a/consensus/parlia/parlia.go b/consensus/parlia/parlia.go index d71b6fbd950..e6182cca2d5 100644 --- a/consensus/parlia/parlia.go +++ b/consensus/parlia/parlia.go @@ -467,7 +467,7 @@ func (p *Parlia) verifyVoteAttestation(chain consensus.ChainHeaderReader, header } else { parents = nil } - snap, err := p.snapshot(chain, parent.Number.Uint64()-1, parent.ParentHash, parents, true) + snap, err := p.Snapshot(chain, parent.Number.Uint64()-1, parent.ParentHash, parents, true) if err != nil { return err } @@ -637,7 +637,7 @@ func (p *Parlia) verifyCascadingFields(chain consensus.ChainHeaderReader, header return err } - snap, err := p.snapshot(chain, number-1, header.ParentHash, parents, true /* verify */) + snap, err := p.Snapshot(chain, number-1, header.ParentHash, parents, true /* verify */) if err != nil { return err } @@ -728,7 +728,7 @@ func (p *Parlia) verifySeal(header *types.Header, snap *Snapshot) error { // !!! be careful // the block with `number` and `hash` is just the last element of `parents`, // unlike other interfaces such as verifyCascadingFields, `parents` are real parents -func (p *Parlia) snapshot(chain consensus.ChainHeaderReader, number uint64, hash libcommon.Hash, parents []*types.Header, verify bool) (*Snapshot, error) { +func (p *Parlia) Snapshot(chain consensus.ChainHeaderReader, number uint64, hash libcommon.Hash, parents []*types.Header, verify bool) (*Snapshot, error) { // Search for a snapshot in memory or on disk for checkpoints var ( headers []*types.Header @@ -970,7 +970,7 @@ func (p *Parlia) finalize(header *types.Header, ibs *state.IntraBlockState, txs curIndex := userTxs.Len() // warn if not in majority fork number := header.Number.Uint64() - snap, err := p.snapshot(chain, number-1, header.ParentHash, nil, false /* verify */) + snap, err := p.Snapshot(chain, number-1, header.ParentHash, nil, false /* verify */) if err != nil { return nil, nil, nil, err } @@ -1094,7 +1094,7 @@ func (p *Parlia) distributeFinalityReward(chain consensus.ChainHeaderReader, sta continue } - snap, err := p.snapshot(chain, justifiedBlock.Number.Uint64()-1, justifiedBlock.ParentHash, nil, true) + snap, err := p.Snapshot(chain, justifiedBlock.Number.Uint64()-1, justifiedBlock.ParentHash, nil, true) if err != nil { return true, err } @@ -1218,7 +1218,7 @@ func (p *Parlia) SealHash(header *types.Header) (hash libcommon.Hash) { // CalcDifficulty is the difficulty adjustment algorithm. It returns the difficulty // that a new block should have. func (p *Parlia) CalcDifficulty(chain consensus.ChainHeaderReader, time, parentTime uint64, parentDifficulty *big.Int, parentNumber uint64, parentHash, parentUncleHash libcommon.Hash, _ uint64) *big.Int { - snap, err := p.snapshot(chain, parentNumber, parentHash, nil, false /* verify */) + snap, err := p.Snapshot(chain, parentNumber, parentHash, nil, false /* verify */) if err != nil { return nil } @@ -1281,7 +1281,7 @@ func (p *Parlia) IsSystemContract(to *libcommon.Address) bool { } func (p *Parlia) EnoughDistance(chain consensus.ChainReader, header *types.Header) bool { - snap, err := p.snapshot(chain, header.Number.Uint64()-1, header.ParentHash, nil, false /* verify */) + snap, err := p.Snapshot(chain, header.Number.Uint64()-1, header.ParentHash, nil, false /* verify */) if err != nil { return true } @@ -1293,7 +1293,7 @@ func (p *Parlia) IsLocalBlock(header *types.Header) bool { } func (p *Parlia) AllowLightProcess(chain consensus.ChainReader, currentHeader *types.Header) bool { - snap, err := p.snapshot(chain, currentHeader.Number.Uint64()-1, currentHeader.ParentHash, nil, false /* verify */) + snap, err := p.Snapshot(chain, currentHeader.Number.Uint64()-1, currentHeader.ParentHash, nil, false /* verify */) if err != nil { return true } @@ -1558,7 +1558,7 @@ func (p *Parlia) GetJustifiedNumberAndHash(chain consensus.ChainHeaderReader, he if chain == nil || header == nil { return 0, libcommon.Hash{}, fmt.Errorf("illegal chain or header") } - snap, err := p.snapshot(chain, header.Number.Uint64(), header.Hash(), nil, true) + snap, err := p.Snapshot(chain, header.Number.Uint64(), header.Hash(), nil, true) if err != nil { p.logger.Error("GetJustifiedNumberAndHash snapshot", "error", err, "blockNumber", header.Number.Uint64(), "blockHash", header.Hash()) @@ -1583,7 +1583,7 @@ func (p *Parlia) GetFinalizedHeader(chain consensus.ChainHeaderReader, header *t return chain.GetHeaderByNumber(0) } - snap, err := p.snapshot(chain, header.Number.Uint64(), header.Hash(), nil, true) + snap, err := p.Snapshot(chain, header.Number.Uint64(), header.Hash(), nil, true) if err != nil { p.logger.Error("GetFinalizedHeader snapshot", "error", err, "blockNumber", header.Number.Uint64(), "blockHash", header.Hash()) diff --git a/eth/stagedsync/stage_snapshots.go b/eth/stagedsync/stage_snapshots.go index 5a6c50c9659..e46b733c2b6 100644 --- a/eth/stagedsync/stage_snapshots.go +++ b/eth/stagedsync/stage_snapshots.go @@ -24,7 +24,6 @@ import ( "errors" "fmt" "github.com/erigontech/erigon/consensus" - "github.com/erigontech/erigon/consensus/parlia" "io" "io/fs" "math/big" @@ -385,6 +384,7 @@ func FillDBFromSnapshots(logPrefix string, ctx context.Context, tx kv.RwTx, dirs // for now easier just store them in db td := big.NewInt(0) blockNumBytes := make([]byte, 8) + posa, isPoSa := engine.(consensus.PoSA) chainReader := &ChainReaderImpl{config: &chainConfig, tx: tx, blockReader: blockReader} if err := blockReader.HeadersRange(ctx, func(header *types.Header) error { blockNum, blockHash := header.Number.Uint64(), header.Hash() @@ -415,13 +415,10 @@ func FillDBFromSnapshots(logPrefix string, ctx context.Context, tx kv.RwTx, dirs } } } - if engine != nil && engine.Type() == chain.ParliaConsensus { - // consensus may have own database, let's fill it - // different consensuses may have some conditions for validators snapshots - if (blockNum-1)%parlia.CheckpointInterval == 0 { - if err := engine.VerifyHeader(chainReader, header, true /* seal */); err != nil { - return err - } + if isPoSa { + // Fill bsc consensus snapshots may have some conditions for validators snapshots + if _, err := posa.Snapshot(chainReader, header.Number.Uint64(), header.Hash(), nil, true); err != nil { + return err } } select {