Ori Newman 52c73d3a08
[NOD-1511] Implement missingBlockBodyHashes (#1000)
* [NOD-1511] Implement missingBlockBodyHashes

* [NOD-1511] Rename selectedparentiterator.go to blockiterator.go

* [NOD-1511] Fix condition

* [NOD-1511] Simplify missingBlocks logic
2020-11-05 10:11:42 +02:00

54 lines
1.2 KiB
Go

package dagtraversalmanager
import (
"github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
"github.com/kaspanet/kaspad/domain/consensus/utils/hashset"
)
// AnticoneFromContext returns blocks in (context.Past ⋂ block.Anticone)
func (dtm *dagTraversalManager) AnticoneFromContext(context, block *externalapi.DomainHash) ([]*externalapi.DomainHash, error) {
anticone := []*externalapi.DomainHash{}
queue := []*externalapi.DomainHash{context}
visited := hashset.New()
for len(queue) > 0 {
var current *externalapi.DomainHash
current, queue = queue[0], queue[1:]
if visited.Contains(current) {
continue
}
visited.Add(current)
currentIsAncestorOfBlock, err := dtm.dagTopologyManager.IsAncestorOf(current, block)
if err != nil {
return nil, err
}
if currentIsAncestorOfBlock {
continue
}
blockIsAncestorOfCurrent, err := dtm.dagTopologyManager.IsAncestorOf(block, current)
if err != nil {
return nil, err
}
if !blockIsAncestorOfCurrent {
anticone = append(anticone, current)
}
currentParents, err := dtm.dagTopologyManager.Parents(current)
if err != nil {
return nil, err
}
for _, parent := range currentParents {
queue = append(queue, parent)
}
}
return anticone, nil
}