Update the virtual after overriding the virtual UTXO set (#1811)

* Update the virtual after overriding the virtual utxo set

* Put the updateVirtual inside importVirtualUTXOSetAndPruningPointUTXOSet

* Add pruningPoint to importVirtualUTXOSetAndPruningPointUTXOSet

* Remove sanity check
This commit is contained in:
Ori Newman 2021-08-02 17:02:15 +03:00 committed by GitHub
parent 7d1071a9b1
commit d748089a14
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 30 additions and 21 deletions

View File

@ -25,14 +25,6 @@ func (css *consensusStateStore) StageVirtualUTXODiff(stagingArea *model.StagingA
} }
func (csss *consensusStateStagingShard) commitVirtualUTXODiff(dbTx model.DBTransaction) error { func (csss *consensusStateStagingShard) commitVirtualUTXODiff(dbTx model.DBTransaction) error {
hadStartedImportingPruningPointUTXOSet, err := csss.store.HadStartedImportingPruningPointUTXOSet(dbTx)
if err != nil {
return err
}
if hadStartedImportingPruningPointUTXOSet {
return errors.New("cannot commit virtual UTXO diff after starting to import the pruning point UTXO set")
}
if csss.virtualUTXODiffStaging == nil { if csss.virtualUTXODiffStaging == nil {
return nil return nil
} }

View File

@ -8,6 +8,7 @@ import (
"github.com/kaspanet/kaspad/domain/consensus/utils/transactionhelper" "github.com/kaspanet/kaspad/domain/consensus/utils/transactionhelper"
"github.com/kaspanet/kaspad/domain/consensus/utils/utxo" "github.com/kaspanet/kaspad/domain/consensus/utils/utxo"
"github.com/kaspanet/kaspad/infrastructure/logger" "github.com/kaspanet/kaspad/infrastructure/logger"
"github.com/kaspanet/kaspad/util/staging"
"github.com/pkg/errors" "github.com/pkg/errors"
) )
@ -20,7 +21,12 @@ func (csm *consensusStateManager) ImportPruningPoint(stagingArea *model.StagingA
return err return err
} }
return csm.applyImportedPruningPointUTXOSet(stagingArea) err = csm.applyImportedPruningPointUTXOSet(stagingArea, newPruningPoint)
if err != nil {
return err
}
return nil
} }
func (csm *consensusStateManager) importPruningPoint( func (csm *consensusStateManager) importPruningPoint(
@ -124,16 +130,10 @@ func (csm *consensusStateManager) importPruningPoint(
return err return err
} }
// Run update virtual to create acceptance data and any other missing data.
_, _, err = csm.updateVirtual(stagingArea, newPruningPoint, []*externalapi.DomainHash{newPruningPoint})
if err != nil {
return err
}
return nil return nil
} }
func (csm *consensusStateManager) applyImportedPruningPointUTXOSet(stagingArea *model.StagingArea) error { func (csm *consensusStateManager) applyImportedPruningPointUTXOSet(stagingArea *model.StagingArea, newPruningPoint *externalapi.DomainHash) error {
dbTx, err := csm.databaseContext.Begin() dbTx, err := csm.databaseContext.Begin()
if err != nil { if err != nil {
return err return err
@ -156,10 +156,10 @@ func (csm *consensusStateManager) applyImportedPruningPointUTXOSet(stagingArea *
return err return err
} }
return csm.importVirtualUTXOSetAndPruningPointUTXOSet() return csm.importVirtualUTXOSetAndPruningPointUTXOSet(newPruningPoint)
} }
func (csm *consensusStateManager) importVirtualUTXOSetAndPruningPointUTXOSet() error { func (csm *consensusStateManager) importVirtualUTXOSetAndPruningPointUTXOSet(pruningPoint *externalapi.DomainHash) error {
onEnd := logger.LogAndMeasureExecutionTime(log, "importVirtualUTXOSetAndPruningPointUTXOSet") onEnd := logger.LogAndMeasureExecutionTime(log, "importVirtualUTXOSetAndPruningPointUTXOSet")
defer onEnd() defer onEnd()
@ -182,6 +182,18 @@ func (csm *consensusStateManager) importVirtualUTXOSetAndPruningPointUTXOSet() e
return err return err
} }
// Run update virtual to create acceptance data and any other missing data.
updateVirtualStagingArea := model.NewStagingArea()
_, _, err = csm.updateVirtual(updateVirtualStagingArea, pruningPoint, []*externalapi.DomainHash{pruningPoint})
if err != nil {
return err
}
err = staging.CommitAllChanges(csm.databaseContext, updateVirtualStagingArea)
if err != nil {
return err
}
log.Debugf("Finishing to import virtual UTXO set and pruning point UTXO set") log.Debugf("Finishing to import virtual UTXO set and pruning point UTXO set")
return csm.consensusStateStore.FinishImportingPruningPointUTXOSet(csm.databaseContext) return csm.consensusStateStore.FinishImportingPruningPointUTXOSet(csm.databaseContext)
} }
@ -196,7 +208,12 @@ func (csm *consensusStateManager) RecoverUTXOIfRequired() error {
} }
log.Warnf("Unimported pruning point UTXO set detected. Attempting to recover...") log.Warnf("Unimported pruning point UTXO set detected. Attempting to recover...")
err = csm.importVirtualUTXOSetAndPruningPointUTXOSet() pruningPoint, err := csm.pruningStore.PruningPoint(csm.databaseContext, model.NewStagingArea())
if err != nil {
return err
}
err = csm.importVirtualUTXOSetAndPruningPointUTXOSet(pruningPoint)
if err != nil { if err != nil {
return err return err
} }

View File

@ -75,7 +75,7 @@ func (csm *consensusStateManager) ResolveVirtual(maxBlocksToResolve uint64) (boo
if selectedTip == nil { if selectedTip == nil {
log.Warnf("Non of the DAG tips are valid") log.Warnf("Non of the DAG tips are valid")
return false, nil return true, nil
} }
updateVirtualStagingArea := model.NewStagingArea() updateVirtualStagingArea := model.NewStagingArea()

View File

@ -215,7 +215,7 @@ func (csm *consensusStateManager) resolveSingleBlockStatus(stagingArea *model.St
err = csm.verifyUTXO(stagingArea, block, blockHash, pastUTXOSet, acceptanceData, multiset) err = csm.verifyUTXO(stagingArea, block, blockHash, pastUTXOSet, acceptanceData, multiset)
if err != nil { if err != nil {
if errors.As(err, &ruleerrors.RuleError{}) { if errors.As(err, &ruleerrors.RuleError{}) {
log.Debugf("UTXO verification for block %s failed: %s", blockHash, err) log.Warnf("UTXO verification for block %s failed: %s", blockHash, err)
return externalapi.StatusDisqualifiedFromChain, nil, nil return externalapi.StatusDisqualifiedFromChain, nil, nil
} }
return 0, nil, err return 0, nil, err