github.com/line/ostracon@v1.0.10-0.20230328032236-7f20145f065d/abci/types/messages.go (about) 1 package types 2 3 import ( 4 "bufio" 5 "encoding/binary" 6 "io" 7 8 "github.com/gogo/protobuf/proto" 9 10 "github.com/tendermint/tendermint/abci/types" 11 ) 12 13 const ( 14 maxMsgSize = 104857600 // 100MB 15 ) 16 17 // WriteMessage writes a varint length-delimited protobuf message. 18 func WriteMessage(msg proto.Message, w io.Writer) error { 19 bz, err := proto.Marshal(msg) 20 if err != nil { 21 return err 22 } 23 return encodeByteSlice(w, bz) 24 } 25 26 // ReadMessage reads a varint length-delimited protobuf message. 27 func ReadMessage(r io.Reader, msg proto.Message) error { 28 return readProtoMsg(r, msg, maxMsgSize) 29 } 30 31 func readProtoMsg(r io.Reader, msg proto.Message, maxSize int) error { 32 // binary.ReadVarint takes an io.ByteReader, eg. a bufio.Reader 33 reader, ok := r.(*bufio.Reader) 34 if !ok { 35 reader = bufio.NewReader(r) 36 } 37 length64, err := binary.ReadVarint(reader) 38 if err != nil { 39 return err 40 } 41 length := int(length64) 42 if length < 0 || length > maxSize { 43 return io.ErrShortBuffer 44 } 45 buf := make([]byte, length) 46 if _, err := io.ReadFull(reader, buf); err != nil { 47 return err 48 } 49 return proto.Unmarshal(buf, msg) 50 } 51 52 //----------------------------------------------------------------------- 53 // NOTE: we copied wire.EncodeByteSlice from go-wire rather than keep 54 // go-wire as a dep 55 56 func encodeByteSlice(w io.Writer, bz []byte) (err error) { 57 err = encodeVarint(w, int64(len(bz))) 58 if err != nil { 59 return 60 } 61 _, err = w.Write(bz) 62 return 63 } 64 65 func encodeVarint(w io.Writer, i int64) (err error) { 66 var buf [10]byte 67 n := binary.PutVarint(buf[:], i) 68 _, err = w.Write(buf[0:n]) 69 return 70 } 71 72 //---------------------------------------- 73 74 func ToRequestEcho(message string) *Request { 75 return &Request{ 76 Value: &Request_Echo{&types.RequestEcho{Message: message}}, 77 } 78 } 79 80 func ToRequestFlush() *Request { 81 return &Request{ 82 Value: &Request_Flush{&types.RequestFlush{}}, 83 } 84 } 85 86 func ToRequestInfo(req types.RequestInfo) *Request { 87 return &Request{ 88 Value: &Request_Info{&req}, 89 } 90 } 91 92 func ToRequestSetOption(req types.RequestSetOption) *Request { 93 return &Request{ 94 Value: &Request_SetOption{&req}, 95 } 96 } 97 98 func ToRequestDeliverTx(req types.RequestDeliverTx) *Request { 99 return &Request{ 100 Value: &Request_DeliverTx{&req}, 101 } 102 } 103 104 func ToRequestCheckTx(req types.RequestCheckTx) *Request { 105 return &Request{ 106 Value: &Request_CheckTx{&req}, 107 } 108 } 109 110 func ToRequestCommit() *Request { 111 return &Request{ 112 Value: &Request_Commit{&types.RequestCommit{}}, 113 } 114 } 115 116 func ToRequestQuery(req types.RequestQuery) *Request { 117 return &Request{ 118 Value: &Request_Query{&req}, 119 } 120 } 121 122 func ToRequestInitChain(req types.RequestInitChain) *Request { 123 return &Request{ 124 Value: &Request_InitChain{&req}, 125 } 126 } 127 128 func ToRequestBeginBlock(req RequestBeginBlock) *Request { 129 return &Request{ 130 Value: &Request_BeginBlock{&req}, 131 } 132 } 133 134 func ToRequestEndBlock(req types.RequestEndBlock) *Request { 135 return &Request{ 136 Value: &Request_EndBlock{&req}, 137 } 138 } 139 140 func ToRequestBeginRecheckTx(req RequestBeginRecheckTx) *Request { 141 return &Request{ 142 Value: &Request_BeginRecheckTx{&req}, 143 } 144 } 145 146 func ToRequestEndRecheckTx(req RequestEndRecheckTx) *Request { 147 return &Request{ 148 Value: &Request_EndRecheckTx{&req}, 149 } 150 } 151 152 func ToRequestListSnapshots(req types.RequestListSnapshots) *Request { 153 return &Request{ 154 Value: &Request_ListSnapshots{&req}, 155 } 156 } 157 158 func ToRequestOfferSnapshot(req types.RequestOfferSnapshot) *Request { 159 return &Request{ 160 Value: &Request_OfferSnapshot{&req}, 161 } 162 } 163 164 func ToRequestLoadSnapshotChunk(req types.RequestLoadSnapshotChunk) *Request { 165 return &Request{ 166 Value: &Request_LoadSnapshotChunk{&req}, 167 } 168 } 169 170 func ToRequestApplySnapshotChunk(req types.RequestApplySnapshotChunk) *Request { 171 return &Request{ 172 Value: &Request_ApplySnapshotChunk{&req}, 173 } 174 } 175 176 //---------------------------------------- 177 178 func ToResponseException(errStr string) *Response { 179 return &Response{ 180 Value: &Response_Exception{&types.ResponseException{Error: errStr}}, 181 } 182 } 183 184 func ToResponseEcho(message string) *Response { 185 return &Response{ 186 Value: &Response_Echo{&types.ResponseEcho{Message: message}}, 187 } 188 } 189 190 func ToResponseFlush() *Response { 191 return &Response{ 192 Value: &Response_Flush{&types.ResponseFlush{}}, 193 } 194 } 195 196 func ToResponseInfo(res types.ResponseInfo) *Response { 197 return &Response{ 198 Value: &Response_Info{&res}, 199 } 200 } 201 202 func ToResponseSetOption(res types.ResponseSetOption) *Response { 203 return &Response{ 204 Value: &Response_SetOption{&res}, 205 } 206 } 207 208 func ToResponseDeliverTx(res types.ResponseDeliverTx) *Response { 209 return &Response{ 210 Value: &Response_DeliverTx{&res}, 211 } 212 } 213 214 func ToResponseCheckTx(res ResponseCheckTx) *Response { 215 return &Response{ 216 Value: &Response_CheckTx{&res}, 217 } 218 } 219 220 func ToResponseCommit(res types.ResponseCommit) *Response { 221 return &Response{ 222 Value: &Response_Commit{&res}, 223 } 224 } 225 226 func ToResponseQuery(res types.ResponseQuery) *Response { 227 return &Response{ 228 Value: &Response_Query{&res}, 229 } 230 } 231 232 func ToResponseInitChain(res types.ResponseInitChain) *Response { 233 return &Response{ 234 Value: &Response_InitChain{&res}, 235 } 236 } 237 238 func ToResponseBeginBlock(res types.ResponseBeginBlock) *Response { 239 return &Response{ 240 Value: &Response_BeginBlock{&res}, 241 } 242 } 243 244 func ToResponseEndBlock(res types.ResponseEndBlock) *Response { 245 return &Response{ 246 Value: &Response_EndBlock{&res}, 247 } 248 } 249 250 func ToResponseBeginRecheckTx(res ResponseBeginRecheckTx) *Response { 251 return &Response{ 252 Value: &Response_BeginRecheckTx{&res}, 253 } 254 } 255 256 func ToResponseEndRecheckTx(res ResponseEndRecheckTx) *Response { 257 return &Response{ 258 Value: &Response_EndRecheckTx{&res}, 259 } 260 } 261 262 func ToResponseListSnapshots(res types.ResponseListSnapshots) *Response { 263 return &Response{ 264 Value: &Response_ListSnapshots{&res}, 265 } 266 } 267 268 func ToResponseOfferSnapshot(res types.ResponseOfferSnapshot) *Response { 269 return &Response{ 270 Value: &Response_OfferSnapshot{&res}, 271 } 272 } 273 274 func ToResponseLoadSnapshotChunk(res types.ResponseLoadSnapshotChunk) *Response { 275 return &Response{ 276 Value: &Response_LoadSnapshotChunk{&res}, 277 } 278 } 279 280 func ToResponseApplySnapshotChunk(res types.ResponseApplySnapshotChunk) *Response { 281 return &Response{ 282 Value: &Response_ApplySnapshotChunk{&res}, 283 } 284 }