@@ -19,7 +19,6 @@ package eth2
1919import (
2020 "bytes"
2121 "fmt"
22- "math"
2322 "math/big"
2423 "strconv"
2524 "sync"
@@ -211,6 +210,14 @@ func (r *receiver) GetHeightForSeq(seq int64) int64 {
211210 return mp .Height ()
212211}
213212
213+ func (r * receiver ) getLastMessageSeq () int64 {
214+ ls := r .seq
215+ if len (r .mps ) > 0 {
216+ ls = r .mps [len (r .mps )- 1 ].EndSeq
217+ }
218+ return ls
219+ }
220+
214221func (r * receiver ) GetMessageProofDataForSeq (seq int64 ) * messageProofData {
215222 for _ , mp := range r .mps {
216223 if mp .Contains (seq ) {
@@ -581,17 +588,17 @@ func (r *receiver) Monitoring(bls *types.BMCLinkStatus) error {
581588 r .l .Warnf ("failed to make blockUpdateData. %+v" , err )
582589 return
583590 }
584- err = r .validateMessageProofData (update )
591+ err = r .validateMessageProofData (bls , update )
592+ if err != nil {
593+ r .l .Warnf ("failed to validate messageProofData. %+v" , err )
594+ return
595+ }
585596 lastSeq := r .prevRS .Seq ()
586597 lmp := r .GetLastMessageProofDataForHeight (slot )
587598 if lmp != nil {
588599 lastSeq = lmp .EndSeq
589600 }
590601 rs := & receiveStatus {seq : lastSeq , slot : slot , buds : buds }
591- if err != nil {
592- r .l .Warnf ("failed to validate messageProofData. %+v" , err )
593- return
594- }
595602 r .rss = append (r .rss , rs )
596603 r .rsc <- rs
597604 r .prevRS = rs
@@ -849,7 +856,7 @@ func (r *receiver) getBTPLogsWithSeq(seq int64, from, to uint64) ([]etypes.Log,
849856 return nil , err
850857 }
851858 if message .Seq .Int64 () == seq || l .BlockNumber == blockNum {
852- r .l .Debugf ("BTP message for %d BN: %d" , message .Seq , l .BlockNumber )
859+ r .l .Debugf ("BTP message(seq:%d) at BN: %d" , message .Seq , l .BlockNumber )
853860 if blockNum == 0 {
854861 s = i
855862 blockNum = l .BlockNumber
@@ -979,37 +986,55 @@ func (r *receiver) addCheckPointsByRange(from, to int64) {
979986 }
980987}
981988
982- func (r * receiver ) validateMessageProofData (update * capella.LightClientFinalityUpdate ) error {
989+ func (r * receiver ) validateMessageProofData (bls * types.BMCLinkStatus , update * capella.LightClientFinalityUpdate ) error {
990+ aSlot := int64 (update .AttestedHeader .Beacon .Slot )
983991 fSlot := int64 (update .FinalizedHeader .Beacon .Slot )
992+ status , err := r .getStatus ()
993+ if err != nil {
994+ return err
995+ }
996+
984997 valid := false
985- r .l .Debugf ("validate messageProofDatas at %d ." , fSlot )
998+ r .l .Debugf ("validate messageProofDatas at aSlot:%d, fSlot:%d, rStatus:%+v, bls:%+v ." , aSlot , fSlot , status , bls )
986999 if cp , ok := r .cp [fSlot ]; ok {
9871000 valid = cp .String () == update .FinalizedHeader .Beacon .String ()
988- r .l .Debugf ("find checkpoint %v" , valid )
989- delete (r .cp , fSlot )
1001+ if ! valid {
1002+ r .l .Debugf ("made messageProofData with invalid optimistic header" )
1003+ } else {
1004+ if status .TxSeq > bls .RxSeq {
1005+ if status .TxSeq != r .getLastMessageSeq () {
1006+ r .l .Debugf ("there is missing BTP message. (seq: %d ~ %d)" ,
1007+ r .getLastMessageSeq ()+ 1 , status .TxSeq ,
1008+ )
1009+ valid = false
1010+ }
1011+ }
1012+ }
9901013 } else {
9911014 r .l .Debugf ("no checkpoint" )
9921015 valid = false
9931016 }
9941017
995- // rebuild message proof data and checkpoint
996- if ! valid {
997- r .l .Debugf ("invalid messageProofDatas at %d. reset messageProofDatas" , fSlot )
1018+ if valid {
1019+ delete (r .cp , fSlot )
1020+ } else {
1021+ r .l .Debugf ("rebuild messageProofDatas seq" )
9981022 r .mps = make ([]* messageProofData , 0 )
9991023 r .cp = make (map [int64 ]* phase0.BeaconBlockHeader )
10001024 r .seq = r .prevRS .Seq ()
1001- aSlot := int64 (update .AttestedHeader .Beacon .Slot )
10021025
10031026 mps , err := r .messageProofDatasByRange (
1004- r .prevRS .Height ()+ 1 , r .prevRS .Seq ()+ 1 , aSlot , math . MaxInt64 ,
1027+ r .prevRS .Height ()+ 1 , r .prevRS .Seq ()+ 1 , aSlot , status . TxSeq ,
10051028 )
10061029 if err != nil {
10071030 return err
10081031 }
1009- r .addCheckPointsByRange (fSlot , aSlot )
10101032 if len (mps ) > 0 {
1033+ r .mps = append (r .mps , mps ... )
10111034 r .l .Debugf ("append %d messageProofDatas by range" , len (mps ))
10121035 }
1036+
1037+ r .addCheckPointsByRange (fSlot , aSlot )
10131038 }
10141039
10151040 return nil
0 commit comments