github.com/MetalBlockchain/metalgo@v1.11.9/message/fields.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package message 5 6 import ( 7 "errors" 8 "time" 9 10 "github.com/MetalBlockchain/metalgo/ids" 11 "github.com/MetalBlockchain/metalgo/proto/pb/p2p" 12 ) 13 14 var ( 15 errMissingField = errors.New("message missing field") 16 17 _ chainIDGetter = (*p2p.GetStateSummaryFrontier)(nil) 18 _ chainIDGetter = (*p2p.StateSummaryFrontier)(nil) 19 _ chainIDGetter = (*p2p.GetAcceptedStateSummary)(nil) 20 _ chainIDGetter = (*p2p.AcceptedStateSummary)(nil) 21 _ chainIDGetter = (*p2p.GetAcceptedFrontier)(nil) 22 _ chainIDGetter = (*p2p.AcceptedFrontier)(nil) 23 _ chainIDGetter = (*p2p.GetAccepted)(nil) 24 _ chainIDGetter = (*p2p.Accepted)(nil) 25 _ chainIDGetter = (*p2p.GetAncestors)(nil) 26 _ chainIDGetter = (*p2p.Ancestors)(nil) 27 _ chainIDGetter = (*p2p.Get)(nil) 28 _ chainIDGetter = (*p2p.Put)(nil) 29 _ chainIDGetter = (*p2p.PushQuery)(nil) 30 _ chainIDGetter = (*p2p.PullQuery)(nil) 31 _ chainIDGetter = (*p2p.Chits)(nil) 32 _ chainIDGetter = (*p2p.AppRequest)(nil) 33 _ chainIDGetter = (*p2p.AppResponse)(nil) 34 _ chainIDGetter = (*p2p.AppGossip)(nil) 35 36 _ requestIDGetter = (*p2p.GetStateSummaryFrontier)(nil) 37 _ requestIDGetter = (*p2p.StateSummaryFrontier)(nil) 38 _ requestIDGetter = (*p2p.GetAcceptedStateSummary)(nil) 39 _ requestIDGetter = (*p2p.AcceptedStateSummary)(nil) 40 _ requestIDGetter = (*p2p.GetAcceptedFrontier)(nil) 41 _ requestIDGetter = (*p2p.AcceptedFrontier)(nil) 42 _ requestIDGetter = (*p2p.GetAccepted)(nil) 43 _ requestIDGetter = (*p2p.Accepted)(nil) 44 _ requestIDGetter = (*p2p.GetAncestors)(nil) 45 _ requestIDGetter = (*p2p.Ancestors)(nil) 46 _ requestIDGetter = (*p2p.Get)(nil) 47 _ requestIDGetter = (*p2p.Put)(nil) 48 _ requestIDGetter = (*p2p.PushQuery)(nil) 49 _ requestIDGetter = (*p2p.PullQuery)(nil) 50 _ requestIDGetter = (*p2p.Chits)(nil) 51 _ requestIDGetter = (*p2p.AppRequest)(nil) 52 _ requestIDGetter = (*p2p.AppResponse)(nil) 53 54 _ engineTypeGetter = (*p2p.GetAncestors)(nil) 55 56 _ deadlineGetter = (*p2p.GetStateSummaryFrontier)(nil) 57 _ deadlineGetter = (*p2p.GetAcceptedStateSummary)(nil) 58 _ deadlineGetter = (*p2p.GetAcceptedFrontier)(nil) 59 _ deadlineGetter = (*p2p.GetAccepted)(nil) 60 _ deadlineGetter = (*p2p.GetAncestors)(nil) 61 _ deadlineGetter = (*p2p.Get)(nil) 62 _ deadlineGetter = (*p2p.PushQuery)(nil) 63 _ deadlineGetter = (*p2p.PullQuery)(nil) 64 _ deadlineGetter = (*p2p.AppRequest)(nil) 65 ) 66 67 type chainIDGetter interface { 68 GetChainId() []byte 69 } 70 71 func GetChainID(m any) (ids.ID, error) { 72 msg, ok := m.(chainIDGetter) 73 if !ok { 74 return ids.Empty, errMissingField 75 } 76 chainIDBytes := msg.GetChainId() 77 return ids.ToID(chainIDBytes) 78 } 79 80 type sourceChainIDGetter interface { 81 GetSourceChainID() ids.ID 82 } 83 84 func GetSourceChainID(m any) (ids.ID, error) { 85 msg, ok := m.(sourceChainIDGetter) 86 if !ok { 87 return GetChainID(m) 88 } 89 return msg.GetSourceChainID(), nil 90 } 91 92 type requestIDGetter interface { 93 GetRequestId() uint32 94 } 95 96 func GetRequestID(m any) (uint32, bool) { 97 if msg, ok := m.(requestIDGetter); ok { 98 requestID := msg.GetRequestId() 99 return requestID, true 100 } 101 102 // AppGossip is the only inbound message not containing a requestID. For 103 // ease of handling, imagine that it does have a requestID. 104 _, ok := m.(*p2p.AppGossip) 105 return 0, ok 106 } 107 108 type engineTypeGetter interface { 109 GetEngineType() p2p.EngineType 110 } 111 112 func GetEngineType(m any) (p2p.EngineType, bool) { 113 msg, ok := m.(engineTypeGetter) 114 if !ok { 115 return p2p.EngineType_ENGINE_TYPE_UNSPECIFIED, false 116 } 117 return msg.GetEngineType(), true 118 } 119 120 type deadlineGetter interface { 121 GetDeadline() uint64 122 } 123 124 func GetDeadline(m any) (time.Duration, bool) { 125 msg, ok := m.(deadlineGetter) 126 if !ok { 127 return 0, false 128 } 129 deadline := msg.GetDeadline() 130 return time.Duration(deadline), true 131 }