diff --git a/domain/consensus/model/testapi/test_consensus_state_manager.go b/domain/consensus/model/testapi/test_consensus_state_manager.go index b119ee01e..ff44e9d90 100644 --- a/domain/consensus/model/testapi/test_consensus_state_manager.go +++ b/domain/consensus/model/testapi/test_consensus_state_manager.go @@ -10,5 +10,6 @@ type TestConsensusStateManager interface { model.ConsensusStateManager AddUTXOToMultiset(multiset model.Multiset, entry externalapi.UTXOEntry, outpoint *externalapi.DomainOutpoint) error - ResolveBlockStatus(stagingArea *model.StagingArea, blockHash *externalapi.DomainHash) (externalapi.BlockStatus, error) + ResolveBlockStatus(stagingArea *model.StagingArea, blockHash *externalapi.DomainHash, + useSeparateStagingAreasPerBlock bool) (externalapi.BlockStatus, error) } diff --git a/domain/consensus/processes/blockbuilder/test_block_builder.go b/domain/consensus/processes/blockbuilder/test_block_builder.go index 461b9dc2b..54ec4118e 100644 --- a/domain/consensus/processes/blockbuilder/test_block_builder.go +++ b/domain/consensus/processes/blockbuilder/test_block_builder.go @@ -143,7 +143,8 @@ func (bb *testBlockBuilder) buildBlockWithParents(stagingArea *model.StagingArea return nil, nil, err } - selectedParentStatus, err := bb.testConsensus.ConsensusStateManager().ResolveBlockStatus(stagingArea, ghostdagData.SelectedParent()) + selectedParentStatus, err := bb.testConsensus.ConsensusStateManager().ResolveBlockStatus( + stagingArea, ghostdagData.SelectedParent(), false) if err != nil { return nil, nil, err } diff --git a/domain/consensus/processes/consensusstatemanager/add_block_to_virtual.go b/domain/consensus/processes/consensusstatemanager/add_block_to_virtual.go index 513f0c010..5e607864f 100644 --- a/domain/consensus/processes/consensusstatemanager/add_block_to_virtual.go +++ b/domain/consensus/processes/consensusstatemanager/add_block_to_virtual.go @@ -37,7 +37,7 @@ func (csm *consensusStateManager) AddBlock(stagingArea *model.StagingArea, block if !isViolatingFinality { log.Debugf("Block %s doesn't violate finality. Resolving its block status", blockHash) - blockStatus, err := csm.resolveBlockStatus(stagingArea, blockHash) + blockStatus, err := csm.resolveBlockStatus(stagingArea, blockHash, true) if err != nil { return nil, nil, err } diff --git a/domain/consensus/processes/consensusstatemanager/calculate_past_utxo.go b/domain/consensus/processes/consensusstatemanager/calculate_past_utxo.go index 39b36f61d..c004a3e7b 100644 --- a/domain/consensus/processes/consensusstatemanager/calculate_past_utxo.go +++ b/domain/consensus/processes/consensusstatemanager/calculate_past_utxo.go @@ -282,7 +282,7 @@ func (csm *consensusStateManager) RestorePastUTXOSetIterator(stagingArea *model. onEnd := logger.LogAndMeasureExecutionTime(log, "RestorePastUTXOSetIterator") defer onEnd() - blockStatus, err := csm.resolveBlockStatus(stagingArea, blockHash) + blockStatus, err := csm.resolveBlockStatus(stagingArea, blockHash, true) if err != nil { return nil, err } diff --git a/domain/consensus/processes/consensusstatemanager/resolve_block_status.go b/domain/consensus/processes/consensusstatemanager/resolve_block_status.go index adbf56172..bc2a5e647 100644 --- a/domain/consensus/processes/consensusstatemanager/resolve_block_status.go +++ b/domain/consensus/processes/consensusstatemanager/resolve_block_status.go @@ -12,8 +12,8 @@ import ( "github.com/pkg/errors" ) -func (csm *consensusStateManager) resolveBlockStatus( - stagingArea *model.StagingArea, blockHash *externalapi.DomainHash) (externalapi.BlockStatus, error) { +func (csm *consensusStateManager) resolveBlockStatus(stagingArea *model.StagingArea, blockHash *externalapi.DomainHash, + useSeparateStagingAreasPerBlock bool) (externalapi.BlockStatus, error) { onEnd := logger.LogAndMeasureExecutionTime(log, fmt.Sprintf("resolveBlockStatus for %s", blockHash)) defer onEnd() @@ -53,8 +53,8 @@ func (csm *consensusStateManager) resolveBlockStatus( unverifiedBlockHash := unverifiedBlocks[i] stagingAreaForCurrentBlock := stagingArea - isCurrentBlockTopBlock := i == 0 - if !isCurrentBlockTopBlock { + useSeparateStagingArea := useSeparateStagingAreasPerBlock && (i != 0) + if useSeparateStagingArea { stagingAreaForCurrentBlock = model.NewStagingArea() } @@ -72,7 +72,7 @@ func (csm *consensusStateManager) resolveBlockStatus( log.Debugf("Block %s status resolved to `%s`, finished %d/%d of unverified blocks", unverifiedBlockHash, blockStatus, len(unverifiedBlocks)-i, len(unverifiedBlocks)) - if !isCurrentBlockTopBlock { + if useSeparateStagingArea { err := staging.CommitAllChanges(csm.databaseContext, stagingAreaForCurrentBlock) if err != nil { return 0, err diff --git a/domain/consensus/processes/consensusstatemanager/resolve_block_status_test.go b/domain/consensus/processes/consensusstatemanager/resolve_block_status_test.go index c3b95834a..ab17e0c8e 100644 --- a/domain/consensus/processes/consensusstatemanager/resolve_block_status_test.go +++ b/domain/consensus/processes/consensusstatemanager/resolve_block_status_test.go @@ -147,7 +147,8 @@ func TestDoubleSpends(t *testing.T) { t.Fatalf("Error adding goodBlock: %+v", err) } //use ResolveBlockStatus, since goodBlock2 might not be the selectedTip - goodBlock2Status, err := consensus.ConsensusStateManager().ResolveBlockStatus(stagingArea, goodBlock2Hash) + goodBlock2Status, err := consensus.ConsensusStateManager().ResolveBlockStatus( + stagingArea, goodBlock2Hash, true) if err != nil { t.Fatalf("Error getting status of goodBlock: %+v", err) } diff --git a/domain/consensus/processes/consensusstatemanager/test_consensus_state_manager.go b/domain/consensus/processes/consensusstatemanager/test_consensus_state_manager.go index de1b70dff..0eb9c2d54 100644 --- a/domain/consensus/processes/consensusstatemanager/test_consensus_state_manager.go +++ b/domain/consensus/processes/consensusstatemanager/test_consensus_state_manager.go @@ -21,8 +21,8 @@ func (csm *testConsensusStateManager) AddUTXOToMultiset( return addUTXOToMultiset(multiset, entry, outpoint) } -func (csm *testConsensusStateManager) ResolveBlockStatus(stagingArea *model.StagingArea, - blockHash *externalapi.DomainHash) (externalapi.BlockStatus, error) { +func (csm *testConsensusStateManager) ResolveBlockStatus(stagingArea *model.StagingArea, blockHash *externalapi.DomainHash, + useSeparateStagingAreasPerBlock bool) (externalapi.BlockStatus, error) { - return csm.resolveBlockStatus(stagingArea, blockHash) + return csm.resolveBlockStatus(stagingArea, blockHash, useSeparateStagingAreasPerBlock) } diff --git a/domain/consensus/test_consensus.go b/domain/consensus/test_consensus.go index 4730bda31..f4c998896 100644 --- a/domain/consensus/test_consensus.go +++ b/domain/consensus/test_consensus.go @@ -21,6 +21,8 @@ type testConsensus struct { testReachabilityManager testapi.TestReachabilityManager testConsensusStateManager testapi.TestConsensusStateManager testTransactionValidator testapi.TestTransactionValidator + + buildBlockConsensus *consensus } func (tc *testConsensus) DAGParams() *dagconfig.Params {