From 272bb03e3b1f05925a510e7c1140db96e389710d Mon Sep 17 00:00:00 2001 From: Roman Khimov Date: Sun, 7 Feb 2021 18:27:19 +0300 Subject: [PATCH] rpc: use base64 for getstorage in/out See neo-project/neo#484. --- pkg/rpc/client/rpc.go | 14 +++++--------- pkg/rpc/client/rpc_test.go | 4 ++-- pkg/rpc/server/server.go | 9 ++++----- pkg/rpc/server/server_test.go | 9 ++++----- 4 files changed, 15 insertions(+), 21 deletions(-) diff --git a/pkg/rpc/client/rpc.go b/pkg/rpc/client/rpc.go index 2f51150ab..db770ed01 100644 --- a/pkg/rpc/client/rpc.go +++ b/pkg/rpc/client/rpc.go @@ -1,7 +1,7 @@ package client import ( - "encoding/hex" + "encoding/base64" "errors" "fmt" @@ -340,24 +340,20 @@ func (c *Client) GetRawTransactionVerbose(hash util.Uint256) (*result.Transactio // GetStorageByID returns the stored value, according to the contract ID and the stored key. func (c *Client) GetStorageByID(id int32, key []byte) ([]byte, error) { - return c.getStorage(request.NewRawParams(id, hex.EncodeToString(key))) + return c.getStorage(request.NewRawParams(id, base64.StdEncoding.EncodeToString(key))) } // GetStorageByHash returns the stored value, according to the contract script hash and the stored key. func (c *Client) GetStorageByHash(hash util.Uint160, key []byte) ([]byte, error) { - return c.getStorage(request.NewRawParams(hash.StringLE(), hex.EncodeToString(key))) + return c.getStorage(request.NewRawParams(hash.StringLE(), base64.StdEncoding.EncodeToString(key))) } func (c *Client) getStorage(params request.RawParams) ([]byte, error) { - var resp string + var resp []byte if err := c.performRequest("getstorage", params, &resp); err != nil { return nil, err } - res, err := hex.DecodeString(resp) - if err != nil { - return nil, err - } - return res, nil + return resp, nil } // GetTransactionHeight returns the block index in which the transaction is found. diff --git a/pkg/rpc/client/rpc_test.go b/pkg/rpc/client/rpc_test.go index a0d01a6a4..7ce216104 100644 --- a/pkg/rpc/client/rpc_test.go +++ b/pkg/rpc/client/rpc_test.go @@ -595,7 +595,7 @@ var rpcClientTestCases = map[string][]rpcClientTestCase{ } return c.GetStorageByHash(hash, key) }, - serverResponse: `{"jsonrpc":"2.0","id":1,"result":"4c696e"}`, + serverResponse: `{"jsonrpc":"2.0","id":1,"result":"TGlu"}`, result: func(c *Client) interface{} { value, err := hex.DecodeString("4c696e") if err != nil { @@ -613,7 +613,7 @@ var rpcClientTestCases = map[string][]rpcClientTestCase{ } return c.GetStorageByID(-1, key) }, - serverResponse: `{"jsonrpc":"2.0","id":1,"result":"4c696e"}`, + serverResponse: `{"jsonrpc":"2.0","id":1,"result":"TGlu"}`, result: func(c *Client) interface{} { value, err := hex.DecodeString("4c696e") if err != nil { diff --git a/pkg/rpc/server/server.go b/pkg/rpc/server/server.go index 6e1ca675e..bf1e293d3 100644 --- a/pkg/rpc/server/server.go +++ b/pkg/rpc/server/server.go @@ -4,7 +4,6 @@ import ( "context" "crypto/elliptic" "encoding/binary" - "encoding/hex" "encoding/json" "errors" "fmt" @@ -29,12 +28,12 @@ import ( "github.com/nspcc-dev/neo-go/pkg/encoding/address" "github.com/nspcc-dev/neo-go/pkg/io" "github.com/nspcc-dev/neo-go/pkg/network" - "github.com/nspcc-dev/neo-go/pkg/services/oracle" - "github.com/nspcc-dev/neo-go/pkg/services/oracle/broadcaster" "github.com/nspcc-dev/neo-go/pkg/rpc" "github.com/nspcc-dev/neo-go/pkg/rpc/request" "github.com/nspcc-dev/neo-go/pkg/rpc/response" "github.com/nspcc-dev/neo-go/pkg/rpc/response/result" + "github.com/nspcc-dev/neo-go/pkg/services/oracle" + "github.com/nspcc-dev/neo-go/pkg/services/oracle/broadcaster" "github.com/nspcc-dev/neo-go/pkg/smartcontract/callflag" "github.com/nspcc-dev/neo-go/pkg/smartcontract/manifest" "github.com/nspcc-dev/neo-go/pkg/smartcontract/trigger" @@ -910,7 +909,7 @@ func (s *Server) getStorage(ps request.Params) (interface{}, *response.Error) { return nil, rErr } - key, err := ps.Value(1).GetBytesHex() + key, err := ps.Value(1).GetBytesBase64() if err != nil { return nil, response.ErrInvalidParams } @@ -920,7 +919,7 @@ func (s *Server) getStorage(ps request.Params) (interface{}, *response.Error) { return "", nil } - return hex.EncodeToString(item.Value), nil + return item.Value, nil } func (s *Server) getrawtransaction(reqParams request.Params) (interface{}, *response.Error) { diff --git a/pkg/rpc/server/server_test.go b/pkg/rpc/server/server_test.go index b99011ef4..3479147c2 100644 --- a/pkg/rpc/server/server_test.go +++ b/pkg/rpc/server/server_test.go @@ -3,7 +3,6 @@ package server import ( "bytes" "encoding/base64" - "encoding/hex" "encoding/json" "fmt" "io/ioutil" @@ -346,15 +345,15 @@ var rpcTestCases = map[string][]rpcTestCase{ "getstorage": { { name: "positive", - params: fmt.Sprintf(`["%s", "746573746b6579"]`, testContractHash), + params: fmt.Sprintf(`["%s", "dGVzdGtleQ=="]`, testContractHash), result: func(e *executor) interface{} { - v := hex.EncodeToString([]byte("testvalue")) + v := base64.StdEncoding.EncodeToString([]byte("testvalue")) return &v }, }, { name: "missing key", - params: fmt.Sprintf(`["%s", "7465"]`, testContractHash), + params: fmt.Sprintf(`["%s", "dGU="]`, testContractHash), result: func(e *executor) interface{} { v := "" return &v @@ -377,7 +376,7 @@ var rpcTestCases = map[string][]rpcTestCase{ }, { name: "invalid key", - params: fmt.Sprintf(`["%s", "notahex"]`, testContractHash), + params: fmt.Sprintf(`["%s", "notabase64$"]`, testContractHash), fail: true, }, },