eth: return rlp-decoded values from debug_storageRangeAt (#15476)

Fixes #15196
This commit is contained in:
Benoit Verkindt 2017-12-06 07:42:16 -08:00 committed by Felix Lange
parent e85b68ef53
commit eab2201f80
2 changed files with 12 additions and 5 deletions

View File

@ -615,14 +615,18 @@ func (api *PrivateDebugAPI) StorageRangeAt(ctx context.Context, blockHash common
if st == nil { if st == nil {
return StorageRangeResult{}, fmt.Errorf("account %x doesn't exist", contractAddress) return StorageRangeResult{}, fmt.Errorf("account %x doesn't exist", contractAddress)
} }
return storageRangeAt(st, keyStart, maxResult), nil return storageRangeAt(st, keyStart, maxResult)
} }
func storageRangeAt(st state.Trie, start []byte, maxResult int) StorageRangeResult { func storageRangeAt(st state.Trie, start []byte, maxResult int) (StorageRangeResult, error) {
it := trie.NewIterator(st.NodeIterator(start)) it := trie.NewIterator(st.NodeIterator(start))
result := StorageRangeResult{Storage: storageMap{}} result := StorageRangeResult{Storage: storageMap{}}
for i := 0; i < maxResult && it.Next(); i++ { for i := 0; i < maxResult && it.Next(); i++ {
e := storageEntry{Value: common.BytesToHash(it.Value)} _, content, _, err := rlp.Split(it.Value)
if err != nil {
return StorageRangeResult{}, err
}
e := storageEntry{Value: common.BytesToHash(content)}
if preimage := st.GetKey(it.Key); preimage != nil { if preimage := st.GetKey(it.Key); preimage != nil {
preimage := common.BytesToHash(preimage) preimage := common.BytesToHash(preimage)
e.Key = &preimage e.Key = &preimage
@ -634,7 +638,7 @@ func storageRangeAt(st state.Trie, start []byte, maxResult int) StorageRangeResu
next := common.BytesToHash(it.Key) next := common.BytesToHash(it.Key)
result.NextKey = &next result.NextKey = &next
} }
return result return result, nil
} }
// GetModifiedAccountsByumber returns all accounts that have changed between the // GetModifiedAccountsByumber returns all accounts that have changed between the

View File

@ -79,7 +79,10 @@ func TestStorageRangeAt(t *testing.T) {
}, },
} }
for _, test := range tests { for _, test := range tests {
result := storageRangeAt(state.StorageTrie(addr), test.start, test.limit) result, err := storageRangeAt(state.StorageTrie(addr), test.start, test.limit)
if err != nil {
t.Error(err)
}
if !reflect.DeepEqual(result, test.want) { if !reflect.DeepEqual(result, test.want) {
t.Fatalf("wrong result for range 0x%x.., limit %d:\ngot %s\nwant %s", t.Fatalf("wrong result for range 0x%x.., limit %d:\ngot %s\nwant %s",
test.start, test.limit, dumper.Sdump(result), dumper.Sdump(&test.want)) test.start, test.limit, dumper.Sdump(result), dumper.Sdump(&test.want))