[NOD-1532] Make BuildBlockWithParents resolve the status of the new block's selectedParent

This commit is contained in:
Mike Zak 2020-11-15 14:55:56 +02:00 committed by Svarog
parent 7d14f24b84
commit aeded07815
3 changed files with 30 additions and 11 deletions

View File

@ -1,12 +1,13 @@
package consensus package consensus
import ( import (
"github.com/kaspanet/kaspad/domain/consensus/processes/dagtraversalmanager"
"io/ioutil" "io/ioutil"
"math/rand" "math/rand"
"os" "os"
"sync" "sync"
"github.com/kaspanet/kaspad/domain/consensus/processes/dagtraversalmanager"
"github.com/kaspanet/kaspad/infrastructure/db/database/ldb" "github.com/kaspanet/kaspad/infrastructure/db/database/ldb"
consensusdatabase "github.com/kaspanet/kaspad/domain/consensus/database" consensusdatabase "github.com/kaspanet/kaspad/domain/consensus/database"
@ -282,6 +283,7 @@ func (f *factory) NewConsensus(dagParams *dagconfig.Params, db infrastructuredat
headerTipsStore: headerTipsStore, headerTipsStore: headerTipsStore,
multisetStore: multisetStore, multisetStore: multisetStore,
reachabilityDataStore: reachabilityDataStore, reachabilityDataStore: reachabilityDataStore,
utxoDiffStore: utxoDiffStore,
} }
genesisInfo, err := c.GetBlockInfo(genesisHash) genesisInfo, err := c.GetBlockInfo(genesisHash)
@ -317,20 +319,20 @@ func (f *factory) NewTestConsensus(dagParams *dagconfig.Params, testName string)
consensusAsImplementation := consensusAsInterface.(*consensus) consensusAsImplementation := consensusAsInterface.(*consensus)
testBlockBuilder := blockbuilder.NewTestBlockBuilder(consensusAsImplementation.blockBuilder)
testConsensusStateManager := consensusstatemanager.NewTestConsensusStateManager(consensusAsImplementation.consensusStateManager) testConsensusStateManager := consensusstatemanager.NewTestConsensusStateManager(consensusAsImplementation.consensusStateManager)
tc = &testConsensus{
tstConsensus := &testConsensus{
rd: rand.New(rand.NewSource(0)), rd: rand.New(rand.NewSource(0)),
consensus: consensusAsImplementation, consensus: consensusAsImplementation,
testBlockBuilder: testBlockBuilder,
testConsensusStateManager: testConsensusStateManager, testConsensusStateManager: testConsensusStateManager,
testReachabilityManager: reachabilitymanager.NewTestReachabilityManager(consensusAsImplementation. testReachabilityManager: reachabilitymanager.NewTestReachabilityManager(consensusAsImplementation.
reachabilityManager), reachabilityManager),
} }
tstConsensus.testBlockBuilder = blockbuilder.NewTestBlockBuilder(consensusAsImplementation.blockBuilder, tstConsensus)
teardown = func() { teardown = func() {
db.Close() db.Close()
os.RemoveAll(testDatabaseDir) os.RemoveAll(testDatabaseDir)
} }
return tc, teardown, nil return tstConsensus, teardown, nil
} }

View File

@ -3,20 +3,25 @@ package blockbuilder
import ( import (
"github.com/kaspanet/kaspad/domain/consensus/model" "github.com/kaspanet/kaspad/domain/consensus/model"
"github.com/kaspanet/kaspad/domain/consensus/model/externalapi" "github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
"github.com/kaspanet/kaspad/domain/consensus/model/testapi"
"github.com/kaspanet/kaspad/domain/consensus/utils/constants" "github.com/kaspanet/kaspad/domain/consensus/utils/constants"
"github.com/kaspanet/kaspad/infrastructure/logger" "github.com/kaspanet/kaspad/infrastructure/logger"
) )
type testBlockBuilder struct { type testBlockBuilder struct {
*blockBuilder *blockBuilder
testConsensus testapi.TestConsensus
} }
var tempBlockHash = &externalapi.DomainHash{ var tempBlockHash = &externalapi.DomainHash{
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
// NewTestBlockBuilder creates an instance of a TestBlockBuilder // NewTestBlockBuilder creates an instance of a TestBlockBuilder
func NewTestBlockBuilder(baseBlockBuilder model.BlockBuilder) model.TestBlockBuilder { func NewTestBlockBuilder(baseBlockBuilder model.BlockBuilder, testConsensus testapi.TestConsensus) model.TestBlockBuilder {
return &testBlockBuilder{blockBuilder: baseBlockBuilder.(*blockBuilder)} return &testBlockBuilder{
blockBuilder: baseBlockBuilder.(*blockBuilder),
testConsensus: testConsensus,
}
} }
func (bb *testBlockBuilder) BuildBlockWithParents(parentHashes []*externalapi.DomainHash, coinbaseData *externalapi.DomainCoinbaseData, func (bb *testBlockBuilder) BuildBlockWithParents(parentHashes []*externalapi.DomainHash, coinbaseData *externalapi.DomainCoinbaseData,
@ -79,6 +84,20 @@ func (bb *testBlockBuilder) buildBlockWithParents(
} }
defer bb.ghostdagDataStore.Discard() defer bb.ghostdagDataStore.Discard()
ghostdagData, err := bb.ghostdagDataStore.Get(bb.databaseContext, tempBlockHash)
if err != nil {
return nil, err
}
_, err = bb.testConsensus.ConsensusStateManager().ResolveBlockStatus(ghostdagData.SelectedParent)
if err != nil {
return nil, err
}
defer bb.testConsensus.BlockStatusStore().Discard()
defer bb.acceptanceDataStore.Discard()
defer bb.multisetStore.Discard()
defer bb.testConsensus.UTXODiffStore().Discard()
_, acceptanceData, multiset, err := bb.consensusStateManager.CalculatePastUTXOAndAcceptanceData(tempBlockHash) _, acceptanceData, multiset, err := bb.consensusStateManager.CalculatePastUTXOAndAcceptanceData(tempBlockHash)
if err != nil { if err != nil {
return nil, err return nil, err
@ -87,7 +106,6 @@ func (bb *testBlockBuilder) buildBlockWithParents(
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer bb.acceptanceDataStore.Discard()
coinbase, err := bb.newBlockCoinbaseTransaction(coinbaseData) coinbase, err := bb.newBlockCoinbaseTransaction(coinbaseData)
if err != nil { if err != nil {

View File

@ -2,7 +2,6 @@ package consensus
import ( import (
"github.com/kaspanet/kaspad/domain/consensus/model" "github.com/kaspanet/kaspad/domain/consensus/model"
"github.com/kaspanet/kaspad/domain/consensus/processes/blockbuilder"
) )
func (tc *testConsensus) DatabaseContext() model.DBReader { func (tc *testConsensus) DatabaseContext() model.DBReader {
@ -58,7 +57,7 @@ func (tc *testConsensus) UTXODiffStore() model.UTXODiffStore {
} }
func (tc *testConsensus) BlockBuilder() model.TestBlockBuilder { func (tc *testConsensus) BlockBuilder() model.TestBlockBuilder {
return blockbuilder.NewTestBlockBuilder(tc.blockBuilder) return tc.testBlockBuilder
} }
func (tc *testConsensus) BlockProcessor() model.BlockProcessor { func (tc *testConsensus) BlockProcessor() model.BlockProcessor {