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  }