kaspad/domain/consensus/processes/dagtraversalmanager/selected_child_iterator.go
Svarog 9b12b9c58a
Make ReachabilityData a read-only interface with a writable variant, to prevent cloning (#1316)
* Rename reachabilityManager.data to dataForInsertion, and use it only during insertions

* Make reachabilityData an interface

* Fix db serialization of reachability data

* Fix reachabilityDataStore

* Fix all tests

* Cleanup debugging code

* Fix insertToFutureCoveringSet

* Add comments

* Rename to ReachabilityData and MutableReachabilityData
2020-12-30 09:48:38 +02:00

59 lines
1.6 KiB
Go

package dagtraversalmanager
import (
"github.com/kaspanet/kaspad/domain/consensus/model"
"github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
"github.com/pkg/errors"
)
type selectedChildIterator struct {
databaseContext model.DBReader
dagTopologyManager model.DAGTopologyManager
reachabilityDataStore model.ReachabilityDataStore
highHash *externalapi.DomainHash
current *externalapi.DomainHash
}
func (s *selectedChildIterator) Next() bool {
data, err := s.reachabilityDataStore.ReachabilityData(s.databaseContext, s.current)
if err != nil {
panic(err)
}
for _, child := range data.Children() {
isChildInSelectedParentChainOfHighHash, err := s.dagTopologyManager.IsInSelectedParentChainOf(child, s.highHash)
if err != nil {
panic(err)
}
if isChildInSelectedParentChainOfHighHash {
s.current = child
return true
}
}
return false
}
func (s *selectedChildIterator) Get() *externalapi.DomainHash {
return s.current
}
func (dtm *dagTraversalManager) SelectedChildIterator(highHash, lowHash *externalapi.DomainHash) (model.BlockIterator, error) {
isLowHashInSelectedParentChainOfHighHash, err := dtm.dagTopologyManager.IsInSelectedParentChainOf(lowHash, highHash)
if err != nil {
return nil, err
}
if !isLowHashInSelectedParentChainOfHighHash {
return nil, errors.Errorf("%s is not in the selected parent chain of %s", highHash, lowHash)
}
return &selectedChildIterator{
databaseContext: dtm.databaseContext,
dagTopologyManager: dtm.dagTopologyManager,
reachabilityDataStore: dtm.reachabilityDataStore,
highHash: highHash,
current: lowHash,
}, nil
}