diff --git a/domain/consensus/processes/pruningmanager/pruningmanager.go b/domain/consensus/processes/pruningmanager/pruningmanager.go index bf5432b09..7dc425518 100644 --- a/domain/consensus/processes/pruningmanager/pruningmanager.go +++ b/domain/consensus/processes/pruningmanager/pruningmanager.go @@ -44,6 +44,9 @@ type pruningManager struct { shouldSanityCheckPruningUTXOSet bool k externalapi.KType difficultyAdjustmentWindowSize int + + cachedPruningPoint *externalapi.DomainHash + cachedPruningPointAnticone []*externalapi.DomainHash } // New instantiates a new PruningManager @@ -932,6 +935,12 @@ func (pm *pruningManager) PruningPointAndItsAnticone() ([]*externalapi.DomainHas return nil, err } + // By the Prunality proof, The pruning point anticone is a closed set (i.e., guaranteed not to change) , + // so we can safely cache it. + if pm.cachedPruningPoint != nil && pm.cachedPruningPoint.Equal(pruningPoint) { + return append([]*externalapi.DomainHash{pruningPoint}, pm.cachedPruningPointAnticone...), nil + } + pruningPointAnticone, err := pm.dagTraversalManager.AnticoneFromVirtualPOV(stagingArea, pruningPoint) if err != nil { return nil, err @@ -958,6 +967,9 @@ func (pm *pruningManager) PruningPointAndItsAnticone() ([]*externalapi.DomainHas return nil, sortErr } + pm.cachedPruningPoint = pruningPoint + pm.cachedPruningPointAnticone = pruningPointAnticone + // The pruning point should always come first return append([]*externalapi.DomainHash{pruningPoint}, pruningPointAnticone...), nil } diff --git a/domain/migrate.go b/domain/migrate.go index d3178aca4..eee3bb4d7 100644 --- a/domain/migrate.go +++ b/domain/migrate.go @@ -11,6 +11,7 @@ func (d *domain) migrate() error { if err != nil { return err } + log.Infof("Current pruning point: %s", pruningPoint) if d.consensusConfig.Params.GenesisHash.Equal(pruningPoint) { err = d.initStagingConsensus(d.consensusConfig)