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 }