mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-06-05 13:46:42 +00:00
[NOD-1510] Update reachability reindex root based on header tips selected tip (#1001)
This commit is contained in:
parent
2eb0d946e5
commit
baf8d25656
@ -103,7 +103,7 @@ func (f *factory) NewConsensus(dagParams *dagconfig.Params, db infrastructuredat
|
||||
dbManager,
|
||||
ghostdagDataStore,
|
||||
acceptanceDataStore)
|
||||
headerTipsManager := headertipsmanager.New(dbManager, dagTopologyManager, headerTipsStore)
|
||||
headerTipsManager := headertipsmanager.New(dbManager, dagTopologyManager, ghostdagManager, headerTipsStore)
|
||||
genesisHash := (*externalapi.DomainHash)(dagParams.GenesisHash)
|
||||
mergeDepthManager := mergedepthmanager.New(
|
||||
dagParams.FinalityDepth(),
|
||||
|
@ -5,7 +5,7 @@ import "github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
|
||||
// GHOSTDAGManager resolves and manages GHOSTDAG block data
|
||||
type GHOSTDAGManager interface {
|
||||
GHOSTDAG(blockHash *externalapi.DomainHash) error
|
||||
ChooseSelectedParent(blockHashA *externalapi.DomainHash, blockHashB *externalapi.DomainHash) (*externalapi.DomainHash, error)
|
||||
ChooseSelectedParent(blockHashes ...*externalapi.DomainHash) (*externalapi.DomainHash, error)
|
||||
Less(blockHashA *externalapi.DomainHash, ghostdagDataA *BlockGHOSTDAGData,
|
||||
blockHashB *externalapi.DomainHash, ghostdagDataB *BlockGHOSTDAGData) bool
|
||||
}
|
||||
|
@ -5,4 +5,5 @@ import "github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
|
||||
// HeaderTipsManager manages the state of the header tips
|
||||
type HeaderTipsManager interface {
|
||||
AddHeaderTip(hash *externalapi.DomainHash) error
|
||||
SelectedTip() (*externalapi.DomainHash, error)
|
||||
}
|
||||
|
@ -62,6 +62,11 @@ func (bp *blockProcessor) validateAndInsertBlock(block *externalapi.DomainBlock)
|
||||
return err
|
||||
}
|
||||
|
||||
oldHeadersSelectedTip, err := bp.headerTipsManager.SelectedTip()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if mode.State == externalapi.SyncStateHeadersFirst {
|
||||
err = bp.headerTipsManager.AddHeaderTip(hash)
|
||||
if err != nil {
|
||||
@ -81,6 +86,11 @@ func (bp *blockProcessor) validateAndInsertBlock(block *externalapi.DomainBlock)
|
||||
bp.headerTipsStore.Stage(tips)
|
||||
}
|
||||
|
||||
err = bp.updateReachabilityReindexRoot(oldHeadersSelectedTip)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Trigger pruning, which will check if the pruning point changed and delete the data if it did.
|
||||
err = bp.pruningManager.FindNextPruningPoint()
|
||||
if err != nil {
|
||||
@ -90,6 +100,19 @@ func (bp *blockProcessor) validateAndInsertBlock(block *externalapi.DomainBlock)
|
||||
return bp.commitAllChanges()
|
||||
}
|
||||
|
||||
func (bp *blockProcessor) updateReachabilityReindexRoot(oldHeadersSelectedTip *externalapi.DomainHash) error {
|
||||
headersSelectedTip, err := bp.headerTipsManager.SelectedTip()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if *headersSelectedTip == *oldHeadersSelectedTip {
|
||||
return nil
|
||||
}
|
||||
|
||||
return bp.reachabilityManager.UpdateReindexRoot(headersSelectedTip)
|
||||
}
|
||||
|
||||
func (bp *blockProcessor) checkBlockStatus(hash *externalapi.DomainHash, mode *externalapi.SyncInfo) error {
|
||||
exists, err := bp.blockStatusStore.Exists(bp.databaseContext, hash)
|
||||
if err != nil {
|
||||
|
@ -24,11 +24,6 @@ func (csm *consensusStateManager) AddBlockToVirtual(blockHash *externalapi.Domai
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = csm.reachabilityManager.UpdateReindexRoot(blockHash)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -32,23 +32,25 @@ func (gm *ghostdagManager) less(blockHashA *externalapi.DomainHash, blockHashB *
|
||||
return chosenSelectedParent == blockHashB, nil
|
||||
}
|
||||
|
||||
func (gm *ghostdagManager) ChooseSelectedParent(blockHashA *externalapi.DomainHash,
|
||||
blockHashB *externalapi.DomainHash) (*externalapi.DomainHash, error) {
|
||||
|
||||
blockAGHOSTDAGData, err := gm.ghostdagDataStore.Get(gm.databaseContext, blockHashA)
|
||||
func (gm *ghostdagManager) ChooseSelectedParent(blockHashes ...*externalapi.DomainHash) (*externalapi.DomainHash, error) {
|
||||
selectedParent := blockHashes[0]
|
||||
selectedParentGHOSTDAGData, err := gm.ghostdagDataStore.Get(gm.databaseContext, selectedParent)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
blockBGHOSTDAGData, err := gm.ghostdagDataStore.Get(gm.databaseContext, blockHashB)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
for _, blockHash := range blockHashes {
|
||||
blockGHOSTDAGData, err := gm.ghostdagDataStore.Get(gm.databaseContext, blockHash)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if gm.Less(selectedParent, selectedParentGHOSTDAGData, blockHash, blockGHOSTDAGData) {
|
||||
selectedParent = blockHash
|
||||
selectedParentGHOSTDAGData = blockGHOSTDAGData
|
||||
}
|
||||
}
|
||||
|
||||
if gm.Less(blockHashA, blockAGHOSTDAGData, blockHashB, blockBGHOSTDAGData) {
|
||||
return blockHashB, nil
|
||||
}
|
||||
|
||||
return blockHashA, nil
|
||||
return selectedParent, nil
|
||||
}
|
||||
|
||||
func (gm *ghostdagManager) Less(blockHashA *externalapi.DomainHash, ghostdagDataA *model.BlockGHOSTDAGData,
|
||||
|
@ -8,16 +8,19 @@ import (
|
||||
type headerTipsManager struct {
|
||||
databaseContext model.DBReader
|
||||
dagTopologyManager model.DAGTopologyManager
|
||||
ghostdagManager model.GHOSTDAGManager
|
||||
headerTipsStore model.HeaderTipsStore
|
||||
}
|
||||
|
||||
// New instantiates a new HeaderTipsManager
|
||||
func New(databaseContext model.DBReader,
|
||||
dagTopologyManager model.DAGTopologyManager,
|
||||
ghostdagManager model.GHOSTDAGManager,
|
||||
headerTipsStore model.HeaderTipsStore) model.HeaderTipsManager {
|
||||
return &headerTipsManager{
|
||||
databaseContext: databaseContext,
|
||||
dagTopologyManager: dagTopologyManager,
|
||||
ghostdagManager: ghostdagManager,
|
||||
headerTipsStore: headerTipsStore,
|
||||
}
|
||||
}
|
||||
|
12
domain/consensus/processes/headertipsmanager/selected_tip.go
Normal file
12
domain/consensus/processes/headertipsmanager/selected_tip.go
Normal file
@ -0,0 +1,12 @@
|
||||
package headertipsmanager
|
||||
|
||||
import "github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
|
||||
|
||||
func (h headerTipsManager) SelectedTip() (*externalapi.DomainHash, error) {
|
||||
tips, err := h.headerTipsStore.Tips(h.databaseContext)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return h.ghostdagManager.ChooseSelectedParent(tips...)
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user