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  }