package ghostdagmanager import ( "github.com/kaspanet/kaspad/domain/consensus/model" "github.com/kaspanet/kaspad/domain/consensus/model/externalapi" ) func (gm *ghostdagManager) findSelectedParent(parentHashes []*externalapi.DomainHash) (*externalapi.DomainHash, error) { var selectedParent *externalapi.DomainHash for _, hash := range parentHashes { if selectedParent == nil { selectedParent = hash continue } isHashBiggerThanSelectedParent, err := gm.less(selectedParent, hash) if err != nil { return nil, err } if isHashBiggerThanSelectedParent { selectedParent = hash } } return selectedParent, nil } func (gm *ghostdagManager) less(blockHashA *externalapi.DomainHash, blockHashB *externalapi.DomainHash) (bool, error) { chosenSelectedParent, err := gm.ChooseSelectedParent(blockHashA, blockHashB) if err != nil { return false, err } return chosenSelectedParent == blockHashB, nil } 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 } 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 } } return selectedParent, nil } func (gm *ghostdagManager) Less(blockHashA *externalapi.DomainHash, ghostdagDataA *model.BlockGHOSTDAGData, blockHashB *externalapi.DomainHash, ghostdagDataB *model.BlockGHOSTDAGData) bool { switch ghostdagDataA.BlueWork().Cmp(ghostdagDataB.BlueWork()) { case -1: return true case 1: return false case 0: return blockHashA.Less(blockHashB) default: panic("big.Int.Cmp is defined to always return -1/1/0 and nothing else") } }