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

View File

@ -3,20 +3,25 @@ package blockbuilder
import (
"github.com/kaspanet/kaspad/domain/consensus/model"
"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/infrastructure/logger"
)
type testBlockBuilder struct {
*blockBuilder
testConsensus testapi.TestConsensus
}
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}
// NewTestBlockBuilder creates an instance of a TestBlockBuilder
func NewTestBlockBuilder(baseBlockBuilder model.BlockBuilder) model.TestBlockBuilder {
return &testBlockBuilder{blockBuilder: baseBlockBuilder.(*blockBuilder)}
func NewTestBlockBuilder(baseBlockBuilder model.BlockBuilder, testConsensus testapi.TestConsensus) model.TestBlockBuilder {
return &testBlockBuilder{
blockBuilder: baseBlockBuilder.(*blockBuilder),
testConsensus: testConsensus,
}
}
func (bb *testBlockBuilder) BuildBlockWithParents(parentHashes []*externalapi.DomainHash, coinbaseData *externalapi.DomainCoinbaseData,
@ -79,6 +84,20 @@ func (bb *testBlockBuilder) buildBlockWithParents(
}
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)
if err != nil {
return nil, err
@ -87,7 +106,6 @@ func (bb *testBlockBuilder) buildBlockWithParents(
if err != nil {
return nil, err
}
defer bb.acceptanceDataStore.Discard()
coinbase, err := bb.newBlockCoinbaseTransaction(coinbaseData)
if err != nil {

View File

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