Skip to content

Commit

Permalink
Avoid override and accidental staging of pruning point by index (#2005)
Browse files Browse the repository at this point in the history
* Avoid override and accidental staging of pruning point by index

* Update pruning point when resolving virtual
  • Loading branch information
someone235 authored Apr 3, 2022
1 parent ca5c854 commit 71afc62
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 2 deletions.
20 changes: 19 additions & 1 deletion domain/consensus/consensus.go
Original file line number Diff line number Diff line change
Expand Up @@ -750,7 +750,25 @@ func (s *consensus) ResolveVirtual() (*externalapi.VirtualChangeSet, bool, error

// In order to prevent a situation that the consensus lock is held for too much time, we
// release the lock each time resolve 100 blocks.
return s.consensusStateManager.ResolveVirtual(100)
// Note: maxBlocksToResolve should be smaller than finality interval in order to avoid a situation
// where UpdatePruningPointByVirtual skips a pruning point.
virtualChangeSet, isCompletelyResolved, err := s.consensusStateManager.ResolveVirtual(100)
if err != nil {
return nil, false, err
}

stagingArea := model.NewStagingArea()
err = s.pruningManager.UpdatePruningPointByVirtual(stagingArea)
if err != nil {
return nil, false, err
}

err = staging.CommitAllChanges(s.databaseContext, stagingArea)
if err != nil {
return nil, false, err
}

return virtualChangeSet, isCompletelyResolved, nil
}

func (s *consensus) BuildPruningPointProof() (*externalapi.PruningPointProof, error) {
Expand Down
7 changes: 7 additions & 0 deletions domain/consensus/datastructures/pruningstore/pruning_store.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
"github.com/kaspanet/kaspad/domain/consensus/utils/lrucacheuint64tohash"
"github.com/kaspanet/kaspad/util/staging"
"github.com/pkg/errors"
)

var currentPruningPointIndexKeyName = []byte("pruning-block-index")
Expand Down Expand Up @@ -298,11 +299,17 @@ func (ps *pruningStore) StagePruningPointByIndex(dbContext model.DBReader, stagi
pruningPointBlockHash *externalapi.DomainHash, index uint64) error {

stagingShard := ps.stagingShard(stagingArea)
_, exists := stagingShard.pruningPointByIndex[index]
if exists {
return errors.Errorf("%s is already staged for pruning point with index %d", stagingShard.pruningPointByIndex[index], index)
}

stagingShard.pruningPointByIndex[index] = pruningPointBlockHash

pruningPointIndex, err := ps.CurrentPruningPointIndex(dbContext, stagingArea)
isNotFoundError := database.IsNotFoundError(err)
if !isNotFoundError && err != nil {
delete(stagingShard.pruningPointByIndex, index)
return err
}

Expand Down
12 changes: 12 additions & 0 deletions domain/consensus/factory.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"github.com/kaspanet/kaspad/domain/consensus/processes/blockparentbuilder"
parentssanager "github.com/kaspanet/kaspad/domain/consensus/processes/parentsmanager"
"github.com/kaspanet/kaspad/domain/consensus/processes/pruningproofmanager"
"github.com/kaspanet/kaspad/util/staging"
"github.com/pkg/errors"
"io/ioutil"
"os"
Expand Down Expand Up @@ -523,6 +524,17 @@ func (f *factory) NewConsensus(config *Config, db infrastructuredatabase.Databas
return nil, false, err
}

stagingArea := model.NewStagingArea()
err = pruningManager.UpdatePruningPointByVirtual(stagingArea)
if err != nil {
return nil, false, err
}

err = staging.CommitAllChanges(dbManager, stagingArea)
if err != nil {
return nil, false, err
}

return c, false, nil
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ func TestPastMedianTime(t *testing.T) {
factory := consensus.NewFactory()
tc, tearDown, err := factory.NewTestConsensus(consensusConfig, "TestUpdateReindexRoot")
if err != nil {
t.Fatalf("NewTestConsensus: %s", err)
t.Fatalf("NewTestConsensus: %+v", err)
}
defer tearDown(false)

Expand Down
18 changes: 18 additions & 0 deletions domain/consensus/processes/pruningmanager/pruningmanager.go
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,10 @@ func (pm *pruningManager) UpdatePruningPointByVirtual(stagingArea *model.Staging
return err
}

if virtualGHOSTDAGData.SelectedParent().Equal(pm.genesisHash) {
return nil
}

newPruningPoint, newCandidate, err := pm.nextPruningPointAndCandidateByBlockHash(stagingArea, virtualGHOSTDAGData.SelectedParent(), nil)
if err != nil {
return err
Expand All @@ -163,6 +167,20 @@ func (pm *pruningManager) UpdatePruningPointByVirtual(stagingArea *model.Staging
}

if !newPruningPoint.Equal(currentPruningPoint) {
currentPruningPointGHOSTDAGData, err := pm.ghostdagDataStore.Get(pm.databaseContext, stagingArea, currentPruningPoint, false)
if err != nil {
return err
}

newPruningPointGHOSTDAGData, err := pm.ghostdagDataStore.Get(pm.databaseContext, stagingArea, newPruningPoint, false)
if err != nil {
return err
}

if pm.finalityScore(newPruningPointGHOSTDAGData.BlueScore()) > pm.finalityScore(currentPruningPointGHOSTDAGData.BlueScore())+1 {
return errors.Errorf("cannot advance pruning point by more than one finality interval at once")
}

log.Debugf("Moving pruning point from %s to %s", currentPruningPoint, newPruningPoint)
err = pm.savePruningPoint(stagingArea, newPruningPoint)
if err != nil {
Expand Down

0 comments on commit 71afc62

Please sign in to comment.