forked from TrueCloudLab/neoneo-go
rpc/server: implement getstateroot RPC
This commit is contained in:
parent
1869d6d460
commit
4de22247d5
2 changed files with 52 additions and 0 deletions
|
@ -100,6 +100,7 @@ var rpcHandlers = map[string]func(*Server, request.Params) (interface{}, *respon
|
||||||
"getpeers": (*Server).getPeers,
|
"getpeers": (*Server).getPeers,
|
||||||
"getrawmempool": (*Server).getRawMempool,
|
"getrawmempool": (*Server).getRawMempool,
|
||||||
"getrawtransaction": (*Server).getrawtransaction,
|
"getrawtransaction": (*Server).getrawtransaction,
|
||||||
|
"getstateroot": (*Server).getStateRoot,
|
||||||
"getstorage": (*Server).getStorage,
|
"getstorage": (*Server).getStorage,
|
||||||
"gettransactionheight": (*Server).getTransactionHeight,
|
"gettransactionheight": (*Server).getTransactionHeight,
|
||||||
"getunclaimedgas": (*Server).getUnclaimedGas,
|
"getunclaimedgas": (*Server).getUnclaimedGas,
|
||||||
|
@ -773,6 +774,28 @@ func (s *Server) contractScriptHashFromParam(param *request.Param) (util.Uint160
|
||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Server) getStateRoot(ps request.Params) (interface{}, *response.Error) {
|
||||||
|
p := ps.Value(0)
|
||||||
|
if p == nil {
|
||||||
|
return nil, response.NewRPCError("Invalid parameter.", "", nil)
|
||||||
|
}
|
||||||
|
var rt *state.MPTRootState
|
||||||
|
var h util.Uint256
|
||||||
|
height, err := p.GetInt()
|
||||||
|
if err == nil {
|
||||||
|
rt, err = s.chain.GetStateRoot(uint32(height))
|
||||||
|
} else if h, err = p.GetUint256(); err == nil {
|
||||||
|
hdr, err := s.chain.GetHeader(h)
|
||||||
|
if err == nil {
|
||||||
|
rt, err = s.chain.GetStateRoot(hdr.Index)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return nil, response.NewRPCError("Unknown state root.", "", err)
|
||||||
|
}
|
||||||
|
return rt, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (s *Server) getStorage(ps request.Params) (interface{}, *response.Error) {
|
func (s *Server) getStorage(ps request.Params) (interface{}, *response.Error) {
|
||||||
id, rErr := s.contractIDFromParam(ps.Value(0))
|
id, rErr := s.contractIDFromParam(ps.Value(0))
|
||||||
if rErr == response.ErrUnknown {
|
if rErr == response.ErrUnknown {
|
||||||
|
|
|
@ -285,6 +285,18 @@ var rpcTestCases = map[string][]rpcTestCase{
|
||||||
check: checkNep5Transfers,
|
check: checkNep5Transfers,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"getstateroot": {
|
||||||
|
{
|
||||||
|
name: "no params",
|
||||||
|
params: `[]`,
|
||||||
|
fail: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "invalid hash",
|
||||||
|
params: `["0x1234567890"]`,
|
||||||
|
fail: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
"getstorage": {
|
"getstorage": {
|
||||||
{
|
{
|
||||||
name: "positive",
|
name: "positive",
|
||||||
|
@ -985,6 +997,23 @@ func testRPCProtocol(t *testing.T, doRPCCall func(string, string, *testing.T) []
|
||||||
require.Equal(t, b.Hash(), res.Hash)
|
require.Equal(t, b.Hash(), res.Hash)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
t.Run("getstateroot", func(t *testing.T) {
|
||||||
|
testRoot := func(t *testing.T, p string) {
|
||||||
|
rpc := fmt.Sprintf(`{"jsonrpc": "2.0", "id": 1, "method": "getstateroot", "params": [%s]}`, p)
|
||||||
|
body := doRPCCall(rpc, httpSrv.URL, t)
|
||||||
|
rawRes := checkErrGetResult(t, body, false)
|
||||||
|
|
||||||
|
res := new(state.MPTRootState)
|
||||||
|
require.NoError(t, json.Unmarshal(rawRes, res))
|
||||||
|
require.NotEqual(t, util.Uint256{}, res.Root) // be sure this test uses valid height
|
||||||
|
|
||||||
|
expected, err := e.chain.GetStateRoot(5)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Equal(t, expected, res)
|
||||||
|
}
|
||||||
|
t.Run("ByHeight", func(t *testing.T) { testRoot(t, strconv.FormatInt(5, 10)) })
|
||||||
|
t.Run("ByHash", func(t *testing.T) { testRoot(t, `"`+chain.GetHeaderHash(5).StringLE()+`"`) })
|
||||||
|
})
|
||||||
|
|
||||||
t.Run("getrawtransaction", func(t *testing.T) {
|
t.Run("getrawtransaction", func(t *testing.T) {
|
||||||
block, _ := chain.GetBlock(chain.GetHeaderHash(0))
|
block, _ := chain.GetBlock(chain.GetHeaderHash(0))
|
||||||
|
|
Loading…
Reference in a new issue