mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-06-07 14:46:44 +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,
|
dbManager,
|
||||||
ghostdagDataStore,
|
ghostdagDataStore,
|
||||||
acceptanceDataStore)
|
acceptanceDataStore)
|
||||||
headerTipsManager := headertipsmanager.New(dbManager, dagTopologyManager, headerTipsStore)
|
headerTipsManager := headertipsmanager.New(dbManager, dagTopologyManager, ghostdagManager, headerTipsStore)
|
||||||
genesisHash := (*externalapi.DomainHash)(dagParams.GenesisHash)
|
genesisHash := (*externalapi.DomainHash)(dagParams.GenesisHash)
|
||||||
mergeDepthManager := mergedepthmanager.New(
|
mergeDepthManager := mergedepthmanager.New(
|
||||||
dagParams.FinalityDepth(),
|
dagParams.FinalityDepth(),
|
||||||
|
@ -5,7 +5,7 @@ import "github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
|
|||||||
// GHOSTDAGManager resolves and manages GHOSTDAG block data
|
// GHOSTDAGManager resolves and manages GHOSTDAG block data
|
||||||
type GHOSTDAGManager interface {
|
type GHOSTDAGManager interface {
|
||||||
GHOSTDAG(blockHash *externalapi.DomainHash) error
|
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,
|
Less(blockHashA *externalapi.DomainHash, ghostdagDataA *BlockGHOSTDAGData,
|
||||||
blockHashB *externalapi.DomainHash, ghostdagDataB *BlockGHOSTDAGData) bool
|
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
|
// HeaderTipsManager manages the state of the header tips
|
||||||
type HeaderTipsManager interface {
|
type HeaderTipsManager interface {
|
||||||
AddHeaderTip(hash *externalapi.DomainHash) error
|
AddHeaderTip(hash *externalapi.DomainHash) error
|
||||||
|
SelectedTip() (*externalapi.DomainHash, error)
|
||||||
}
|
}
|
||||||
|
@ -62,6 +62,11 @@ func (bp *blockProcessor) validateAndInsertBlock(block *externalapi.DomainBlock)
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
oldHeadersSelectedTip, err := bp.headerTipsManager.SelectedTip()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
if mode.State == externalapi.SyncStateHeadersFirst {
|
if mode.State == externalapi.SyncStateHeadersFirst {
|
||||||
err = bp.headerTipsManager.AddHeaderTip(hash)
|
err = bp.headerTipsManager.AddHeaderTip(hash)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -81,6 +86,11 @@ func (bp *blockProcessor) validateAndInsertBlock(block *externalapi.DomainBlock)
|
|||||||
bp.headerTipsStore.Stage(tips)
|
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.
|
// Trigger pruning, which will check if the pruning point changed and delete the data if it did.
|
||||||
err = bp.pruningManager.FindNextPruningPoint()
|
err = bp.pruningManager.FindNextPruningPoint()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -90,6 +100,19 @@ func (bp *blockProcessor) validateAndInsertBlock(block *externalapi.DomainBlock)
|
|||||||
return bp.commitAllChanges()
|
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 {
|
func (bp *blockProcessor) checkBlockStatus(hash *externalapi.DomainHash, mode *externalapi.SyncInfo) error {
|
||||||
exists, err := bp.blockStatusStore.Exists(bp.databaseContext, hash)
|
exists, err := bp.blockStatusStore.Exists(bp.databaseContext, hash)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -24,11 +24,6 @@ func (csm *consensusStateManager) AddBlockToVirtual(blockHash *externalapi.Domai
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
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
|
return chosenSelectedParent == blockHashB, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gm *ghostdagManager) ChooseSelectedParent(blockHashA *externalapi.DomainHash,
|
func (gm *ghostdagManager) ChooseSelectedParent(blockHashes ...*externalapi.DomainHash) (*externalapi.DomainHash, error) {
|
||||||
blockHashB *externalapi.DomainHash) (*externalapi.DomainHash, error) {
|
selectedParent := blockHashes[0]
|
||||||
|
selectedParentGHOSTDAGData, err := gm.ghostdagDataStore.Get(gm.databaseContext, selectedParent)
|
||||||
blockAGHOSTDAGData, err := gm.ghostdagDataStore.Get(gm.databaseContext, blockHashA)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
blockBGHOSTDAGData, err := gm.ghostdagDataStore.Get(gm.databaseContext, blockHashB)
|
for _, blockHash := range blockHashes {
|
||||||
|
blockGHOSTDAGData, err := gm.ghostdagDataStore.Get(gm.databaseContext, blockHash)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if gm.Less(blockHashA, blockAGHOSTDAGData, blockHashB, blockBGHOSTDAGData) {
|
if gm.Less(selectedParent, selectedParentGHOSTDAGData, blockHash, blockGHOSTDAGData) {
|
||||||
return blockHashB, nil
|
selectedParent = blockHash
|
||||||
|
selectedParentGHOSTDAGData = blockGHOSTDAGData
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return blockHashA, nil
|
return selectedParent, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gm *ghostdagManager) Less(blockHashA *externalapi.DomainHash, ghostdagDataA *model.BlockGHOSTDAGData,
|
func (gm *ghostdagManager) Less(blockHashA *externalapi.DomainHash, ghostdagDataA *model.BlockGHOSTDAGData,
|
||||||
|
@ -8,16 +8,19 @@ import (
|
|||||||
type headerTipsManager struct {
|
type headerTipsManager struct {
|
||||||
databaseContext model.DBReader
|
databaseContext model.DBReader
|
||||||
dagTopologyManager model.DAGTopologyManager
|
dagTopologyManager model.DAGTopologyManager
|
||||||
|
ghostdagManager model.GHOSTDAGManager
|
||||||
headerTipsStore model.HeaderTipsStore
|
headerTipsStore model.HeaderTipsStore
|
||||||
}
|
}
|
||||||
|
|
||||||
// New instantiates a new HeaderTipsManager
|
// New instantiates a new HeaderTipsManager
|
||||||
func New(databaseContext model.DBReader,
|
func New(databaseContext model.DBReader,
|
||||||
dagTopologyManager model.DAGTopologyManager,
|
dagTopologyManager model.DAGTopologyManager,
|
||||||
|
ghostdagManager model.GHOSTDAGManager,
|
||||||
headerTipsStore model.HeaderTipsStore) model.HeaderTipsManager {
|
headerTipsStore model.HeaderTipsStore) model.HeaderTipsManager {
|
||||||
return &headerTipsManager{
|
return &headerTipsManager{
|
||||||
databaseContext: databaseContext,
|
databaseContext: databaseContext,
|
||||||
dagTopologyManager: dagTopologyManager,
|
dagTopologyManager: dagTopologyManager,
|
||||||
|
ghostdagManager: ghostdagManager,
|
||||||
headerTipsStore: headerTipsStore,
|
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