From d748089a146a5ebd4ea249fc3b10a4b44edbe76d Mon Sep 17 00:00:00 2001 From: Ori Newman Date: Mon, 2 Aug 2021 17:02:15 +0300 Subject: [PATCH] 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 --- .../consensusstatestore/utxo.go | 8 ---- .../import_pruning_utxo_set.go | 39 +++++++++++++------ .../consensusstatemanager/resolve.go | 2 +- .../resolve_block_status.go | 2 +- 4 files changed, 30 insertions(+), 21 deletions(-) diff --git a/domain/consensus/datastructures/consensusstatestore/utxo.go b/domain/consensus/datastructures/consensusstatestore/utxo.go index 4663564d8..c8b16054b 100644 --- a/domain/consensus/datastructures/consensusstatestore/utxo.go +++ b/domain/consensus/datastructures/consensusstatestore/utxo.go @@ -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 } diff --git a/domain/consensus/processes/consensusstatemanager/import_pruning_utxo_set.go b/domain/consensus/processes/consensusstatemanager/import_pruning_utxo_set.go index 9497c0c26..107233012 100644 --- a/domain/consensus/processes/consensusstatemanager/import_pruning_utxo_set.go +++ b/domain/consensus/processes/consensusstatemanager/import_pruning_utxo_set.go @@ -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 } diff --git a/domain/consensus/processes/consensusstatemanager/resolve.go b/domain/consensus/processes/consensusstatemanager/resolve.go index 6cfa6c0b4..9ee6f65f6 100644 --- a/domain/consensus/processes/consensusstatemanager/resolve.go +++ b/domain/consensus/processes/consensusstatemanager/resolve.go @@ -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() diff --git a/domain/consensus/processes/consensusstatemanager/resolve_block_status.go b/domain/consensus/processes/consensusstatemanager/resolve_block_status.go index 93bfa4e3a..38030d1da 100644 --- a/domain/consensus/processes/consensusstatemanager/resolve_block_status.go +++ b/domain/consensus/processes/consensusstatemanager/resolve_block_status.go @@ -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