diff --git a/rpc/core/accounts.go b/rpc/core/accounts.go index 1d1fce95a..abf208897 100644 --- a/rpc/core/accounts.go +++ b/rpc/core/accounts.go @@ -1,24 +1,19 @@ package core import ( + "fmt" "github.com/tendermint/tendermint2/account" ) -//----------------------------------------------------------------------------- - func GenPrivAccount() (*ResponseGenPrivAccount, error) { return &ResponseGenPrivAccount{account.GenPrivAccount()}, nil } -//----------------------------------------------------------------------------- - -func GetAccount(address []byte) (*ResponseGetAccount, error) { +func GetAccount(addr []byte) (*ResponseGetAccount, error) { cache := mempoolReactor.Mempool.GetCache() - return &ResponseGetAccount{cache.GetAccount(address)}, nil + return &ResponseGetAccount{cache.GetAccount(addr)}, nil } -//----------------------------------------------------------------------------- - func ListAccounts() (*ResponseListAccounts, error) { var blockHeight uint var accounts []*account.Account @@ -30,3 +25,20 @@ func ListAccounts() (*ResponseListAccounts, error) { }) return &ResponseListAccounts{blockHeight, accounts}, nil } + +func DumpStorage(addr []byte) (*ResponseDumpStorage, error) { + state := consensusState.GetState() + account := state.GetAccount(addr) + if account == nil { + return nil, fmt.Errorf("Unknown address: %X", addr) + } + storageRoot := account.StorageRoot + storage := state.LoadStorage(storageRoot) + storageItems := []StorageItem{} + storage.Iterate(func(key interface{}, value interface{}) bool { + storageItems = append(storageItems, StorageItem{ + key.([]byte), value.([]byte)}) + return false + }) + return &ResponseDumpStorage{storageRoot, storageItems}, nil +} diff --git a/rpc/core/responses.go b/rpc/core/responses.go index 6a1ac5824..a3ef7739b 100644 --- a/rpc/core/responses.go +++ b/rpc/core/responses.go @@ -19,6 +19,16 @@ type ResponseListAccounts struct { Accounts []*account.Account } +type StorageItem struct { + Key []byte + Value []byte +} + +type ResponseDumpStorage struct { + StorageRoot []byte + StorageItems []StorageItem +} + type ResponseBlockchainInfo struct { LastHeight uint BlockMetas []*types.BlockMeta diff --git a/rpc/handlers.go b/rpc/handlers.go index 925dbe930..858786024 100644 --- a/rpc/handlers.go +++ b/rpc/handlers.go @@ -23,6 +23,7 @@ var funcMap = map[string]*FuncWrapper{ "get_block": funcWrap(core.GetBlock, []string{"height"}), "get_account": funcWrap(core.GetAccount, []string{"address"}), "list_validators": funcWrap(core.ListValidators, []string{}), + "dump_storage": funcWrap(core.DumpStorage, []string{"address"}), "broadcast_tx": funcWrap(core.BroadcastTx, []string{"tx"}), "list_accounts": funcWrap(core.ListAccounts, []string{}), "unsafe/gen_priv_account": funcWrap(core.GenPrivAccount, []string{}),