From 55fb221bbb9c6ab65915a6406c99e304955a6c25 Mon Sep 17 00:00:00 2001 From: Anna Shaleva Date: Fri, 15 Oct 2021 07:01:47 +0300 Subject: [PATCH 1/2] rpc: make `getproof` work with destroyed contracts Now it's able to get proof for destroyed contract if the contract wasn't destroyed before the requested stateroot's height. --- pkg/rpc/server/server.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/rpc/server/server.go b/pkg/rpc/server/server.go index ab9ac6ce1..fe7c06487 100644 --- a/pkg/rpc/server/server.go +++ b/pkg/rpc/server/server.go @@ -991,9 +991,9 @@ func (s *Server) getProof(ps request.Params) (interface{}, *response.Error) { if err != nil { return nil, response.ErrInvalidParams } - cs := s.chain.GetContractState(sc) - if cs == nil { - return nil, response.ErrInvalidParams + cs, respErr := s.getHistoricalContractState(root, sc) + if respErr != nil { + return nil, respErr } skey := makeStorageKey(cs.ID, key) proof, err := s.chain.GetStateModule().GetStateProof(root, skey) From 002b5a2c3c3d03898185ef4fa860ebfc6f932d52 Mon Sep 17 00:00:00 2001 From: Anna Shaleva Date: Fri, 15 Oct 2021 08:00:16 +0300 Subject: [PATCH 2/2] core: add Trie.Find compatibility test --- pkg/core/mpt/compat_test.go | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/pkg/core/mpt/compat_test.go b/pkg/core/mpt/compat_test.go index bcd9be184..742ad306e 100644 --- a/pkg/core/mpt/compat_test.go +++ b/pkg/core/mpt/compat_test.go @@ -406,4 +406,38 @@ func TestCompatibility_Find(t *testing.T) { t.Run("from matching start", func(t *testing.T) { check(t, []byte{}, 2) // without `from` key }) + t.Run("TestFindStatesIssue652", func(t *testing.T) { + tr := NewTrie(nil, false, newTestStore()) + // root is an extension node with key=abc; next=branch + require.NoError(t, tr.Put([]byte("abc1"), []byte("01"))) + require.NoError(t, tr.Put([]byte("abc3"), []byte("02"))) + tr.Flush() + // find items with extension's key prefix + t.Run("from > start", func(t *testing.T) { + res, err := tr.Find([]byte("ab"), []byte("d2"), 100) + require.NoError(t, err) + // nothing should be found, because from[0]=`d` > key[2]=`c` + require.Equal(t, 0, len(res)) + }) + + t.Run("from < start", func(t *testing.T) { + res, err := tr.Find([]byte("ab"), []byte("b2"), 100) + require.NoError(t, err) + // all items should be included into the result, because from[0]=`b` < key[2]=`c` + require.Equal(t, 2, len(res)) + }) + + t.Run("from and start have common prefix", func(t *testing.T) { + res, err := tr.Find([]byte("ab"), []byte("c"), 100) + require.NoError(t, err) + // all items should be included into the result, because from[0] == key[2] + require.Equal(t, 2, len(res)) + }) + + t.Run("from equals to item key", func(t *testing.T) { + res, err := tr.Find([]byte("ab"), []byte("c1"), 100) + require.NoError(t, err) + require.Equal(t, 1, len(res)) + }) + }) }