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 {
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 {
return nil
}

View File

@ -8,6 +8,7 @@ import (
"github.com/kaspanet/kaspad/domain/consensus/utils/transactionhelper"
"github.com/kaspanet/kaspad/domain/consensus/utils/utxo"
"github.com/kaspanet/kaspad/infrastructure/logger"
"github.com/kaspanet/kaspad/util/staging"
"github.com/pkg/errors"
)
@ -20,7 +21,12 @@ func (csm *consensusStateManager) ImportPruningPoint(stagingArea *model.StagingA
return err
}
return csm.applyImportedPruningPointUTXOSet(stagingArea)
err = csm.applyImportedPruningPointUTXOSet(stagingArea, newPruningPoint)
if err != nil {
return err
}
return nil
}
func (csm *consensusStateManager) importPruningPoint(
@ -124,16 +130,10 @@ func (csm *consensusStateManager) importPruningPoint(
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
}
func (csm *consensusStateManager) applyImportedPruningPointUTXOSet(stagingArea *model.StagingArea) error {
func (csm *consensusStateManager) applyImportedPruningPointUTXOSet(stagingArea *model.StagingArea, newPruningPoint *externalapi.DomainHash) error {
dbTx, err := csm.databaseContext.Begin()
if err != nil {
return err
@ -156,10 +156,10 @@ func (csm *consensusStateManager) applyImportedPruningPointUTXOSet(stagingArea *
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")
defer onEnd()
@ -182,6 +182,18 @@ func (csm *consensusStateManager) importVirtualUTXOSetAndPruningPointUTXOSet() e
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")
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...")
err = csm.importVirtualUTXOSetAndPruningPointUTXOSet()
pruningPoint, err := csm.pruningStore.PruningPoint(csm.databaseContext, model.NewStagingArea())
if err != nil {
return err
}
err = csm.importVirtualUTXOSetAndPruningPointUTXOSet(pruningPoint)
if err != nil {
return err
}

View File

@ -75,7 +75,7 @@ func (csm *consensusStateManager) ResolveVirtual(maxBlocksToResolve uint64) (boo
if selectedTip == nil {
log.Warnf("Non of the DAG tips are valid")
return false, nil
return true, nil
}
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)
if err != nil {
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 0, nil, err