kaspad/domain/consensus/factory.go
stasatdaglabs 62bb841e89
[NOD-1497] Add additional methods to consensus' external API (#991)
* [NOD-1497] Add missing APIs.

* [NOD-1497] Rename some new APIs.

* [NOD-1497] Implement getBlock and getBlockHeader.

* [NOD-1497] Implement getPruningPointUTXOSet.

* [NOD-1497] Implement getSelectedParent.

* [NOD-1497] Implement getBlockInfo.

* [NOD-1497] Fix merge errors.

* [NOD-1497] Implement syncManager-related functions in consensus.

* [NOD-1497] Implement SetPruningPointUTXOSet in consensus.

* [NOD-1497] Add dependency from syncManager to dagTraversalManager.

* [NOD-1497] Move IsBlockHeaderInPruningPointFutureAndVirtualPast to syncManager.

* [NOD-1497] Rename lowHigh to lowHash.
2020-11-02 13:24:03 +02:00

182 lines
5.9 KiB
Go

package consensus
import (
consensusdatabase "github.com/kaspanet/kaspad/domain/consensus/database"
"github.com/kaspanet/kaspad/domain/consensus/datastructures/acceptancedatastore"
"github.com/kaspanet/kaspad/domain/consensus/datastructures/blockheaderstore"
"github.com/kaspanet/kaspad/domain/consensus/datastructures/blockrelationstore"
"github.com/kaspanet/kaspad/domain/consensus/datastructures/blockstatusstore"
"github.com/kaspanet/kaspad/domain/consensus/datastructures/blockstore"
"github.com/kaspanet/kaspad/domain/consensus/datastructures/consensusstatestore"
"github.com/kaspanet/kaspad/domain/consensus/datastructures/ghostdagdatastore"
"github.com/kaspanet/kaspad/domain/consensus/datastructures/multisetstore"
"github.com/kaspanet/kaspad/domain/consensus/datastructures/pruningstore"
"github.com/kaspanet/kaspad/domain/consensus/datastructures/reachabilitydatastore"
"github.com/kaspanet/kaspad/domain/consensus/datastructures/utxodiffstore"
"github.com/kaspanet/kaspad/domain/consensus/model"
"github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
"github.com/kaspanet/kaspad/domain/consensus/processes/blockprocessor"
"github.com/kaspanet/kaspad/domain/consensus/processes/blockvalidator"
"github.com/kaspanet/kaspad/domain/consensus/processes/coinbasemanager"
"github.com/kaspanet/kaspad/domain/consensus/processes/consensusstatemanager"
"github.com/kaspanet/kaspad/domain/consensus/processes/dagtopologymanager"
"github.com/kaspanet/kaspad/domain/consensus/processes/dagtraversalmanager"
"github.com/kaspanet/kaspad/domain/consensus/processes/difficultymanager"
"github.com/kaspanet/kaspad/domain/consensus/processes/ghostdagmanager"
"github.com/kaspanet/kaspad/domain/consensus/processes/pastmediantimemanager"
"github.com/kaspanet/kaspad/domain/consensus/processes/pruningmanager"
"github.com/kaspanet/kaspad/domain/consensus/processes/reachabilitymanager"
"github.com/kaspanet/kaspad/domain/consensus/processes/syncmanager"
"github.com/kaspanet/kaspad/domain/consensus/processes/transactionvalidator"
"github.com/kaspanet/kaspad/domain/dagconfig"
infrastructuredatabase "github.com/kaspanet/kaspad/infrastructure/db/database"
)
// Factory instantiates new Consensuses
type Factory interface {
NewConsensus(dagParams *dagconfig.Params, db infrastructuredatabase.Database) Consensus
}
type factory struct{}
// NewConsensus instantiates a new Consensus
func (f *factory) NewConsensus(dagParams *dagconfig.Params, db infrastructuredatabase.Database) Consensus {
// Data Structures
acceptanceDataStore := acceptancedatastore.New()
blockStore := blockstore.New()
blockHeaderStore := blockheaderstore.New()
blockRelationStore := blockrelationstore.New()
blockStatusStore := blockstatusstore.New()
multisetStore := multisetstore.New()
pruningStore := pruningstore.New()
reachabilityDataStore := reachabilitydatastore.New()
utxoDiffStore := utxodiffstore.New()
consensusStateStore := consensusstatestore.New()
ghostdagDataStore := ghostdagdatastore.New()
dbManager := consensusdatabase.New(db)
// Processes
reachabilityManager := reachabilitymanager.New(
dbManager,
ghostdagDataStore,
blockRelationStore,
reachabilityDataStore)
dagTopologyManager := dagtopologymanager.New(
dbManager,
reachabilityManager,
blockRelationStore)
ghostdagManager := ghostdagmanager.New(
dbManager,
dagTopologyManager,
ghostdagDataStore,
model.KType(dagParams.K))
dagTraversalManager := dagtraversalmanager.New(
dbManager,
dagTopologyManager,
ghostdagDataStore)
pruningManager := pruningmanager.New(
dagTraversalManager,
dagTopologyManager,
pruningStore,
blockStatusStore,
consensusStateStore)
consensusStateManager := consensusstatemanager.New(
dbManager,
dagParams,
ghostdagManager,
dagTopologyManager,
pruningManager,
blockStatusStore,
ghostdagDataStore,
consensusStateStore,
multisetStore,
blockStore,
utxoDiffStore,
blockRelationStore,
acceptanceDataStore,
blockHeaderStore)
difficultyManager := difficultymanager.New(
ghostdagManager)
pastMedianTimeManager := pastmediantimemanager.New(
dagParams.TimestampDeviationTolerance,
dbManager,
dagTraversalManager,
blockHeaderStore)
transactionValidator := transactionvalidator.New(dagParams.BlockCoinbaseMaturity,
dbManager,
pastMedianTimeManager,
ghostdagDataStore)
coinbaseManager := coinbasemanager.New(
ghostdagDataStore,
acceptanceDataStore)
genesisHash := externalapi.DomainHash(*dagParams.GenesisHash)
blockValidator := blockvalidator.New(
dagParams.PowMax,
false,
&genesisHash,
dagParams.EnableNonNativeSubnetworks,
dagParams.DisableDifficultyAdjustment,
dagParams.DifficultyAdjustmentWindowSize,
uint64(dagParams.FinalityDuration/dagParams.TargetTimePerBlock),
dbManager,
consensusStateManager,
difficultyManager,
pastMedianTimeManager,
transactionValidator,
ghostdagManager,
dagTopologyManager,
dagTraversalManager,
blockStore,
ghostdagDataStore,
blockHeaderStore,
)
blockProcessor := blockprocessor.New(
dagParams,
dbManager,
consensusStateManager,
pruningManager,
blockValidator,
dagTopologyManager,
reachabilityManager,
difficultyManager,
pastMedianTimeManager,
ghostdagManager,
coinbaseManager,
acceptanceDataStore,
blockStore,
blockStatusStore,
blockRelationStore,
multisetStore,
ghostdagDataStore,
consensusStateStore,
pruningStore,
reachabilityDataStore,
utxoDiffStore,
blockHeaderStore)
syncManager := syncmanager.New(dagTraversalManager)
return &consensus{
databaseContext: dbManager,
blockProcessor: blockProcessor,
consensusStateManager: consensusStateManager,
transactionValidator: transactionValidator,
syncManager: syncManager,
blockStore: blockStore,
blockHeaderStore: blockHeaderStore,
pruningStore: pruningStore,
ghostdagDataStore: ghostdagDataStore,
blockStatusStore: blockStatusStore,
}
}
// NewFactory creates a new Consensus factory
func NewFactory() Factory {
return &factory{}
}