- package core
-
- import (
- "fmt"
- acm "github.com/tendermint/tendermint/account"
- . "github.com/tendermint/tendermint/common"
- ptypes "github.com/tendermint/tendermint/permission/types"
- ctypes "github.com/tendermint/tendermint/rpc/core/types"
- )
-
- func GenPrivAccount() (*acm.PrivAccount, error) {
- return acm.GenPrivAccount(), nil
- }
-
- func GetAccount(address []byte) (*acm.Account, error) {
- cache := mempoolReactor.Mempool.GetCache()
- account := cache.GetAccount(address)
- if account == nil {
- // XXX: shouldn't we return "account not found"?
- account = &acm.Account{
- Address: address,
- PubKey: nil,
- Sequence: 0,
- Balance: 0,
- Code: nil,
- StorageRoot: nil,
- Permissions: cache.GetAccount(ptypes.GlobalPermissionsAddress).Permissions,
- }
- }
- return account, nil
- }
-
- func GetStorage(address, key []byte) (*ctypes.ResponseGetStorage, error) {
- state := consensusState.GetState()
- account := state.GetAccount(address)
- if account == nil {
- return nil, fmt.Errorf("Unknown address: %X", address)
- }
- storageRoot := account.StorageRoot
- storageTree := state.LoadStorage(storageRoot)
-
- _, value := storageTree.Get(LeftPadWord256(key).Bytes())
- if value == nil {
- return &ctypes.ResponseGetStorage{key, nil}, nil
- }
- return &ctypes.ResponseGetStorage{key, value.([]byte)}, nil
- }
-
- func ListAccounts() (*ctypes.ResponseListAccounts, error) {
- var blockHeight int
- var accounts []*acm.Account
- state := consensusState.GetState()
- blockHeight = state.LastBlockHeight
- state.GetAccounts().Iterate(func(key interface{}, value interface{}) bool {
- accounts = append(accounts, value.(*acm.Account))
- return false
- })
- return &ctypes.ResponseListAccounts{blockHeight, accounts}, nil
- }
-
- func DumpStorage(address []byte) (*ctypes.ResponseDumpStorage, error) {
- state := consensusState.GetState()
- account := state.GetAccount(address)
- if account == nil {
- return nil, fmt.Errorf("Unknown address: %X", address)
- }
- storageRoot := account.StorageRoot
- storageTree := state.LoadStorage(storageRoot)
- storageItems := []ctypes.StorageItem{}
- storageTree.Iterate(func(key interface{}, value interface{}) bool {
- storageItems = append(storageItems, ctypes.StorageItem{
- key.([]byte), value.([]byte)})
- return false
- })
- return &ctypes.ResponseDumpStorage{storageRoot, storageItems}, nil
- }
|