diff --git a/domain/consensus/processes/ghostdagmanager/compare.go b/domain/consensus/processes/ghostdagmanager/compare.go index 3f64b4911..930b69473 100644 --- a/domain/consensus/processes/ghostdagmanager/compare.go +++ b/domain/consensus/processes/ghostdagmanager/compare.go @@ -2,6 +2,7 @@ package ghostdagmanager import ( "github.com/kaspanet/kaspad/domain/consensus/model/externalapi" + "github.com/kaspanet/kaspad/domain/consensus/utils/hashes" ) func (gm *ghostdagManager) findSelectedParent(parentHashes []*externalapi.DomainHash) (*externalapi.DomainHash, error) { @@ -45,7 +46,7 @@ func (gm *ghostdagManager) ChooseSelectedParent(blockHashA *externalapi.DomainHa blockABlueScore := blockAGHOSTDAGData.BlueScore blockBBlueScore := blockBGHOSTDAGData.BlueScore if blockABlueScore == blockBBlueScore { - if hashesLess(blockHashA, blockHashB) { + if hashes.Less(blockHashA, blockHashB) { return blockHashB, nil } return blockHashA, nil @@ -55,16 +56,3 @@ func (gm *ghostdagManager) ChooseSelectedParent(blockHashA *externalapi.DomainHa } return blockHashA, nil } - -func hashesLess(a, b *externalapi.DomainHash) bool { - // We compare the hashes backwards because Hash is stored as a little endian byte array. - for i := len(a) - 1; i >= 0; i-- { - switch { - case a[i] < b[i]: - return true - case a[i] > b[i]: - return false - } - } - return false -} diff --git a/domain/consensus/processes/ghostdagmanager/ghostdag.go b/domain/consensus/processes/ghostdagmanager/ghostdag.go index 70e175134..029f4d605 100644 --- a/domain/consensus/processes/ghostdagmanager/ghostdag.go +++ b/domain/consensus/processes/ghostdagmanager/ghostdag.go @@ -39,13 +39,17 @@ func (gm *ghostdagManager) GHOSTDAG(blockHash *externalapi.DomainHash) error { if err != nil { return err } + newBlockData.SelectedParent = selectedParent - mergeSet, err := gm.mergeSet(newBlockData.SelectedParent, blockParents) + newBlockData.MergeSetBlues = append(newBlockData.MergeSetBlues, selectedParent) + newBlockData.BluesAnticoneSizes[*selectedParent] = 0 + + mergeSetWithoutSelectedParent, err := gm.mergeSetWithoutSelectedParent(newBlockData.SelectedParent, blockParents) if err != nil { return err } - for _, blueCandidate := range mergeSet { + for _, blueCandidate := range mergeSetWithoutSelectedParent { isBlue, candidateAnticoneSize, candidateBluesAnticoneSizes, err := gm.checkBlueCandidate(newBlockData, blueCandidate) if err != nil { return err @@ -101,7 +105,7 @@ func (gm *ghostdagManager) checkBlueCandidate(newBlockData *model.BlockGHOSTDAGD isBlue, isRed, err := gm.checkBlueCandidateWithChainBlock(newBlockData, chainBlock, blueCandidate, candidateBluesAnticoneSizes, &candidateAnticoneSize) if err != nil { - return false, 0, nil, nil + return false, 0, nil, err } if isBlue { @@ -154,7 +158,7 @@ func (gm *ghostdagManager) checkBlueCandidateWithChainBlock(newBlockData *model. // Skip blocks that exist in the past of blueCandidate. isAncestorOfBlueCandidate, err := gm.dagTopologyManager.IsAncestorOf(block, blueCandidate) if err != nil { - return false, false, nil + return false, false, err } if isAncestorOfBlueCandidate { diff --git a/domain/consensus/processes/ghostdagmanager/mergeset.go b/domain/consensus/processes/ghostdagmanager/mergeset.go index b30f7287c..ead66812f 100644 --- a/domain/consensus/processes/ghostdagmanager/mergeset.go +++ b/domain/consensus/processes/ghostdagmanager/mergeset.go @@ -5,7 +5,7 @@ import ( "sort" ) -func (gm *ghostdagManager) mergeSet(selecteParent *externalapi.DomainHash, +func (gm *ghostdagManager) mergeSetWithoutSelectedParent(selecteParent *externalapi.DomainHash, blockParents []*externalapi.DomainHash) ([]*externalapi.DomainHash, error) { mergeSetMap := make(map[externalapi.DomainHash]struct{}, gm.k)