[NOD-1461] Make further design changes (#959)

* [NOD-1461] Split blockValidator and TransactionValidator.

* [NOD-1461] Remove feeDataStore.

* [NOD-1461] Move tips out of ConsensusStateManager and into DAGTopologyManager.

* [NOD-1461] Add UTXODiffManager.

* [NOD-1461] Add RestoreDiffFromVirtual.

* [NOD-1461] Add AcceptanceManager.

* [NOD-1461] Replace SetTips with AddTip.

* [NOD-1461] Fix merge errors.

* [NOD-1461] Rename CoinbaseData to DomainCoinbaseData.
This commit is contained in:
stasatdaglabs 2020-10-20 09:35:58 +03:00 committed by GitHub
parent a96a5fd2ef
commit 8c63835971
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
22 changed files with 219 additions and 151 deletions

View File

@ -7,7 +7,7 @@ import (
// Consensus maintains the current core state of the node
type Consensus interface {
BuildBlock(coinbaseData *externalapi.CoinbaseData, transactions []*externalapi.DomainTransaction) (*externalapi.DomainBlock, error)
BuildBlock(coinbaseData *externalapi.DomainCoinbaseData, transactions []*externalapi.DomainTransaction) (*externalapi.DomainBlock, error)
ValidateAndInsertBlock(block *externalapi.DomainBlock) error
ValidateTransactionAndPopulateWithConsensusData(transaction *externalapi.DomainTransaction) error
}
@ -20,7 +20,7 @@ type consensus struct {
// BuildBlock builds a block over the current state, with the transactions
// selected by the given transactionSelector
func (s *consensus) BuildBlock(coinbaseData *externalapi.CoinbaseData,
func (s *consensus) BuildBlock(coinbaseData *externalapi.DomainCoinbaseData,
transactions []*externalapi.DomainTransaction) (*externalapi.DomainBlock, error) {
return s.blockProcessor.BuildBlock(coinbaseData, transactions)

View File

@ -1,25 +0,0 @@
package feedatastore
import (
"github.com/kaspanet/kaspad/domain/consensus/model"
"github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
)
// feeDataStore represents a store of fee data
type feeDataStore struct {
}
// New instantiates a new FeeDataStore
func New() model.FeeDataStore {
return &feeDataStore{}
}
// Insert inserts the given fee for the given blockHash
func (ads *feeDataStore) Insert(dbTx model.DBTxProxy, blockHash *externalapi.DomainHash, fee uint64) error {
return nil
}
// Get gets the fee associated with the given blockHash
func (ads *feeDataStore) Get(dbContext model.DBContextProxy, blockHash *externalapi.DomainHash) (uint64, error) {
return 0, nil
}

View File

@ -7,14 +7,15 @@ import (
"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/feedatastore"
"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/processes/acceptancemanager"
"github.com/kaspanet/kaspad/domain/consensus/processes/blockprocessor"
"github.com/kaspanet/kaspad/domain/consensus/processes/blockvalidator"
"github.com/kaspanet/kaspad/domain/consensus/processes/consensusstatemanager"
"github.com/kaspanet/kaspad/domain/consensus/processes/dagtopologymanager"
"github.com/kaspanet/kaspad/domain/consensus/processes/dagtraversalmanager"
@ -23,7 +24,8 @@ import (
"github.com/kaspanet/kaspad/domain/consensus/processes/pastmediantimemanager"
"github.com/kaspanet/kaspad/domain/consensus/processes/pruningmanager"
"github.com/kaspanet/kaspad/domain/consensus/processes/reachabilitytree"
validatorpkg "github.com/kaspanet/kaspad/domain/consensus/processes/validator"
"github.com/kaspanet/kaspad/domain/consensus/processes/transactionvalidator"
"github.com/kaspanet/kaspad/domain/consensus/processes/utxodiffmanager"
"github.com/kaspanet/kaspad/domain/dagconfig"
"github.com/kaspanet/kaspad/infrastructure/db/dbaccess"
)
@ -48,7 +50,6 @@ func (f *factory) NewConsensus(dagParams *dagconfig.Params, databaseContext *dba
utxoDiffStore := utxodiffstore.New()
consensusStateStore := consensusstatestore.New()
ghostdagDataStore := ghostdagdatastore.New()
feeDataStore := feedatastore.New()
domainDBContext := database.NewDomainDBContext(databaseContext)
@ -68,6 +69,8 @@ func (f *factory) NewConsensus(dagParams *dagconfig.Params, databaseContext *dba
dagTraversalManager := dagtraversalmanager.New(
dagTopologyManager,
ghostdagManager)
utxoDiffManager := utxodiffmanager.New()
acceptanceManager := acceptancemanager.New(utxoDiffManager)
consensusStateManager := consensusstatemanager.New(
domainDBContext,
dagParams,
@ -75,7 +78,8 @@ func (f *factory) NewConsensus(dagParams *dagconfig.Params, databaseContext *dba
multisetStore,
utxoDiffStore,
blockStore,
ghostdagManager)
ghostdagManager,
acceptanceManager)
pruningManager := pruningmanager.New(
dagTraversalManager,
pruningStore,
@ -86,16 +90,20 @@ func (f *factory) NewConsensus(dagParams *dagconfig.Params, databaseContext *dba
ghostdagManager)
pastMedianTimeManager := pastmediantimemanager.New(
ghostdagManager)
validator := validatorpkg.New(
transactionValidator := transactionvalidator.New()
blockValidator := blockvalidator.New(
consensusStateManager,
difficultyManager,
pastMedianTimeManager)
pastMedianTimeManager,
transactionValidator,
utxoDiffManager,
acceptanceManager)
blockProcessor := blockprocessor.New(
dagParams,
domainDBContext,
consensusStateManager,
pruningManager,
validator,
blockValidator,
dagTopologyManager,
reachabilityTree,
difficultyManager,
@ -103,13 +111,12 @@ func (f *factory) NewConsensus(dagParams *dagconfig.Params, databaseContext *dba
ghostdagManager,
acceptanceDataStore,
blockStore,
blockStatusStore,
feeDataStore)
blockStatusStore)
return &consensus{
consensusStateManager: consensusStateManager,
blockProcessor: blockProcessor,
transactionValidator: validator,
transactionValidator: transactionValidator,
}
}

View File

@ -0,0 +1,8 @@
package externalapi
// DomainCoinbaseData contains data by which a coinbase transaction
// is built
type DomainCoinbaseData struct {
scriptPublicKey []byte
extraData []byte
}

View File

@ -1,8 +0,0 @@
package externalapi
// CoinbaseData contains data by which a coinbase transaction
// is built
type CoinbaseData struct {
scriptPublicKey []byte
extraData []byte
}

View File

@ -1,9 +0,0 @@
package model
import "github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
// FeeDataStore represents a store of fee data
type FeeDataStore interface {
Insert(dbTx DBTxProxy, blockHash *externalapi.DomainHash, fee uint64) error
Get(dbContext DBContextProxy, blockHash *externalapi.DomainHash) (uint64, error)
}

View File

@ -0,0 +1,7 @@
package model
// AcceptanceManager manages transaction acceptance
// and related data
type AcceptanceManager interface {
CalculateAcceptanceDataAndUTXOMultiset(blockGHOSTDAGData *BlockGHOSTDAGData) (*BlockAcceptanceData, Multiset, error)
}

View File

@ -5,6 +5,6 @@ import "github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
// BlockProcessor is responsible for processing incoming blocks
// and creating blocks from the current state
type BlockProcessor interface {
BuildBlock(coinbaseData *externalapi.CoinbaseData, transactions []*externalapi.DomainTransaction) (*externalapi.DomainBlock, error)
BuildBlock(coinbaseData *externalapi.DomainCoinbaseData, transactions []*externalapi.DomainTransaction) (*externalapi.DomainBlock, error)
ValidateAndInsertBlock(block *externalapi.DomainBlock) error
}

View File

@ -7,8 +7,7 @@ type ConsensusStateManager interface {
UTXOByOutpoint(outpoint *externalapi.DomainOutpoint) (*externalapi.UTXOEntry, error)
CalculateConsensusStateChanges(block *externalapi.DomainBlock, isDisqualified bool) (stateChanges *ConsensusStateChanges,
utxoDiffChanges *UTXODiffChanges, virtualGHOSTDAGData *BlockGHOSTDAGData, err error)
CalculateAcceptanceDataAndUTXOMultiset(blockGHOSTDAGData *BlockGHOSTDAGData) (*BlockAcceptanceData, Multiset, error)
Tips() ([]*externalapi.DomainHash, error)
VirtualData() (medianTime int64, blueScore uint64, err error)
RestorePastUTXOSet(blockHash *externalapi.DomainHash) (ReadOnlyUTXOSet, error)
RestoreDiffFromVirtual(utxoDiff *UTXODiff, virtualDiffParentHash *externalapi.DomainHash) (*UTXODiff, error)
}

View File

@ -13,4 +13,7 @@ type DAGTopologyManager interface {
IsDescendantOf(blockHashA *externalapi.DomainHash, blockHashB *externalapi.DomainHash) (bool, error)
IsAncestorOfAny(blockHash *externalapi.DomainHash, potentialDescendants []*externalapi.DomainHash) (bool, error)
IsInSelectedParentChainOf(blockHashA *externalapi.DomainHash, blockHashB *externalapi.DomainHash) (bool, error)
Tips() ([]*externalapi.DomainHash, error)
AddTip(tipHash *externalapi.DomainHash) error
}

View File

@ -0,0 +1,11 @@
package model
import "github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
// UTXODiffManager provides methods to access
// and store UTXO diffs
type UTXODiffManager interface {
StoreUTXODiff(blockHash *externalapi.DomainHash, utxoDiff *UTXODiff) error
RestoreBlockDiffFromVirtualDiffParent(blockHash *externalapi.DomainHash) (utxoDiff *UTXODiff,
virtualDiffParentHash *externalapi.DomainHash, err error)
}

View File

@ -0,0 +1,24 @@
package acceptancemanager
import (
"github.com/kaspanet/kaspad/domain/consensus/model"
)
// AcceptanceManager manages transaction acceptance
// and related data
type acceptanceManager struct {
utxoDiffManager model.UTXODiffManager
}
// New instantiates a new AcceptanceManager
func New(utxoDiffManager model.UTXODiffManager) model.AcceptanceManager {
return &acceptanceManager{
utxoDiffManager: utxoDiffManager,
}
}
func (a *acceptanceManager) CalculateAcceptanceDataAndUTXOMultiset(blockGHOSTDAGData *model.BlockGHOSTDAGData) (
*model.BlockAcceptanceData, model.Multiset, error) {
panic("implement me")
}

View File

@ -24,7 +24,6 @@ type blockProcessor struct {
acceptanceDataStore model.AcceptanceDataStore
blockMessageStore model.BlockStore
blockStatusStore model.BlockStatusStore
feeDataStore model.FeeDataStore
}
// New instantiates a new BlockProcessor
@ -41,8 +40,7 @@ func New(
ghostdagManager model.GHOSTDAGManager,
acceptanceDataStore model.AcceptanceDataStore,
blockMessageStore model.BlockStore,
blockStatusStore model.BlockStatusStore,
feeDataStore model.FeeDataStore) model.BlockProcessor {
blockStatusStore model.BlockStatusStore) model.BlockProcessor {
return &blockProcessor{
dagParams: dagParams,
@ -59,13 +57,12 @@ func New(
acceptanceDataStore: acceptanceDataStore,
blockMessageStore: blockMessageStore,
blockStatusStore: blockStatusStore,
feeDataStore: feeDataStore,
}
}
// BuildBlock builds a block over the current state, with the transactions
// selected by the given transactionSelector
func (bp *blockProcessor) BuildBlock(coinbaseData *externalapi.CoinbaseData,
func (bp *blockProcessor) BuildBlock(coinbaseData *externalapi.DomainCoinbaseData,
transactions []*externalapi.DomainTransaction) (*externalapi.DomainBlock, error) {
return nil, nil

View File

@ -0,0 +1,70 @@
package blockvalidator
import (
"github.com/kaspanet/kaspad/domain/consensus/model"
"github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
)
// blockValidator exposes a set of validation classes, after which
// it's possible to determine whether either a block is valid
type blockValidator struct {
consensusStateManager model.ConsensusStateManager
difficultyManager model.DifficultyManager
pastMedianTimeManager model.PastMedianTimeManager
transactionValidator model.TransactionValidator
utxoDiffManager model.UTXODiffManager
acceptanceManager model.AcceptanceManager
}
// New instantiates a new BlockValidator
func New(
consensusStateManager model.ConsensusStateManager,
difficultyManager model.DifficultyManager,
pastMedianTimeManager model.PastMedianTimeManager,
transactionValidator model.TransactionValidator,
utxoDiffManager model.UTXODiffManager,
acceptanceManager model.AcceptanceManager) model.BlockValidator {
return &blockValidator{
consensusStateManager: consensusStateManager,
difficultyManager: difficultyManager,
pastMedianTimeManager: pastMedianTimeManager,
transactionValidator: transactionValidator,
utxoDiffManager: utxoDiffManager,
acceptanceManager: acceptanceManager,
}
}
// ValidateHeaderInIsolation validates block headers in isolation from the current
// consensus state
func (v *blockValidator) ValidateHeaderInIsolation(block *externalapi.DomainBlock) error {
return nil
}
// ValidateHeaderInContext validates block headers in the context of the current
// consensus state
func (v *blockValidator) ValidateHeaderInContext(block *externalapi.DomainBlock) error {
return nil
}
// ValidateBodyInIsolation validates block bodies in isolation from the current
// consensus state
func (v *blockValidator) ValidateBodyInIsolation(block *externalapi.DomainBlock) error {
return nil
}
// ValidateBodyInContext validates block bodies in the context of the current
// consensus state
func (v *blockValidator) ValidateBodyInContext(block *externalapi.DomainBlock) error {
return nil
}
// ValidateAgainstPastUTXO validates the block against the UTXO of its past
func (v *blockValidator) ValidateAgainstPastUTXO(block *externalapi.DomainBlock) error {
return nil
}
// ValidateFinality makes sure the block does not violate finality
func (v *blockValidator) ValidateFinality(block *externalapi.DomainBlock) error {
return nil
}

View File

@ -17,6 +17,7 @@ type consensusStateManager struct {
utxoDiffStore model.UTXODiffStore
blockStore model.BlockStore
ghostdagManager model.GHOSTDAGManager
acceptanceManager model.AcceptanceManager
}
// New instantiates a new ConsensusStateManager
@ -27,7 +28,8 @@ func New(
multisetStore model.MultisetStore,
utxoDiffStore model.UTXODiffStore,
blockStore model.BlockStore,
ghostdagManager model.GHOSTDAGManager) model.ConsensusStateManager {
ghostdagManager model.GHOSTDAGManager,
acceptanceManager model.AcceptanceManager) model.ConsensusStateManager {
return &consensusStateManager{
dagParams: dagParams,
@ -38,6 +40,7 @@ func New(
utxoDiffStore: utxoDiffStore,
blockStore: blockStore,
ghostdagManager: ghostdagManager,
acceptanceManager: acceptanceManager,
}
}
@ -55,19 +58,6 @@ func (csm *consensusStateManager) CalculateConsensusStateChanges(block *external
return nil, nil, nil, nil
}
// CalculateAcceptanceDataAndUTXOMultiset calculates and returns the acceptance data and the
// multiset associated with the given blockHash
func (csm *consensusStateManager) CalculateAcceptanceDataAndUTXOMultiset(blockGHOSTDAGData *model.BlockGHOSTDAGData) (
*model.BlockAcceptanceData, model.Multiset, error) {
return nil, nil, nil
}
// Tips returns the current DAG tips
func (csm *consensusStateManager) Tips() ([]*externalapi.DomainHash, error) {
return nil, nil
}
// VirtualData returns the medianTime and blueScore of the current virtual block
func (csm *consensusStateManager) VirtualData() (medianTime int64, blueScore uint64, err error) {
return 0, 0, nil
@ -77,3 +67,9 @@ func (csm *consensusStateManager) VirtualData() (medianTime int64, blueScore uin
func (csm *consensusStateManager) RestorePastUTXOSet(blockHash *externalapi.DomainHash) (model.ReadOnlyUTXOSet, error) {
return nil, nil
}
// RestoreDiffFromVirtual restores the diff between the given virtualDiffParentHash
// and the virtual
func (csm *consensusStateManager) RestoreDiffFromVirtual(utxoDiff *model.UTXODiff, virtualDiffParentHash *externalapi.DomainHash) (*model.UTXODiff, error) {
panic("implement me")
}

View File

@ -91,3 +91,13 @@ func isHashInSlice(hash *externalapi.DomainHash, hashes []*externalapi.DomainHas
}
return false
}
// Tips returns the current DAG tips
func (dtm *dagTopologyManager) Tips() ([]*externalapi.DomainHash, error) {
panic("implement me")
}
// AddTip adds the given tip to the current DAG tips
func (dtm *dagTopologyManager) AddTip(tipHash *externalapi.DomainHash) error {
panic("implement me")
}

View File

@ -0,0 +1,22 @@
package transactionvalidator
import (
"github.com/kaspanet/kaspad/domain/consensus/model"
"github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
)
// transactionValidator exposes a set of validation classes, after which
// it's possible to determine whether either a transaction is valid
type transactionValidator struct {
}
// New instantiates a new TransactionValidator
func New() model.TransactionValidator {
return &transactionValidator{}
}
// ValidateTransactionAndCalculateFee validates the given transaction
// and populates it with any missing consensus data
func (v *transactionValidator) ValidateTransactionAndPopulateWithConsensusData(transaction *externalapi.DomainTransaction) error {
panic("implement me")
}

View File

@ -0,0 +1,27 @@
package utxodiffmanager
import (
"github.com/kaspanet/kaspad/domain/consensus/model"
"github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
)
// UTXODiffManager provides methods to access
// and store UTXO diffs
type utxoDiffManager struct {
}
// New instantiates a new UTXODiffManager
func New() model.UTXODiffManager {
return &utxoDiffManager{}
}
// StoreUTXODiff stores the given utxoDiff for the given blockHash
func (u *utxoDiffManager) StoreUTXODiff(blockHash *externalapi.DomainHash, utxoDiff *model.UTXODiff) error {
panic("implement me")
}
// RestoreBlockDiffFromVirtualDiffParent restores the UTXO diff of
// the block for the given blockHash.
func (u *utxoDiffManager) RestoreBlockDiffFromVirtualDiffParent(blockHash *externalapi.DomainHash) (utxoDiff *model.UTXODiff, virtualDiffParentHash *externalapi.DomainHash, err error) {
panic("implement me")
}

View File

@ -1,71 +0,0 @@
package validator
import (
"github.com/kaspanet/kaspad/domain/consensus/model"
"github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
)
// validator exposes a set of validation classes, after which
// it's possible to determine whether either a block or a
// transaction is valid
type validator struct {
consensusStateManager model.ConsensusStateManager
difficultyManager model.DifficultyManager
pastMedianTimeManager model.PastMedianTimeManager
}
// New instantiates a new BlockAndTransactionValidator
func New(
consensusStateManager model.ConsensusStateManager,
difficultyManager model.DifficultyManager,
pastMedianTimeManager model.PastMedianTimeManager) interface {
model.BlockValidator
model.TransactionValidator
} {
return &validator{
consensusStateManager: consensusStateManager,
difficultyManager: difficultyManager,
pastMedianTimeManager: pastMedianTimeManager,
}
}
// ValidateHeaderInIsolation validates block headers in isolation from the current
// consensus state
func (v *validator) ValidateHeaderInIsolation(block *externalapi.DomainBlock) error {
return nil
}
// ValidateHeaderInContext validates block headers in the context of the current
// consensus state
func (v *validator) ValidateHeaderInContext(block *externalapi.DomainBlock) error {
return nil
}
// ValidateBodyInIsolation validates block bodies in isolation from the current
// consensus state
func (v *validator) ValidateBodyInIsolation(block *externalapi.DomainBlock) error {
return nil
}
// ValidateBodyInContext validates block bodies in the context of the current
// consensus state
func (v *validator) ValidateBodyInContext(block *externalapi.DomainBlock) error {
return nil
}
// ValidateAgainstPastUTXO validates the block against the UTXO of its past
func (v *validator) ValidateAgainstPastUTXO(block *externalapi.DomainBlock) error {
return nil
}
// ValidateFinality makes sure the block does not violate finality
func (v *validator) ValidateFinality(block *externalapi.DomainBlock) error {
return nil
}
// ValidateTransactionAndPopulateWithConsensusData validates the given transaction
// and populates it with any missing consensus data
func (v *validator) ValidateTransactionAndPopulateWithConsensusData(transaction *externalapi.DomainTransaction) error {
return nil
}

View File

@ -21,6 +21,6 @@ func New(consensus *consensus.Consensus, mempool miningmanagerapi.Mempool) minin
}
// GetBlockTemplate creates a block template for a miner to consume
func (btb *blockTemplateBuilder) GetBlockTemplate(coinbaseData *consensusexternalapi.CoinbaseData) *consensusexternalapi.DomainBlock {
func (btb *blockTemplateBuilder) GetBlockTemplate(coinbaseData *consensusexternalapi.DomainCoinbaseData) *consensusexternalapi.DomainBlock {
return nil
}

View File

@ -8,7 +8,7 @@ import (
// MiningManager creates block templates for mining as well as maintaining
// known transactions that have no yet been added to any block
type MiningManager interface {
GetBlockTemplate(coinbaseData *consensusexternalapi.CoinbaseData) *consensusexternalapi.DomainBlock
GetBlockTemplate(coinbaseData *consensusexternalapi.DomainCoinbaseData) *consensusexternalapi.DomainBlock
HandleNewBlock(block *consensusexternalapi.DomainBlock)
ValidateAndInsertTransaction(transaction *consensusexternalapi.DomainTransaction) error
}
@ -19,7 +19,7 @@ type miningManager struct {
}
// GetBlockTemplate creates a block template for a miner to consume
func (mm *miningManager) GetBlockTemplate(coinbaseData *consensusexternalapi.CoinbaseData) *consensusexternalapi.DomainBlock {
func (mm *miningManager) GetBlockTemplate(coinbaseData *consensusexternalapi.DomainCoinbaseData) *consensusexternalapi.DomainBlock {
return mm.blockTemplateBuilder.GetBlockTemplate(coinbaseData)
}

View File

@ -6,5 +6,5 @@ import (
// BlockTemplateBuilder builds block templates for miners to consume
type BlockTemplateBuilder interface {
GetBlockTemplate(coinbaseData *consensusexternalapi.CoinbaseData) *consensusexternalapi.DomainBlock
GetBlockTemplate(coinbaseData *consensusexternalapi.DomainCoinbaseData) *consensusexternalapi.DomainBlock
}