From 93ca65eebec78bd43a1aea0dcae17038c52fc9c3 Mon Sep 17 00:00:00 2001 From: Benjamin Bollen <ben@erisindustries.com> Date: Sun, 18 Sep 2016 21:41:11 +0200 Subject: [PATCH] client: DumpStorage; rpc/tendermint: util to unwrap to core types, preventing exposure of internal types to client --- client/client.go | 20 +++++++-- rpc/tendermint/core/types/responses_util.go | 45 +++++++++++++++++++++ 2 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 rpc/tendermint/core/types/responses_util.go diff --git a/client/client.go b/client/client.go index d2674c01..fb0de81f 100644 --- a/client/client.go +++ b/client/client.go @@ -23,7 +23,9 @@ import ( acc "github.com/eris-ltd/eris-db/account" tendermint_client "github.com/eris-ltd/eris-db/rpc/tendermint/client" + tendermint_types "github.com/eris-ltd/eris-db/rpc/tendermint/core/types" "github.com/eris-ltd/eris-db/txs" + core_types "github.com/eris-ltd/eris-db/core/types" ) type NodeClient interface { @@ -137,9 +139,18 @@ func (erisNodeClient *ErisNodeClient) GetAccount(address []byte) (*acc.Account, return account.Copy(), nil } -// DumpStorage -func (erisNodeClient *ErisNodeClient) DumpStorage(address []byte) (storageRoot []byte) +// DumpStorage returns the full storage for an account. +func (erisNodeClient *ErisNodeClient) DumpStorage(address []byte) (*core_types.Storage) { + client := rpcclient.NewClientURI(erisNodeClient.broadcastRPC) + resultStorage, err := tendermint_client.DumpStorage(client, address) + if err != nil { + } + // UnwrapResultDumpStorage is an inefficient full deep copy, + // to transform the type to /core/types.Storage + // TODO: removing go-wire and go-rpc allows us to collapse these types + return tendermint_types.UnwrapResultDumpStorage(resultStorage) +} //-------------------------------------------------------------------------------------------- // Name registry @@ -153,9 +164,12 @@ func (erisNodeClient *ErisNodeClient) GetName(name string) (owner []byte, data [ return nil, nil, 0, err } // unwrap return results - owner = *entryResult.Owner + owner = make([]byte, len(entryResult.Owner)) + copy(owner, entryResult.Owner) data = []byte(entryResult.Data) expirationBlock = entryResult.Expires return } + + diff --git a/rpc/tendermint/core/types/responses_util.go b/rpc/tendermint/core/types/responses_util.go new file mode 100644 index 00000000..b41d738d --- /dev/null +++ b/rpc/tendermint/core/types/responses_util.go @@ -0,0 +1,45 @@ +// Copyright 2015, 2016 Eris Industries (UK) Ltd. +// This file is part of Eris-RT + +// Eris-RT is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Eris-RT is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Eris-RT. If not, see <http://www.gnu.org/licenses/>. + +package core_types + +import ( + "github.com/eris-ltd/eris-db/core/types" +) + +// UnwrapResultDumpStorage does a deep copy to remove /rpc/tendermint/core/types +// and expose /core/types instead. This is largely an artefact to be removed once +// go-wire and go-rpc are deprecated. +// This is not an efficient code, especially given Storage can be big. +func UnwrapResultDumpStorage(result *ResultDumpStorage) (*types.Storage) { + storageRoot := make([]byte, len(result.StorageRoot)) + copy(storageRoot, result.StorageRoot) + storageItems := make([]types.StorageItem, len(result.StorageItems)) + for i, item := range result.StorageItems { + key := make([]byte, len(item.Key)) + value := make([]byte, len(item.Value)) + copy(key, item.Key) + copy(value, item.Value) + storageItems[i] = types.StorageItem{ + Key: key, + Value: value, + } + } + return &types.Storage{ + StorageRoot: storageRoot, + StorageItems: storageItems, + } +} -- GitLab