diff --git a/docs/rpc.md b/docs/rpc.md index af0c14b98..901bd06ca 100644 --- a/docs/rpc.md +++ b/docs/rpc.md @@ -95,10 +95,17 @@ it only works for native contracts. VM state is included to verbose response along with other transaction fields if the transaction is already on chain. +##### `getstateroot` + +This method is able to accept state root hash instead of index, unlike the C# node +where only index is accepted. + ##### `getstorage` This method doesn't work for the Ledger contract, you can get data via regular -`getblock` and `getrawtransaction` calls. +`getblock` and `getrawtransaction` calls. This method is able to get storage of +the native contract by its name (case-insensitive), unlike the C# node where +it only possible for index or hash. #### `getnep17balances` diff --git a/pkg/rpc/server/server.go b/pkg/rpc/server/server.go index a1ee03739..c8e23a9ce 100644 --- a/pkg/rpc/server/server.go +++ b/pkg/rpc/server/server.go @@ -459,22 +459,18 @@ func (s *Server) getConnectionCount(_ request.Params) (interface{}, *response.Er } func (s *Server) blockHashFromParam(param *request.Param) (util.Uint256, *response.Error) { - var hash util.Uint256 - + var ( + hash util.Uint256 + err error + ) if param == nil { return hash, response.ErrInvalidParams } - if _, err := param.GetStringStrict(); err == nil { - var err error - hash, err = param.GetUint256() - if err != nil { - return hash, response.ErrInvalidParams - } - } else { - num, err := s.blockHeightFromParam(param) - if err != nil { - return hash, response.ErrInvalidParams + if hash, err = param.GetUint256(); err != nil { + num, respErr := s.blockHeightFromParam(param) + if respErr != nil { + return hash, respErr } hash = s.chain.GetHeaderHash(num) } @@ -921,32 +917,28 @@ func (s *Server) contractScriptHashFromParam(param *request.Param) (util.Uint160 if param == nil { return result, response.ErrInvalidParams } - if _, err := param.GetStringStrict(); err == nil { - var err error - result, err = param.GetUint160FromAddressOrHex() - if err == nil { - return result, nil - } - name, err := param.GetString() - if err != nil { - return result, response.ErrInvalidParams - } - result, err = s.chain.GetNativeContractScriptHash(name) - if err != nil { - return result, response.NewRPCError("Unknown contract: querying by name is supported for native contracts only", "", nil) - } - } else { - id, err := param.GetInt() - if err != nil { - return result, response.ErrInvalidParams - } - if err := checkInt32(id); err != nil { - return result, response.WrapErrorWithData(response.ErrInvalidParams, err) - } - result, err = s.chain.GetContractScriptHash(int32(id)) - if err != nil { - return result, response.NewRPCError("Unknown contract", "", err) - } + nameOrHashOrIndex, err := param.GetString() + if err != nil { + return result, response.ErrInvalidParams + } + result, err = param.GetUint160FromAddressOrHex() + if err == nil { + return result, nil + } + result, err = s.chain.GetNativeContractScriptHash(nameOrHashOrIndex) + if err == nil { + return result, nil + } + id, err := strconv.Atoi(nameOrHashOrIndex) + if err != nil { + return result, response.NewRPCError("Unknown contract", "", err) + } + if err := checkInt32(id); err != nil { + return result, response.WrapErrorWithData(response.ErrInvalidParams, err) + } + result, err = s.chain.GetContractScriptHash(int32(id)) + if err != nil { + return result, response.NewRPCError("Unknown contract", "", err) } return result, nil } @@ -1176,7 +1168,7 @@ func (s *Server) getStateRoot(ps request.Params) (interface{}, *response.Error) } var rt *state.MPTRoot var h util.Uint256 - height, err := p.GetInt() + height, err := p.GetIntStrict() if err == nil { if err := checkUint32(height); err != nil { return nil, response.WrapErrorWithData(response.ErrInvalidParams, err) @@ -1557,10 +1549,7 @@ func (s *Server) submitNotaryRequest(ps request.Params) (interface{}, *response. return nil, response.NewInternalServerError("P2PNotaryRequest was received, but P2PSignatureExtensions are disabled", nil) } - if len(ps) < 1 { - return nil, response.NewInvalidParamsError("not enough parameters", nil) - } - bytePayload, err := ps[0].GetBytesBase64() + bytePayload, err := ps.Value(0).GetBytesBase64() if err != nil { return nil, response.NewInvalidParamsError("not base64", err) }