github.com/lazyledger/lazyledger-core@v0.35.0-dev.0.20210613111200-4c651f053571/proto/tendermint/statesync/message.go (about) 1 package statesync 2 3 import ( 4 "errors" 5 fmt "fmt" 6 7 proto "github.com/gogo/protobuf/proto" 8 ) 9 10 // Wrap implements the p2p Wrapper interface and wraps a state sync messages. 11 func (m *Message) Wrap(msg proto.Message) error { 12 switch msg := msg.(type) { 13 case *ChunkRequest: 14 m.Sum = &Message_ChunkRequest{ChunkRequest: msg} 15 16 case *ChunkResponse: 17 m.Sum = &Message_ChunkResponse{ChunkResponse: msg} 18 19 case *SnapshotsRequest: 20 m.Sum = &Message_SnapshotsRequest{SnapshotsRequest: msg} 21 22 case *SnapshotsResponse: 23 m.Sum = &Message_SnapshotsResponse{SnapshotsResponse: msg} 24 25 default: 26 return fmt.Errorf("unknown message: %T", msg) 27 } 28 29 return nil 30 } 31 32 // Unwrap implements the p2p Wrapper interface and unwraps a wrapped state sync 33 // message. 34 func (m *Message) Unwrap() (proto.Message, error) { 35 switch msg := m.Sum.(type) { 36 case *Message_ChunkRequest: 37 return m.GetChunkRequest(), nil 38 39 case *Message_ChunkResponse: 40 return m.GetChunkResponse(), nil 41 42 case *Message_SnapshotsRequest: 43 return m.GetSnapshotsRequest(), nil 44 45 case *Message_SnapshotsResponse: 46 return m.GetSnapshotsResponse(), nil 47 48 default: 49 return nil, fmt.Errorf("unknown message: %T", msg) 50 } 51 } 52 53 // Validate validates the message returning an error upon failure. 54 func (m *Message) Validate() error { 55 if m == nil { 56 return errors.New("message cannot be nil") 57 } 58 59 switch msg := m.Sum.(type) { 60 case *Message_ChunkRequest: 61 if m.GetChunkRequest().Height == 0 { 62 return errors.New("height cannot be 0") 63 } 64 65 case *Message_ChunkResponse: 66 if m.GetChunkResponse().Height == 0 { 67 return errors.New("height cannot be 0") 68 } 69 if m.GetChunkResponse().Missing && len(m.GetChunkResponse().Chunk) > 0 { 70 return errors.New("missing chunk cannot have contents") 71 } 72 if !m.GetChunkResponse().Missing && m.GetChunkResponse().Chunk == nil { 73 return errors.New("chunk cannot be nil") 74 } 75 76 case *Message_SnapshotsRequest: 77 78 case *Message_SnapshotsResponse: 79 if m.GetSnapshotsResponse().Height == 0 { 80 return errors.New("height cannot be 0") 81 } 82 if len(m.GetSnapshotsResponse().Hash) == 0 { 83 return errors.New("snapshot has no hash") 84 } 85 if m.GetSnapshotsResponse().Chunks == 0 { 86 return errors.New("snapshot has no chunks") 87 } 88 89 default: 90 return fmt.Errorf("unknown message type: %T", msg) 91 } 92 93 return nil 94 }