From 889a5d7eb616cf4caf7e711f0d927868fe44232b Mon Sep 17 00:00:00 2001 From: Anna Shaleva Date: Tue, 21 Jul 2020 10:41:18 +0300 Subject: [PATCH] rpc: adjust `submitblock` RPC-call It should return block hash instead of boolean. --- pkg/rpc/client/rpc.go | 15 ++++++--------- pkg/rpc/client/rpc_test.go | 17 ++++++++++------- pkg/rpc/server/server.go | 4 +++- pkg/rpc/server/server_test.go | 6 +++--- 4 files changed, 22 insertions(+), 20 deletions(-) diff --git a/pkg/rpc/client/rpc.go b/pkg/rpc/client/rpc.go index 3bd80382e..0e1344d99 100644 --- a/pkg/rpc/client/rpc.go +++ b/pkg/rpc/client/rpc.go @@ -398,25 +398,22 @@ func (c *Client) SendRawTransaction(rawTX *transaction.Transaction) (util.Uint25 } // SubmitBlock broadcasts a raw block over the NEO network. -func (c *Client) SubmitBlock(b block.Block) error { +func (c *Client) SubmitBlock(b block.Block) (util.Uint256, error) { var ( params request.RawParams - resp bool + resp = new(result.RelayResult) ) buf := io.NewBufBinWriter() b.EncodeBinary(buf.BinWriter) if err := buf.Err; err != nil { - return err + return util.Uint256{}, err } params = request.NewRawParams(hex.EncodeToString(buf.Bytes())) - if err := c.performRequest("submitblock", params, &resp); err != nil { - return err + if err := c.performRequest("submitblock", params, resp); err != nil { + return util.Uint256{}, err } - if !resp { - return errors.New("submitblock returned false") - } - return nil + return resp.Hash, nil } // SignAndPushInvocationTx signs and pushes given script as an invocation diff --git a/pkg/rpc/client/rpc_test.go b/pkg/rpc/client/rpc_test.go index 64c890e8b..35e6e561c 100644 --- a/pkg/rpc/client/rpc_test.go +++ b/pkg/rpc/client/rpc_test.go @@ -716,16 +716,19 @@ var rpcClientTestCases = map[string][]rpcClientTestCase{ { name: "positive", invoke: func(c *Client) (interface{}, error) { - return nil, c.SubmitBlock(block.Block{ + return c.SubmitBlock(block.Block{ Base: block.Base{}, Transactions: nil, Trimmed: false, }) }, - serverResponse: `{"jsonrpc":"2.0","id":1,"result":true}`, + serverResponse: `{"jsonrpc":"2.0","id":1,"result":{"hash":"0x1bdea8f80eb5bd97fade38d5e7fb93b02c9d3e01394e9f4324218132293f7ea6"}}`, result: func(c *Client) interface{} { - // no error expected - return nil + h, err := util.Uint256DecodeStringLE("1bdea8f80eb5bd97fade38d5e7fb93b02c9d3e01394e9f4324218132293f7ea6") + if err != nil { + panic(fmt.Errorf("can't decode `submitblock` result hash: %v", err)) + } + return h }, }, }, @@ -840,7 +843,7 @@ var rpcClientErrorCases = map[string][]rpcClientErrorCase{ { name: "submitblock_bad_server_answer", invoke: func(c *Client) (interface{}, error) { - return nil, c.SubmitBlock(block.Block{ + return c.SubmitBlock(block.Block{ Base: block.Base{}, Transactions: nil, Trimmed: false, @@ -996,7 +999,7 @@ var rpcClientErrorCases = map[string][]rpcClientErrorCase{ { name: "submitblock_invalid_params_error", invoke: func(c *Client) (interface{}, error) { - return nil, c.SubmitBlock(block.Block{}) + return c.SubmitBlock(block.Block{}) }, }, { @@ -1178,7 +1181,7 @@ var rpcClientErrorCases = map[string][]rpcClientErrorCase{ { name: "submitblock_unmarshalling_error", invoke: func(c *Client) (interface{}, error) { - return nil, c.SubmitBlock(block.Block{ + return c.SubmitBlock(block.Block{ Base: block.Base{}, Transactions: nil, Trimmed: false, diff --git a/pkg/rpc/server/server.go b/pkg/rpc/server/server.go index 999b40c30..bac1dfeb8 100644 --- a/pkg/rpc/server/server.go +++ b/pkg/rpc/server/server.go @@ -902,7 +902,9 @@ func (s *Server) submitBlock(reqParams request.Params) (interface{}, *response.E return nil, response.ErrValidationFailed } } - return true, nil + return &result.RelayResult{ + Hash: b.Hash(), + }, nil } func (s *Server) sendrawtransaction(reqParams request.Params) (interface{}, *response.Error) { diff --git a/pkg/rpc/server/server_test.go b/pkg/rpc/server/server_test.go index bbf257017..b41b08eba 100644 --- a/pkg/rpc/server/server_test.go +++ b/pkg/rpc/server/server_test.go @@ -760,9 +760,9 @@ func testRPCProtocol(t *testing.T, doRPCCall func(string, string, *testing.T) [] b := newBlock(t, chain, 1, 0, newTx()) body := doRPCCall(fmt.Sprintf(rpc, encodeBlock(t, b)), httpSrv.URL, t) data := checkErrGetResult(t, body, false) - var res bool - require.NoError(t, json.Unmarshal(data, &res)) - require.True(t, res) + var res = new(result.RelayResult) + require.NoError(t, json.Unmarshal(data, res)) + require.Equal(t, b.Hash(), res.Hash) }) })