github.com/unicornultrafoundation/go-u2u@v1.0.0-rc1.0.20240205080301-e74a83d3fadc/gossip/emitter/parents.go (about)

     1  package emitter
     2  
     3  import (
     4  	"time"
     5  
     6  	"github.com/unicornultrafoundation/go-helios/emitter/ancestor"
     7  	"github.com/unicornultrafoundation/go-helios/hash"
     8  	"github.com/unicornultrafoundation/go-helios/native/idx"
     9  )
    10  
    11  // buildSearchStrategies returns a strategy for each parent search
    12  func (em *Emitter) buildSearchStrategies(maxParents idx.Event) []ancestor.SearchStrategy {
    13  	strategies := make([]ancestor.SearchStrategy, 0, maxParents)
    14  	if maxParents == 0 {
    15  		return strategies
    16  	}
    17  	payloadStrategy := em.payloadIndexer.SearchStrategy()
    18  	for idx.Event(len(strategies)) < 1 {
    19  		strategies = append(strategies, payloadStrategy)
    20  	}
    21  	randStrategy := ancestor.NewRandomStrategy(nil)
    22  	for idx.Event(len(strategies)) < maxParents/2 {
    23  		strategies = append(strategies, randStrategy)
    24  	}
    25  	if em.fcIndexer != nil {
    26  		quorumStrategy := em.fcIndexer.SearchStrategy()
    27  		for idx.Event(len(strategies)) < maxParents {
    28  			strategies = append(strategies, quorumStrategy)
    29  		}
    30  	} else if em.quorumIndexer != nil {
    31  		quorumStrategy := em.quorumIndexer.SearchStrategy()
    32  		for idx.Event(len(strategies)) < maxParents {
    33  			strategies = append(strategies, quorumStrategy)
    34  		}
    35  	}
    36  	return strategies
    37  }
    38  
    39  // chooseParents selects an "optimal" parents set for the validator
    40  func (em *Emitter) chooseParents(epoch idx.Epoch, myValidatorID idx.ValidatorID) (*hash.Event, hash.Events, bool) {
    41  	selfParent := em.world.GetLastEvent(epoch, myValidatorID)
    42  	heads := em.world.GetHeads(epoch) // events with no descendants
    43  
    44  	if selfParent != nil && len(em.world.DagIndex().NoCheaters(selfParent, hash.Events{*selfParent})) == 0 {
    45  		em.Periodic.Error(time.Second, "Events emitting isn't allowed due to the doublesign", "validator", myValidatorID)
    46  		return nil, nil, false
    47  	}
    48  
    49  	var parents hash.Events
    50  	if selfParent != nil {
    51  		parents = hash.Events{*selfParent}
    52  	}
    53  	parents = ancestor.ChooseParents(parents, heads, em.buildSearchStrategies(em.maxParents-idx.Event(len(parents))))
    54  	return selfParent, parents, true
    55  }