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  }