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 }