[stream] added sync stream protobuf message module (#3561)
Co-authored-by: Rongjian Lan <rongjian.lan@gmail.com>pull/3569/head v3.1.3
parent
db453f28d7
commit
3dcc92cee5
@ -0,0 +1,206 @@ |
||||
package message |
||||
|
||||
import ( |
||||
"github.com/ethereum/go-ethereum/common" |
||||
) |
||||
|
||||
// MakeGetBlockNumberRequest makes the GetBlockNumber Request
|
||||
func MakeGetBlockNumberRequest() *Request { |
||||
return &Request{ |
||||
Request: &Request_GetBlockNumberRequest{ |
||||
GetBlockNumberRequest: &GetBlockNumberRequest{}, |
||||
}, |
||||
} |
||||
} |
||||
|
||||
// MakeGetBlockHashesRequest makes GetBlockHashes Request
|
||||
func MakeGetBlockHashesRequest(bns []uint64) *Request { |
||||
return &Request{ |
||||
Request: &Request_GetBlockHashesRequest{ |
||||
GetBlockHashesRequest: &GetBlockHashesRequest{ |
||||
Nums: bns, |
||||
}, |
||||
}, |
||||
} |
||||
} |
||||
|
||||
// MakeGetBlocksByNumRequest makes the GetBlockByNumber request
|
||||
func MakeGetBlocksByNumRequest(bns []uint64) *Request { |
||||
return &Request{ |
||||
Request: &Request_GetBlocksByNumRequest{ |
||||
GetBlocksByNumRequest: &GetBlocksByNumRequest{ |
||||
Nums: bns, |
||||
}, |
||||
}, |
||||
} |
||||
} |
||||
|
||||
//MakeGetBlockByHashesRequest makes the GetBlocksByHashes request
|
||||
func MakeGetBlocksByHashesRequest(hashes []common.Hash) *Request { |
||||
return &Request{ |
||||
Request: &Request_GetBlocksByHashesRequest{ |
||||
GetBlocksByHashesRequest: &GetBlocksByHashesRequest{ |
||||
BlockHashes: hashesToBytes(hashes), |
||||
}, |
||||
}, |
||||
} |
||||
} |
||||
|
||||
// MakeGetEpochStateRequest make GetEpochBlock request
|
||||
func MakeGetEpochStateRequest(epoch uint64) *Request { |
||||
return &Request{ |
||||
Request: &Request_GetEpochStateRequest{ |
||||
GetEpochStateRequest: &GetEpochStateRequest{ |
||||
Epoch: epoch, |
||||
}, |
||||
}, |
||||
} |
||||
} |
||||
|
||||
// MakeErrorResponse makes the error response
|
||||
func MakeErrorResponseMessage(rid uint64, err error) *Message { |
||||
resp := MakeErrorResponse(rid, err) |
||||
return makeMessageFromResponse(resp) |
||||
} |
||||
|
||||
// MakeErrorResponse makes the error response as a response
|
||||
func MakeErrorResponse(rid uint64, err error) *Response { |
||||
return &Response{ |
||||
ReqId: rid, |
||||
Response: &Response_ErrorResponse{ |
||||
&ErrorResponse{ |
||||
Error: err.Error(), |
||||
}, |
||||
}, |
||||
} |
||||
} |
||||
|
||||
// MakeGetBlockNumberResponseMessage makes the GetBlockNumber response message
|
||||
func MakeGetBlockNumberResponseMessage(rid uint64, bn uint64) *Message { |
||||
resp := MakeGetBlockNumberResponse(rid, bn) |
||||
return makeMessageFromResponse(resp) |
||||
} |
||||
|
||||
// MakeGetBlockNumberResponse makes the GetBlockNumber response
|
||||
func MakeGetBlockNumberResponse(rid uint64, bn uint64) *Response { |
||||
return &Response{ |
||||
ReqId: rid, |
||||
Response: &Response_GetBlockNumberResponse{ |
||||
GetBlockNumberResponse: &GetBlockNumberResponse{ |
||||
Number: bn, |
||||
}, |
||||
}, |
||||
} |
||||
} |
||||
|
||||
// MakeGetBlockHashesResponseMessage makes the GetBlockHashes message
|
||||
func MakeGetBlockHashesResponseMessage(rid uint64, hs []common.Hash) *Message { |
||||
resp := MakeGetBlockHashesResponse(rid, hs) |
||||
return makeMessageFromResponse(resp) |
||||
} |
||||
|
||||
// MakeGetBlockHashesResponse makes the GetBlockHashes response
|
||||
func MakeGetBlockHashesResponse(rid uint64, hs []common.Hash) *Response { |
||||
return &Response{ |
||||
ReqId: rid, |
||||
Response: &Response_GetBlockHashesResponse{ |
||||
GetBlockHashesResponse: &GetBlockHashesResponse{ |
||||
Hashes: hashesToBytes(hs), |
||||
}, |
||||
}, |
||||
} |
||||
} |
||||
|
||||
// MakeGetBlocksByNumResponseMessage makes the GetBlocksByNumResponse of Message type
|
||||
func MakeGetBlocksByNumResponseMessage(rid uint64, blocksBytes [][]byte) *Message { |
||||
resp := MakeGetBlocksByNumResponse(rid, blocksBytes) |
||||
return makeMessageFromResponse(resp) |
||||
} |
||||
|
||||
// MakeGetBlocksByNumResponseMessage make the GetBlocksByNumResponse of Response type
|
||||
func MakeGetBlocksByNumResponse(rid uint64, blocksBytes [][]byte) *Response { |
||||
return &Response{ |
||||
ReqId: rid, |
||||
Response: &Response_GetBlocksByNumResponse{ |
||||
GetBlocksByNumResponse: &GetBlocksByNumResponse{ |
||||
BlocksBytes: blocksBytes, |
||||
}, |
||||
}, |
||||
} |
||||
} |
||||
|
||||
// MakeGetBlocksByHashesResponseMessage makes the GetBlocksByHashesResponse of Message type
|
||||
func MakeGetBlocksByHashesResponseMessage(rid uint64, blocksBytes [][]byte) *Message { |
||||
resp := MakeGetBlocksByHashesResponse(rid, blocksBytes) |
||||
return makeMessageFromResponse(resp) |
||||
} |
||||
|
||||
// MakeGetBlocksByHashesResponse make the GetBlocksByHashesResponse of Response type
|
||||
func MakeGetBlocksByHashesResponse(rid uint64, blocksBytes [][]byte) *Response { |
||||
return &Response{ |
||||
ReqId: rid, |
||||
Response: &Response_GetBlocksByHashesResponse{ |
||||
GetBlocksByHashesResponse: &GetBlocksByHashesResponse{ |
||||
BlocksBytes: blocksBytes, |
||||
}, |
||||
}, |
||||
} |
||||
} |
||||
|
||||
// MakeGetEpochStateResponse makes GetEpochStateResponse as message
|
||||
func MakeGetEpochStateResponseMessage(rid uint64, headerBytes []byte, ssBytes []byte) *Message { |
||||
resp := MakeGetEpochStateResponse(rid, headerBytes, ssBytes) |
||||
return makeMessageFromResponse(resp) |
||||
} |
||||
|
||||
// MakeEpochStateResponse makes GetEpochStateResponse as response
|
||||
func MakeGetEpochStateResponse(rid uint64, headerBytes []byte, ssBytes []byte) *Response { |
||||
return &Response{ |
||||
ReqId: rid, |
||||
Response: &Response_GetEpochStateResponse{ |
||||
GetEpochStateResponse: &GetEpochStateResponse{ |
||||
HeaderBytes: headerBytes, |
||||
ShardState: ssBytes, |
||||
}, |
||||
}, |
||||
} |
||||
} |
||||
|
||||
// MakeMessageFromRequest makes a message from the request
|
||||
func MakeMessageFromRequest(req *Request) *Message { |
||||
return &Message{ |
||||
ReqOrResp: &Message_Req{ |
||||
Req: req, |
||||
}, |
||||
} |
||||
} |
||||
|
||||
func makeMessageFromResponse(resp *Response) *Message { |
||||
return &Message{ |
||||
ReqOrResp: &Message_Resp{ |
||||
Resp: resp, |
||||
}, |
||||
} |
||||
} |
||||
|
||||
func hashesToBytes(hashes []common.Hash) [][]byte { |
||||
res := make([][]byte, 0, len(hashes)) |
||||
|
||||
for _, h := range hashes { |
||||
b := make([]byte, common.HashLength) |
||||
copy(b, h[:]) |
||||
res = append(res, b) |
||||
} |
||||
return res |
||||
} |
||||
|
||||
func bytesToHashes(bs [][]byte) []common.Hash { |
||||
res := make([]common.Hash, len(bs)) |
||||
|
||||
for _, b := range bs { |
||||
var h common.Hash |
||||
copy(h[:], b) |
||||
res = append(res, h) |
||||
} |
||||
return res |
||||
} |
@ -0,0 +1,3 @@ |
||||
package message |
||||
|
||||
//go:generate protoc msg.proto --go_out=.
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,80 @@ |
||||
syntax = "proto3"; |
||||
package harmony.stream.sync.message ; |
||||
|
||||
option go_package = "message"; |
||||
|
||||
message Message { |
||||
oneof req_or_resp { |
||||
Request req = 1; |
||||
Response resp = 2; |
||||
} |
||||
} |
||||
|
||||
message Request { |
||||
uint64 req_id = 1; |
||||
oneof request { |
||||
GetBlockNumberRequest get_block_number_request = 2; |
||||
GetBlockHashesRequest get_block_hashes_request = 3; |
||||
GetBlocksByNumRequest get_blocks_by_num_request = 4; |
||||
GetBlocksByHashesRequest get_blocks_by_hashes_request = 5; |
||||
GetEpochStateRequest get_epoch_state_request = 6; |
||||
} |
||||
} |
||||
|
||||
message GetBlockNumberRequest {} |
||||
|
||||
message GetBlockHashesRequest { |
||||
repeated uint64 nums = 1 [packed=true]; |
||||
} |
||||
|
||||
message GetBlocksByNumRequest { |
||||
repeated uint64 nums = 1 [packed=true]; |
||||
} |
||||
|
||||
message GetBlocksByHashesRequest { |
||||
repeated bytes block_hashes = 1; |
||||
} |
||||
|
||||
message GetEpochStateRequest { |
||||
uint64 epoch = 1; |
||||
} |
||||
|
||||
message Response { |
||||
uint64 req_id = 1; |
||||
oneof response { |
||||
ErrorResponse error_response = 2; |
||||
GetBlockNumberResponse get_block_number_response = 3; |
||||
GetBlockHashesResponse get_block_hashes_response = 4; |
||||
GetBlocksByNumResponse get_blocks_by_num_response = 5; |
||||
GetBlocksByHashesResponse get_blocks_by_hashes_response = 6; |
||||
GetEpochStateResponse get_epoch_state_response = 7; |
||||
} |
||||
} |
||||
|
||||
message ErrorResponse { |
||||
string error = 1; |
||||
} |
||||
|
||||
message GetBlockNumberResponse { |
||||
uint64 number = 1; |
||||
} |
||||
|
||||
message GetBlockHashesResponse { |
||||
repeated bytes hashes = 1; |
||||
} |
||||
|
||||
message GetBlocksByNumResponse { |
||||
repeated bytes blocks_bytes = 1; |
||||
} |
||||
|
||||
message GetBlocksByHashesResponse { |
||||
repeated bytes blocks_bytes = 1; |
||||
} |
||||
|
||||
message GetEpochStateResponse { |
||||
bytes header_bytes = 1; |
||||
bytes shard_state = 2; |
||||
} |
||||
|
||||
|
||||
|
@ -0,0 +1,97 @@ |
||||
package message |
||||
|
||||
import ( |
||||
"fmt" |
||||
|
||||
"github.com/pkg/errors" |
||||
) |
||||
|
||||
// ResponseError is the error from an error response
|
||||
type ResponseError struct { |
||||
msg string |
||||
} |
||||
|
||||
// Error is the error string of ResponseError
|
||||
func (err *ResponseError) Error() string { |
||||
return fmt.Sprintf("[RESPONSE] %v", err.msg) |
||||
} |
||||
|
||||
// GetBlockNumberResponse parse the message to GetBlockNumberResponse
|
||||
func (msg *Message) GetBlockNumberResponse() (*GetBlockNumberResponse, error) { |
||||
resp := msg.GetResp() |
||||
if resp == nil { |
||||
return nil, errors.New("not response message") |
||||
} |
||||
if errResp := resp.GetErrorResponse(); errResp != nil { |
||||
return nil, &ResponseError{errResp.Error} |
||||
} |
||||
bnResp := resp.GetGetBlockNumberResponse() |
||||
if bnResp == nil { |
||||
return nil, errors.New("not GetBlockNumber response") |
||||
} |
||||
return bnResp, nil |
||||
} |
||||
|
||||
// GetBlockHashesResponse parse the message to GetBlockHashesResponse
|
||||
func (msg *Message) GetBlockHashesResponse() (*GetBlockHashesResponse, error) { |
||||
resp := msg.GetResp() |
||||
if resp == nil { |
||||
return nil, errors.New("not response message") |
||||
} |
||||
if errResp := resp.GetErrorResponse(); errResp != nil { |
||||
return nil, &ResponseError{errResp.Error} |
||||
} |
||||
ghResp := resp.GetGetBlockHashesResponse() |
||||
if ghResp == nil { |
||||
return nil, errors.New("not GetBlockHashesResponse") |
||||
} |
||||
return ghResp, nil |
||||
} |
||||
|
||||
// GetBlocksByNumberResponse parse the message to GetBlocksByNumberResponse
|
||||
func (msg *Message) GetBlocksByNumberResponse() (*GetBlocksByNumResponse, error) { |
||||
resp := msg.GetResp() |
||||
if resp == nil { |
||||
return nil, errors.New("not response message") |
||||
} |
||||
if errResp := resp.GetErrorResponse(); errResp != nil { |
||||
return nil, &ResponseError{errResp.Error} |
||||
} |
||||
gbResp := resp.GetGetBlocksByNumResponse() |
||||
if gbResp == nil { |
||||
return nil, errors.New("not GetBlocksByNumResponse") |
||||
} |
||||
return gbResp, nil |
||||
} |
||||
|
||||
// GetBlocksByHashesResponse parse the message to GetBlocksByHashesResponse
|
||||
func (msg *Message) GetBlocksByHashesResponse() (*GetBlocksByHashesResponse, error) { |
||||
resp := msg.GetResp() |
||||
if resp == nil { |
||||
return nil, errors.New("not response message") |
||||
} |
||||
if errResp := resp.GetErrorResponse(); errResp != nil { |
||||
return nil, &ResponseError{errResp.Error} |
||||
} |
||||
gbResp := resp.GetGetBlocksByHashesResponse() |
||||
if gbResp == nil { |
||||
return nil, errors.New("not GetBlocksByHashesResponse") |
||||
} |
||||
return gbResp, nil |
||||
} |
||||
|
||||
// GetEpochStateResponse parse the message to GetEpochStateResponse
|
||||
func (msg *Message) GetEpochStateResponse() (*GetEpochStateResponse, error) { |
||||
resp := msg.GetResp() |
||||
if resp == nil { |
||||
return nil, errors.New("not response message") |
||||
} |
||||
if errResp := resp.GetErrorResponse(); errResp != nil { |
||||
return nil, &ResponseError{errResp.Error} |
||||
} |
||||
gesResp := resp.GetGetEpochStateResponse() |
||||
if gesResp == nil { |
||||
return nil, errors.New("not GetEpochStateResponse") |
||||
} |
||||
return gesResp, nil |
||||
} |
Loading…
Reference in new issue