github.com/koko1123/flow-go-1@v0.29.6/network/codec/codes.go (about)

     1  // (c) 2019 Dapper Labs - ALL RIGHTS RESERVED
     2  
     3  package codec
     4  
     5  import (
     6  	"fmt"
     7  
     8  	"github.com/koko1123/flow-go-1/model/flow"
     9  	"github.com/koko1123/flow-go-1/model/libp2p/message"
    10  	"github.com/koko1123/flow-go-1/model/messages"
    11  )
    12  
    13  const (
    14  	CodeMin uint8 = iota + 1
    15  
    16  	// consensus
    17  	CodeBlockProposal
    18  	CodeBlockVote
    19  
    20  	// protocol state sync
    21  	CodeSyncRequest
    22  	CodeSyncResponse
    23  	CodeRangeRequest
    24  	CodeBatchRequest
    25  	CodeBlockResponse
    26  
    27  	// cluster consensus
    28  	CodeClusterBlockProposal
    29  	CodeClusterBlockVote
    30  	CodeClusterBlockResponse
    31  
    32  	// collections, guarantees & transactions
    33  	CodeCollectionGuarantee
    34  	CodeTransaction
    35  	CodeTransactionBody
    36  
    37  	// core messages for execution & verification
    38  	CodeExecutionReceipt
    39  	CodeResultApproval
    40  
    41  	// execution state synchronization
    42  	CodeExecutionStateSyncRequest
    43  	CodeExecutionStateDelta
    44  
    45  	// data exchange for execution of blocks
    46  	CodeChunkDataRequest
    47  	CodeChunkDataResponse
    48  
    49  	// result approvals
    50  	CodeApprovalRequest
    51  	CodeApprovalResponse
    52  
    53  	// generic entity exchange engines
    54  	CodeEntityRequest
    55  	CodeEntityResponse
    56  
    57  	// testing
    58  	CodeEcho
    59  
    60  	// DKG
    61  	CodeDKGMessage
    62  
    63  	CodeMax
    64  )
    65  
    66  // MessageCodeFromInterface returns the correct Code based on the underlying type of message v.
    67  func MessageCodeFromInterface(v interface{}) (uint8, string, error) {
    68  	switch v.(type) {
    69  	// consensus
    70  	case *messages.BlockProposal:
    71  		return CodeBlockProposal, "CodeBlockProposal", nil
    72  	case *messages.BlockVote:
    73  		return CodeBlockVote, "CodeBlockVote", nil
    74  
    75  	// cluster consensus
    76  	case *messages.ClusterBlockProposal:
    77  		return CodeClusterBlockProposal, "CodeClusterBlockProposal", nil
    78  	case *messages.ClusterBlockVote:
    79  		return CodeClusterBlockVote, "CodeClusterBlockVote", nil
    80  	case *messages.ClusterBlockResponse:
    81  		return CodeClusterBlockResponse, "CodeClusterBlockResponse", nil
    82  
    83  	// protocol state sync
    84  	case *messages.SyncRequest:
    85  		return CodeSyncRequest, "CodeSyncRequest", nil
    86  	case *messages.SyncResponse:
    87  		return CodeSyncResponse, "CodeSyncResponse", nil
    88  	case *messages.RangeRequest:
    89  		return CodeRangeRequest, "CodeRangeRequest", nil
    90  	case *messages.BatchRequest:
    91  		return CodeBatchRequest, "CodeBatchRequest", nil
    92  	case *messages.BlockResponse:
    93  		return CodeBlockResponse, "CodeBlockResponse", nil
    94  
    95  	// collections, guarantees & transactions
    96  	case *flow.CollectionGuarantee:
    97  		return CodeCollectionGuarantee, "CodeCollectionGuarantee", nil
    98  	case *flow.TransactionBody:
    99  		return CodeTransactionBody, "CodeTransactionBody", nil
   100  	case *flow.Transaction:
   101  		return CodeTransaction, "CodeTransaction", nil
   102  
   103  	// core messages for execution & verification
   104  	case *flow.ExecutionReceipt:
   105  		return CodeExecutionReceipt, "CodeExecutionReceipt", nil
   106  	case *flow.ResultApproval:
   107  		return CodeResultApproval, "CodeResultApproval", nil
   108  
   109  	// execution state synchronization
   110  	case *messages.ExecutionStateSyncRequest:
   111  		return CodeExecutionStateSyncRequest, "CodeExecutionStateSyncRequest", nil
   112  	case *messages.ExecutionStateDelta:
   113  		return CodeExecutionStateDelta, "CodeExecutionStateDelta", nil
   114  
   115  	// data exchange for execution of blocks
   116  	case *messages.ChunkDataRequest:
   117  		return CodeChunkDataRequest, "CodeChunkDataRequest", nil
   118  	case *messages.ChunkDataResponse:
   119  		return CodeChunkDataResponse, "CodeChunkDataResponse", nil
   120  
   121  	// result approvals
   122  	case *messages.ApprovalRequest:
   123  		return CodeApprovalRequest, "CodeApprovalRequest", nil
   124  	case *messages.ApprovalResponse:
   125  		return CodeApprovalResponse, "CodeApprovalResponse", nil
   126  
   127  	// generic entity exchange engines
   128  	case *messages.EntityRequest:
   129  		return CodeEntityRequest, "CodeEntityRequest", nil
   130  	case *messages.EntityResponse:
   131  		return CodeEntityResponse, "CodeEntityResponse", nil
   132  
   133  	// testing
   134  	case *message.TestMessage:
   135  		return CodeEcho, "CodeEcho", nil
   136  
   137  	// dkg
   138  	case *messages.DKGMessage:
   139  		return CodeDKGMessage, "CodeDKGMessage", nil
   140  
   141  	default:
   142  		return 0, "", fmt.Errorf("invalid encode type (%T)", v)
   143  	}
   144  }
   145  
   146  // InterfaceFromMessageCode returns an interface with the correct underlying go type
   147  // of the message code represents.
   148  // Expected error returns during normal operations:
   149  //   - ErrUnknownMsgCode if message code does not match any of the configured message codes above.
   150  func InterfaceFromMessageCode(code uint8) (interface{}, string, error) {
   151  	switch code {
   152  	// consensus
   153  	case CodeBlockProposal:
   154  		return &messages.BlockProposal{}, "BlockProposal", nil
   155  	case CodeBlockVote:
   156  		return &messages.BlockVote{}, "BlockVote", nil
   157  
   158  	// cluster consensus
   159  	case CodeClusterBlockProposal:
   160  		return &messages.ClusterBlockProposal{}, "ClusterBlockProposal", nil
   161  	case CodeClusterBlockVote:
   162  		return &messages.ClusterBlockVote{}, "ClusterBlockVote", nil
   163  	case CodeClusterBlockResponse:
   164  		return &messages.ClusterBlockResponse{}, "ClusterBlockResponse", nil
   165  
   166  	// protocol state sync
   167  	case CodeSyncRequest:
   168  		return &messages.SyncRequest{}, "SyncRequest", nil
   169  	case CodeSyncResponse:
   170  		return &messages.SyncResponse{}, "SyncResponse", nil
   171  	case CodeRangeRequest:
   172  		return &messages.RangeRequest{}, "RangeRequest", nil
   173  	case CodeBatchRequest:
   174  		return &messages.BatchRequest{}, "BatchRequest", nil
   175  	case CodeBlockResponse:
   176  		return &messages.BlockResponse{}, "BlockResponse", nil
   177  
   178  	// collections, guarantees & transactions
   179  	case CodeCollectionGuarantee:
   180  		return &flow.CollectionGuarantee{}, "CollectionGuarantee", nil
   181  	case CodeTransactionBody:
   182  		return &flow.TransactionBody{}, "TransactionBody", nil
   183  	case CodeTransaction:
   184  		return &flow.Transaction{}, "Transaction", nil
   185  
   186  	// core messages for execution & verification
   187  	case CodeExecutionReceipt:
   188  		return &flow.ExecutionReceipt{}, "ExecutionReceipt", nil
   189  	case CodeResultApproval:
   190  		return &flow.ResultApproval{}, "ResultApproval", nil
   191  
   192  	// execution state synchronization
   193  	case CodeExecutionStateSyncRequest:
   194  		return &messages.ExecutionStateSyncRequest{}, "ExecutionStateSyncRequest", nil
   195  	case CodeExecutionStateDelta:
   196  		return &messages.ExecutionStateDelta{}, "ExecutionStateDelta", nil
   197  
   198  	// data exchange for execution of blocks
   199  	case CodeChunkDataRequest:
   200  		return &messages.ChunkDataRequest{}, "ChunkDataRequest", nil
   201  	case CodeChunkDataResponse:
   202  		return &messages.ChunkDataResponse{}, "ChunkDataResponse", nil
   203  
   204  	// result approvals
   205  	case CodeApprovalRequest:
   206  		return &messages.ApprovalRequest{}, "ApprovalRequest", nil
   207  	case CodeApprovalResponse:
   208  		return &messages.ApprovalResponse{}, "ApprovalResponse", nil
   209  
   210  	// generic entity exchange engines
   211  	case CodeEntityRequest:
   212  		return &messages.EntityRequest{}, "EntityRequest", nil
   213  	case CodeEntityResponse:
   214  		return &messages.EntityResponse{}, "EntityResponse", nil
   215  
   216  	// dkg
   217  	case CodeDKGMessage:
   218  		return &messages.DKGMessage{}, "DKGMessage", nil
   219  
   220  	// test messages
   221  	case CodeEcho:
   222  		return &message.TestMessage{}, "TestMessage", nil
   223  
   224  	default:
   225  		return nil, "", NewUnknownMsgCodeErr(code)
   226  	}
   227  }