99 "sync/atomic"
1010 "time"
1111
12- "github.com/celestiaorg/go-header"
1312 "github.com/libp2p/go-libp2p/core/crypto"
1413 abci "github.com/tendermint/tendermint/abci/types"
1514 tmcrypto "github.com/tendermint/tendermint/crypto"
@@ -327,6 +326,10 @@ func (m *Manager) trySyncNextBlock(ctx context.Context, daHeight uint64) error {
327326
328327 if b != nil && commit != nil {
329328 m .logger .Info ("Syncing block" , "height" , b .SignedHeader .Header .Height ())
329+ // Validate the received block before applying
330+ if err := m .executor .Validate (m .lastState , b ); err != nil {
331+ return fmt .Errorf ("failed to validate block: %w" , err )
332+ }
330333 newState , responses , err := m .executor .ApplyBlock (ctx , m .lastState , b )
331334 if err != nil {
332335 return fmt .Errorf ("failed to ApplyBlock: %w" , err )
@@ -530,29 +533,6 @@ func (m *Manager) publishBlock(ctx context.Context) error {
530533 m .logger .Info ("Creating and publishing block" , "height" , newHeight )
531534 block = m .executor .CreateBlock (newHeight , lastCommit , lastHeaderHash , m .lastState )
532535 m .logger .Debug ("block info" , "num_tx" , len (block .Data .Txs ))
533-
534- dataHash , err := m .submitBlockToDA (ctx , block , false )
535- if err != nil {
536- m .logger .Error ("Failed to submit block to DA Layer" )
537- return err
538- }
539- block .SignedHeader .Header .DataHash = dataHash
540-
541- commit , err = m .getCommit (block .SignedHeader .Header )
542- if err != nil {
543- return err
544- }
545-
546- // set the commit to current block's signed header
547- block .SignedHeader .Commit = * commit
548-
549- block .SignedHeader .Validators = m .lastState .Validators
550-
551- // SaveBlock commits the DB tx
552- err = m .store .SaveBlock (block , commit )
553- if err != nil {
554- return err
555- }
556536 }
557537
558538 // Apply the block but DONT commit
@@ -561,11 +541,24 @@ func (m *Manager) publishBlock(ctx context.Context) error {
561541 return err
562542 }
563543
564- if commit == nil {
565- commit , err = m .getCommit (block .SignedHeader .Header )
566- if err != nil {
567- return err
568- }
544+ // Before taking the hash, we need updated ISRs, hence after ApplyBlock
545+ block .SignedHeader .Header .DataHash , err = block .Data .Hash ()
546+ if err != nil {
547+ return err
548+ }
549+
550+ // Sign the block and set the commit to current block's signed header along with signers
551+ commit , err = m .getCommit (block .SignedHeader .Header )
552+ if err != nil {
553+ return err
554+ }
555+
556+ block .SignedHeader .Commit = * commit
557+ block .SignedHeader .Validators = m .lastState .Validators
558+
559+ // Validate the created block before storing
560+ if err := m .executor .Validate (m .lastState , block ); err != nil {
561+ return fmt .Errorf ("failed to validate block: %w" , err )
569562 }
570563
571564 // SaveBlock commits the DB tx
@@ -574,8 +567,7 @@ func (m *Manager) publishBlock(ctx context.Context) error {
574567 return err
575568 }
576569
577- _ , err = m .submitBlockToDA (ctx , block , true )
578- if err != nil {
570+ if err := m .submitBlockToDA (ctx , block ); err != nil {
579571 m .logger .Error ("Failed to submit block to DA Layer" )
580572 return err
581573 }
@@ -621,33 +613,44 @@ func (m *Manager) publishBlock(ctx context.Context) error {
621613 return nil
622614}
623615
624- func (m * Manager ) submitBlockToDA (ctx context.Context , block * types.Block , onlyHeader bool ) (header. Hash , error ) {
616+ func (m * Manager ) submitBlockToDA (ctx context.Context , block * types.Block ) error {
625617 m .logger .Info ("submitting block to DA layer" , "height" , block .SignedHeader .Header .Height ())
626618
627619 submitted := false
628620 backoff := initialBackoff
629- var res da.ResultSubmitBlock
630621 for attempt := 1 ; ctx .Err () == nil && ! submitted && attempt <= maxSubmitAttempts ; attempt ++ {
631- if onlyHeader {
632- res = m .dalc .SubmitBlockHeader (ctx , & block .SignedHeader )
633- } else {
634- res = m .dalc .SubmitBlockData (ctx , & block .Data )
635- }
636- if res .Code == da .StatusSuccess {
637- m .logger .Info ("successfully submitted Rollkit block to DA layer" , "rollkitHeight" , block .SignedHeader .Header .Height (), "daHeight" , res .DAHeight )
622+ headerRes := m .dalc .SubmitBlockHeader (ctx , & block .SignedHeader )
623+ dataRes := m .dalc .SubmitBlockData (ctx , & block .Data )
624+ if headerRes .Code == da .StatusSuccess && dataRes .Code == da .StatusSuccess {
625+ m .logger .Info (
626+ "successfully submitted Rollkit block to DA layer" ,
627+ "rollkitHeight" ,
628+ block .SignedHeader .Header .Height (),
629+ "daHeight of the block header" ,
630+ headerRes .DAHeight ,
631+ "daHeight of the block data" ,
632+ dataRes .DAHeight ,
633+ )
638634 submitted = true
639635 } else {
640- m .logger .Error ("DA layer submission failed" , "error" , res .Message , "attempt" , attempt )
636+ var errMsg string
637+ if headerRes .Code == da .StatusError {
638+ errMsg = headerRes .Message
639+ }
640+ if dataRes .Code == da .StatusError {
641+ errMsg += "," + dataRes .Message
642+ }
643+ m .logger .Error ("DA layer submission failed" , "error" , errMsg , "attempt" , attempt )
641644 time .Sleep (backoff )
642645 backoff = m .exponentialBackoff (backoff )
643646 }
644647 }
645648
646649 if ! submitted {
647- return nil , fmt .Errorf ("failed to submit block to DA layer after %d attempts" , maxSubmitAttempts )
650+ return fmt .Errorf ("failed to submit block to DA layer after %d attempts" , maxSubmitAttempts )
648651 }
649652
650- return res . Hash , nil
653+ return nil
651654}
652655
653656func (m * Manager ) exponentialBackoff (backoff time.Duration ) time.Duration {
0 commit comments