@@ -622,6 +622,51 @@ func TestProcessHeightEvent_SyncsAndUpdatesState(t *testing.T) {
622622 assert .Equal (t , uint64 (1 ), st1 .LastBlockHeight )
623623}
624624
625+ func TestProcessHeightEvent_AlreadyProcessedDADataDoesNotAccumulate (t * testing.T ) {
626+ const alreadyProcessedBlocks = 8
627+
628+ ds := dssync .MutexWrap (datastore .NewMapDatastore ())
629+ st := store .New (ds )
630+
631+ batch , err := st .NewBatch (t .Context ())
632+ require .NoError (t , err )
633+ require .NoError (t , batch .SetHeight (alreadyProcessedBlocks ))
634+ require .NoError (t , batch .Commit ())
635+
636+ addr , pub , signer := buildSyncTestSigner (t )
637+ gen := genesis.Genesis {
638+ ChainID : "tchain" ,
639+ InitialHeight : 1 ,
640+ StartTime : time .Now ().Add (- time .Second ),
641+ ProposerAddress : addr ,
642+ }
643+ daRetriever := newTestDARetriever (t , nil , config .DefaultConfig (), gen )
644+ s := & Syncer {
645+ store : st ,
646+ daRetriever : daRetriever ,
647+ logger : zerolog .Nop (),
648+ }
649+
650+ futureHeight := uint64 (alreadyProcessedBlocks + 1 )
651+ futureDataBin , _ := makeSignedDataBytes (t , gen .ChainID , futureHeight , addr , pub , signer , 8 )
652+ require .Empty (t , daRetriever .processBlobs (t .Context (), [][]byte {futureDataBin }, futureHeight ))
653+ require .Contains (t , daRetriever .pendingData , futureHeight )
654+
655+ for height := uint64 (1 ); height <= alreadyProcessedBlocks ; height ++ {
656+ dataBin , data := makeSignedDataBytes (t , gen .ChainID , height , addr , pub , signer , 8 )
657+ headerBin , _ := makeSignedHeaderBytes (t , gen .ChainID , height , addr , pub , signer , nil , & data .Data , nil )
658+
659+ events := daRetriever .processBlobs (t .Context (), [][]byte {headerBin , dataBin }, height )
660+ require .Len (t , events , 1 )
661+
662+ s .processHeightEvent (t .Context (), & events [0 ])
663+ require .NotContains (t , daRetriever .pendingData , height , "processed DA data must be removed immediately" )
664+ }
665+
666+ require .Len (t , daRetriever .pendingData , 1 )
667+ require .Contains (t , daRetriever .pendingData , futureHeight , "DA data above the current height must remain pending" )
668+ }
669+
625670func TestProcessHeightEvent_UnexpectedProposerFromDAIsNotCriticalStateError (t * testing.T ) {
626671 ds := dssync .MutexWrap (datastore .NewMapDatastore ())
627672 st := store .New (ds )
0 commit comments