@@ -56,17 +56,12 @@ type Manager struct {
5656 // daHeight is the height of the latest processed DA block
5757 daHeight uint64
5858
59- HeaderOutCh chan * types.SignedHeader
60- HeaderInCh chan * types.SignedHeader
61- SyncedHeadersCh chan * types.SignedHeader
62-
63- lastCommit atomic.Value
59+ HeaderCh chan * types.SignedHeader
6460
6561 FraudProofInCh chan * abci.FraudProof
6662
67- syncTarget uint64
68- blockInCh chan newBlockEvent
69- syncCache map [uint64 ]* types.Block
63+ blockInCh chan newBlockEvent
64+ syncCache map [uint64 ]* types.Block
7065
7166 // retrieveMtx is used by retrieveCond
7267 retrieveMtx * sync.Mutex
@@ -152,9 +147,7 @@ func NewManager(
152147 retriever : dalc .(da.BlockRetriever ), // TODO(tzdybal): do it in more gentle way (after MVP)
153148 daHeight : s .DAHeight ,
154149 // channels are buffered to avoid blocking on input/output operations, buffer sizes are arbitrary
155- HeaderOutCh : make (chan * types.SignedHeader , 100 ),
156- HeaderInCh : make (chan * types.SignedHeader , 100 ),
157- SyncedHeadersCh : make (chan * types.SignedHeader , 100 ),
150+ HeaderCh : make (chan * types.SignedHeader , 100 ),
158151 blockInCh : make (chan newBlockEvent , 100 ),
159152 FraudProofInCh : make (chan * abci.FraudProof , 100 ),
160153 retrieveMtx : new (sync.Mutex ),
@@ -262,27 +255,6 @@ func (m *Manager) SyncLoop(ctx context.Context, cancel context.CancelFunc) {
262255 select {
263256 case <- daTicker .C :
264257 m .retrieveCond .Signal ()
265- case header := <- m .HeaderInCh :
266- m .logger .Debug ("block header received" , "height" , header .Header .Height (), "hash" , header .Header .Hash ())
267- m .SyncedHeadersCh <- header
268- newHeight := header .Header .BaseHeader .Height
269- currentHeight := m .store .Height ()
270- // in case of client reconnecting after being offline
271- // newHeight may be significantly larger than currentHeight
272- // it's handled gently in RetrieveLoop
273- if newHeight > currentHeight {
274- atomic .StoreUint64 (& m .syncTarget , newHeight )
275- m .retrieveCond .Signal ()
276- }
277- commit := & header .Commit
278- // TODO(tzdybal): check if it's from right aggregator
279- m .lastCommit .Store (commit )
280- err := m .trySyncNextBlock (ctx , 0 )
281- if err != nil {
282- m .logger .Info ("failed to sync next block" , "error" , err )
283- } else {
284- m .logger .Debug ("synced using signed header" , "height" , commit .Height )
285- }
286258 case blockEvent := <- m .blockInCh :
287259 block := blockEvent .block
288260 daHeight := blockEvent .daHeight
@@ -335,43 +307,36 @@ func (m *Manager) SyncLoop(ctx context.Context, cancel context.CancelFunc) {
335307// If block at height h+1 is not available, value of last gossiped commit is checked.
336308// If commit for block h is available, we proceed with sync process, and remove synced block from sync cache.
337309func (m * Manager ) trySyncNextBlock (ctx context.Context , daHeight uint64 ) error {
338- var b1 * types.Block
339310 var commit * types.Commit
340311 currentHeight := m .store .Height () // TODO(tzdybal): maybe store a copy in memory
341312
342- b1 , ok1 := m .syncCache [currentHeight + 1 ]
343- if ! ok1 {
313+ b , ok := m .syncCache [currentHeight + 1 ]
314+ if ! ok {
344315 return nil
345316 }
346- b2 , ok2 := m .syncCache [currentHeight + 2 ]
347- if ok2 {
348- m .logger .Debug ("using last commit from next block" )
349- commit = & b2 .SignedHeader .Commit
350- } else {
351- lastCommit := m .getLastCommit ()
352- if lastCommit != nil && lastCommit .Height == currentHeight + 1 {
353- m .logger .Debug ("using gossiped commit" )
354- commit = lastCommit
355- }
317+
318+ signedHeader := & b .SignedHeader
319+ if signedHeader != nil {
320+ commit = & b .SignedHeader .Commit
356321 }
357322
358- if b1 != nil && commit != nil {
359- m .logger .Info ("Syncing block" , "height" , b1 .SignedHeader .Header .Height ())
360- newState , responses , err := m .executor .ApplyBlock (ctx , m .lastState , b1 )
323+ if b != nil && commit != nil {
324+ m .logger .Info ("Syncing block" , "height" , b .SignedHeader .Header .Height ())
325+ newState , responses , err := m .executor .ApplyBlock (ctx , m .lastState , b )
361326 if err != nil {
362327 return fmt .Errorf ("failed to ApplyBlock: %w" , err )
363328 }
364- err = m .store .SaveBlock (b1 , commit )
329+ err = m .store .SaveBlock (b , commit )
365330 if err != nil {
366331 return fmt .Errorf ("failed to save block: %w" , err )
367332 }
368- _ , _ , err = m .executor .Commit (ctx , newState , b1 , responses )
333+ _ , _ , err = m .executor .Commit (ctx , newState , b , responses )
369334 if err != nil {
370335 return fmt .Errorf ("failed to Commit: %w" , err )
371336 }
372- m .store .SetHeight (uint64 (b1 .SignedHeader .Header .Height ()))
337+ m .store .SetHeight (uint64 (b .SignedHeader .Header .Height ()))
373338
374- err = m .store .SaveBlockResponses (uint64 (b1 .SignedHeader .Header .Height ()), responses )
339+ err = m .store .SaveBlockResponses (uint64 (b .SignedHeader .Header .Height ()), responses )
375340 if err != nil {
376341 return fmt .Errorf ("failed to save block responses: %w" , err )
377342 }
@@ -390,14 +355,6 @@ func (m *Manager) trySyncNextBlock(ctx context.Context, daHeight uint64) error {
390355 return nil
391356}
392357
393- func (m * Manager ) getLastCommit () * types.Commit {
394- ptr := m .lastCommit .Load ()
395- if ptr == nil {
396- return nil
397- }
398- return ptr .(* types.Commit )
399- }
400-
401358// RetrieveLoop is responsible for interacting with DA layer.
402359func (m * Manager ) RetrieveLoop (ctx context.Context ) {
403360 // waitCh is used to signal the retrieve loop, that it should process next blocks
@@ -602,7 +559,8 @@ func (m *Manager) publishBlock(ctx context.Context) error {
602559 // Only update the stored height after successfully submitting to DA layer and committing to the DB
603560 m .store .SetHeight (uint64 (block .SignedHeader .Header .Height ()))
604561
605- m .publishSignedHeader (block , commit )
562+ // Publish header to channel so that header exchange service can broadcast
563+ m .HeaderCh <- & block .SignedHeader
606564
607565 return nil
608566}
@@ -639,11 +597,6 @@ func (m *Manager) exponentialBackoff(backoff time.Duration) time.Duration {
639597 return backoff
640598}
641599
642- // TODO(tzdybal): consider inlining
643- func (m * Manager ) publishSignedHeader (block * types.Block , commit * types.Commit ) {
644- m .HeaderOutCh <- & types.SignedHeader {Header : block .SignedHeader .Header , Commit : * commit }
645- }
646-
647600func updateState (s * types.State , res * abci.ResponseInitChain ) {
648601 // If the app did not return an app hash, we keep the one set from the genesis doc in
649602 // the state. We don't set appHash since we don't want the genesis doc app hash
0 commit comments