Skip to content

Commit e09cde0

Browse files
authored
Merge pull request #16 from icon-project/restore-missing-message
Check missing BTP message when get finality update
2 parents 0dc7174 + daeb9e1 commit e09cde0

File tree

1 file changed

+42
-17
lines changed

1 file changed

+42
-17
lines changed

chain/eth2/receiver.go

Lines changed: 42 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ package eth2
1919
import (
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+
214221
func (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

Comments
 (0)