github.com/unicornultrafoundation/go-u2u@v1.0.0-rc1.0.20240205080301-e74a83d3fadc/gossip/emitter_world.go (about) 1 package gossip 2 3 import ( 4 "sync/atomic" 5 6 "github.com/unicornultrafoundation/go-helios/hash" 7 "github.com/unicornultrafoundation/go-helios/native/idx" 8 "github.com/unicornultrafoundation/go-u2u/core/state" 9 "github.com/unicornultrafoundation/go-u2u/core/types" 10 11 "github.com/unicornultrafoundation/go-u2u/gossip/emitter" 12 "github.com/unicornultrafoundation/go-u2u/native" 13 "github.com/unicornultrafoundation/go-u2u/utils/wgmutex" 14 "github.com/unicornultrafoundation/go-u2u/valkeystore" 15 "github.com/unicornultrafoundation/go-u2u/vecmt" 16 ) 17 18 type emitterWorldProc struct { 19 s *Service 20 } 21 22 type emitterWorldRead struct { 23 *Store 24 } 25 26 // emitterWorld implements emitter.World interface 27 type emitterWorld struct { 28 emitterWorldProc 29 emitterWorldRead 30 *wgmutex.WgMutex 31 emitter.TxPool 32 valkeystore.SignerI 33 types.Signer 34 } 35 36 func (ew *emitterWorldProc) Check(emitted *native.EventPayload, parents native.Events) error { 37 // sanity check 38 return ew.s.checkers.Validate(emitted, parents.Interfaces()) 39 } 40 41 func (ew *emitterWorldProc) Process(emitted *native.EventPayload) error { 42 done := ew.s.procLogger.EventConnectionStarted(emitted, true) 43 defer done() 44 return ew.s.processEvent(emitted) 45 } 46 47 func (ew *emitterWorldProc) Broadcast(emitted *native.EventPayload) { 48 // PM listens and will broadcast it 49 ew.s.feed.newEmittedEvent.Send(emitted) 50 } 51 52 func (ew *emitterWorldProc) Build(e *native.MutableEventPayload, onIndexed func()) error { 53 return ew.s.buildEvent(e, onIndexed) 54 } 55 56 func (ew *emitterWorldProc) DagIndex() *vecmt.Index { 57 return ew.s.dagIndexer 58 } 59 60 func (ew *emitterWorldProc) IsBusy() bool { 61 return atomic.LoadUint32(&ew.s.eventBusyFlag) != 0 || atomic.LoadUint32(&ew.s.blockBusyFlag) != 0 62 } 63 64 func (ew *emitterWorldProc) StateDB() *state.StateDB { 65 statedb, err := ew.s.store.evm.StateDB(ew.s.store.GetBlockState().FinalizedStateRoot) 66 if err != nil { 67 return nil 68 } 69 return statedb 70 } 71 72 func (ew *emitterWorldProc) IsSynced() bool { 73 return ew.s.handler.syncStatus.AcceptEvents() 74 } 75 76 func (ew *emitterWorldProc) PeersNum() int { 77 return ew.s.handler.peers.Len() 78 } 79 80 func (ew *emitterWorldRead) GetHeads(epoch idx.Epoch) hash.Events { 81 return ew.Store.GetHeadsSlice(epoch) 82 } 83 84 func (ew *emitterWorldRead) GetLastEvent(epoch idx.Epoch, from idx.ValidatorID) *hash.Event { 85 return ew.Store.GetLastEvent(epoch, from) 86 } 87 88 func (ew *emitterWorldRead) GetLowestBlockToDecide() idx.Block { 89 return ew.Store.GetLlrState().LowestBlockToDecide 90 } 91 92 func (ew *emitterWorldRead) GetBlockRecordHash(n idx.Block) *hash.Hash { 93 return ew.Store.GetBlockRecordHash(n) 94 } 95 96 func (ew *emitterWorldRead) GetBlockEpoch(block idx.Block) idx.Epoch { 97 return ew.Store.FindBlockEpoch(block) 98 } 99 100 func (ew *emitterWorldRead) GetLowestEpochToDecide() idx.Epoch { 101 return ew.Store.GetLlrState().LowestEpochToDecide 102 } 103 104 func (ew *emitterWorldRead) GetEpochRecordHash(epoch idx.Epoch) *hash.Hash { 105 record := ew.Store.GetFullEpochRecord(epoch) 106 if record == nil { 107 return nil 108 } 109 h := record.Hash() 110 return &h 111 }