From cac5416216889dd47a3f73483d0520ad0259f236 Mon Sep 17 00:00:00 2001 From: Silas Davis <silas@monax.io> Date: Tue, 12 Jun 2018 15:59:39 +0100 Subject: [PATCH] Rename NameReg and make more canonical Signed-off-by: Silas Davis <silas@monax.io> --- execution/execution.go | 4 +- execution/execution_test.go | 20 ++++---- execution/executors/call.go | 6 +-- execution/executors/name.go | 12 ++--- .../names/{namereg_cache.go => cache.go} | 48 ++++++++--------- .../{namereg_cache_test.go => cache_test.go} | 0 execution/names/namereg.go | 51 ------------------- execution/names/names.go | 36 +++++++++++++ execution/state.go | 18 +++---- rpc/filters/namereg.go | 8 +-- rpc/result.go | 4 +- rpc/service.go | 12 ++--- rpc/tm/client/client.go | 2 +- rpc/tm/integration/shared.go | 2 +- rpc/tm/methods.go | 2 +- rpc/v0/methods.go | 2 +- 16 files changed, 106 insertions(+), 121 deletions(-) rename execution/names/{namereg_cache.go => cache.go} (66%) rename execution/names/{namereg_cache_test.go => cache_test.go} (100%) delete mode 100644 execution/names/namereg.go diff --git a/execution/execution.go b/execution/execution.go index 56d69d3b..74e6ce5f 100644 --- a/execution/execution.go +++ b/execution/execution.go @@ -61,7 +61,7 @@ type executor struct { runCall bool state *State stateCache state.Cache - nameRegCache *names.NameRegCache + nameRegCache *names.Cache eventCache *event.Cache logger *logging.Logger vmOptions []func(*evm.VM) @@ -93,7 +93,7 @@ func newExecutor(name string, runCall bool, backend *State, tip *bcm.Tip, publis state: backend, stateCache: state.NewCache(backend, state.Name(name)), eventCache: event.NewEventCache(publisher), - nameRegCache: names.NewNameRegCache(backend), + nameRegCache: names.NewCache(backend), logger: logger.With(structure.ComponentKey, "Executor"), } for _, option := range options { diff --git a/execution/execution_test.go b/execution/execution_test.go index d506f48e..93fb03b4 100644 --- a/execution/execution_test.go +++ b/execution/execution_test.go @@ -976,7 +976,7 @@ func TestNameTxs(t *testing.T) { } } - validateEntry := func(t *testing.T, entry *names.NameRegEntry, name, data string, addr crypto.Address, expires uint64) { + validateEntry := func(t *testing.T, entry *names.Entry, name, data string, addr crypto.Address, expires uint64) { if entry == nil { t.Fatalf("Could not find name %s", name) @@ -1005,7 +1005,7 @@ func TestNameTxs(t *testing.T) { if err := execTxWithState(state, txEnv); err != nil { t.Fatal(err) } - entry, err := state.GetNameRegEntry(name) + entry, err := state.GetNameEntry(name) require.NoError(t, err) validateEntry(t, entry, name, data, testPrivAccounts[0].Address(), startingBlock+numDesiredBlocks) @@ -1025,7 +1025,7 @@ func TestNameTxs(t *testing.T) { if err := execTxWithStateNewBlock(state, blockchain, txEnv); err != nil { t.Fatal(err) } - entry, err = state.GetNameRegEntry(name) + entry, err = state.GetNameEntry(name) require.NoError(t, err) validateEntry(t, entry, name, data, testPrivAccounts[0].Address(), startingBlock+numDesiredBlocks*2) @@ -1036,7 +1036,7 @@ func TestNameTxs(t *testing.T) { if err := execTxWithStateNewBlock(state, blockchain, txEnv); err != nil { t.Fatal(err) } - entry, err = state.GetNameRegEntry(name) + entry, err = state.GetNameEntry(name) require.NoError(t, err) validateEntry(t, entry, name, data, testPrivAccounts[0].Address(), startingBlock+numDesiredBlocks*3) @@ -1060,7 +1060,7 @@ func TestNameTxs(t *testing.T) { if err := execTxWithStateAndBlockchain(state, blockchain.Tip, txEnv); err != nil { t.Fatal(err) } - entry, err = state.GetNameRegEntry(name) + entry, err = state.GetNameEntry(name) require.NoError(t, err) validateEntry(t, entry, name, data, testPrivAccounts[1].Address(), blockchain.LastBlockHeight()+numDesiredBlocks) @@ -1075,7 +1075,7 @@ func TestNameTxs(t *testing.T) { if err := execTxWithStateAndBlockchain(state, blockchain.Tip, txEnv); err != nil { t.Fatal(err) } - entry, err = state.GetNameRegEntry(name) + entry, err = state.GetNameEntry(name) require.NoError(t, err) validateEntry(t, entry, name, data, testPrivAccounts[1].Address(), blockchain.LastBlockHeight()+numDesiredBlocks) @@ -1088,7 +1088,7 @@ func TestNameTxs(t *testing.T) { if err := execTxWithStateNewBlock(state, blockchain, txEnv); err != nil { t.Fatal(err) } - entry, err = state.GetNameRegEntry(name) + entry, err = state.GetNameEntry(name) require.NoError(t, err) if entry != nil { t.Fatal("Expected removed entry to be nil") @@ -1105,7 +1105,7 @@ func TestNameTxs(t *testing.T) { if err := execTxWithStateAndBlockchain(state, blockchain.Tip, txEnv); err != nil { t.Fatal(err) } - entry, err = state.GetNameRegEntry(name) + entry, err = state.GetNameEntry(name) require.NoError(t, err) validateEntry(t, entry, name, data, testPrivAccounts[0].Address(), blockchain.LastBlockHeight()+numDesiredBlocks) // Fast forward @@ -1121,7 +1121,7 @@ func TestNameTxs(t *testing.T) { if err := execTxWithStateNewBlock(state, blockchain, txEnv); err != nil { t.Fatal(err) } - entry, err = state.GetNameRegEntry(name) + entry, err = state.GetNameEntry(name) require.NoError(t, err) if entry != nil { t.Fatal("Expected removed entry to be nil") @@ -1465,7 +1465,7 @@ proof-of-work chain as proof of what happened while they were gone ` t.Errorf("Unexpected newAcc0 balance. Expected %v, got %v", acc0.Balance()-entryAmount, newAcc0.Balance()) } - entry, err := stateNameTx.GetNameRegEntry(entryName) + entry, err := stateNameTx.GetNameEntry(entryName) require.NoError(t, err) if entry == nil { t.Errorf("Expected an entry but got nil") diff --git a/execution/executors/call.go b/execution/executors/call.go index caf19a5b..f377e914 100644 --- a/execution/executors/call.go +++ b/execution/executors/call.go @@ -234,13 +234,13 @@ func (ctx *CallContext) Deliver(inAcc, outAcc acm.Account, value uint64) error { return nil } -func (ctx *CallContext) FireCallEvents(ret []byte, exception errors.CodedError) { +func (ctx *CallContext) FireCallEvents(ret []byte, err error) { // Fire Events for sender and receiver // a separate event will be fired from vm for each additional call if ctx.EventPublisher != nil { - events.PublishAccountInput(ctx.EventPublisher, ctx.tx.Input.Address, ctx.txEnv.Tx, ret, errors.AsCodedError(exception)) + events.PublishAccountInput(ctx.EventPublisher, ctx.tx.Input.Address, ctx.txEnv.Tx, ret, errors.AsCodedError(err)) if ctx.tx.Address != nil { - events.PublishAccountOutput(ctx.EventPublisher, *ctx.tx.Address, ctx.txEnv.Tx, ret, errors.AsCodedError(exception)) + events.PublishAccountOutput(ctx.EventPublisher, *ctx.tx.Address, ctx.txEnv.Tx, ret, errors.AsCodedError(err)) } } } diff --git a/execution/executors/name.go b/execution/executors/name.go index da825636..dbd2978a 100644 --- a/execution/executors/name.go +++ b/execution/executors/name.go @@ -18,7 +18,7 @@ type NameContext struct { Tip blockchain.TipInfo StateWriter state.Writer EventPublisher event.Publisher - NameReg names.NameRegWriter + NameReg names.Writer Logger *logging.Logger tx *payload.NameTx } @@ -74,7 +74,7 @@ func (ctx *NameContext) Execute(txEnv *txs.Envelope) error { "last_block_height", lastBlockHeight) // check if the name exists - entry, err := ctx.NameReg.GetNameRegEntry(ctx.tx.Name) + entry, err := ctx.NameReg.GetNameEntry(ctx.tx.Name) if err != nil { return err } @@ -99,7 +99,7 @@ func (ctx *NameContext) Execute(txEnv *txs.Envelope) error { // (owners if not expired, anyone if expired) ctx.Logger.TraceMsg("Removing NameReg entry (no value and empty data in tx requests this)", "name", entry.Name) - err := ctx.NameReg.RemoveNameRegEntry(entry.Name) + err := ctx.NameReg.RemoveNameEntry(entry.Name) if err != nil { return err } @@ -134,7 +134,7 @@ func (ctx *NameContext) Execute(txEnv *txs.Envelope) error { "credit", credit) } entry.Data = ctx.tx.Data - err := ctx.NameReg.UpdateNameRegEntry(entry) + err := ctx.NameReg.UpdateNameEntry(entry) if err != nil { return err } @@ -144,7 +144,7 @@ func (ctx *NameContext) Execute(txEnv *txs.Envelope) error { return fmt.Errorf("Names must be registered for at least %d blocks", names.MinNameRegistrationPeriod) } // entry does not exist, so create it - entry = &names.NameRegEntry{ + entry = &names.Entry{ Name: ctx.tx.Name, Owner: ctx.tx.Input.Address, Data: ctx.tx.Data, @@ -153,7 +153,7 @@ func (ctx *NameContext) Execute(txEnv *txs.Envelope) error { ctx.Logger.TraceMsg("Creating NameReg entry", "name", entry.Name, "expires_in", expiresIn) - err := ctx.NameReg.UpdateNameRegEntry(entry) + err := ctx.NameReg.UpdateNameEntry(entry) if err != nil { return err } diff --git a/execution/names/namereg_cache.go b/execution/names/cache.go similarity index 66% rename from execution/names/namereg_cache.go rename to execution/names/cache.go index d21c110b..074ff290 100644 --- a/execution/names/namereg_cache.go +++ b/execution/names/cache.go @@ -20,33 +20,33 @@ import ( "sync" ) -// The NameRegCache helps prevent unnecessary IAVLTree updates and garbage generation. -type NameRegCache struct { +// The Cache helps prevent unnecessary IAVLTree updates and garbage generation. +type Cache struct { sync.RWMutex - backend NameRegGetter + backend Getter names map[string]*nameInfo } type nameInfo struct { sync.RWMutex - entry *NameRegEntry + entry *Entry removed bool updated bool } -var _ NameRegWriter = &NameRegCache{} +var _ Writer = &Cache{} -// Returns a NameRegCache that wraps an underlying NameRegCacheGetter to use on a cache miss, can write to an -// output NameRegWriter via Sync. +// Returns a Cache that wraps an underlying NameRegCacheGetter to use on a cache miss, can write to an +// output Writer via Sync. // Not goroutine safe, use syncStateCache if you need concurrent access -func NewNameRegCache(backend NameRegGetter) *NameRegCache { - return &NameRegCache{ +func NewCache(backend Getter) *Cache { + return &Cache{ backend: backend, names: make(map[string]*nameInfo), } } -func (cache *NameRegCache) GetNameRegEntry(name string) (*NameRegEntry, error) { +func (cache *Cache) GetNameEntry(name string) (*Entry, error) { nameInfo, err := cache.get(name) if err != nil { return nil, err @@ -59,7 +59,7 @@ func (cache *NameRegCache) GetNameRegEntry(name string) (*NameRegEntry, error) { return nameInfo.entry, nil } -func (cache *NameRegCache) UpdateNameRegEntry(entry *NameRegEntry) error { +func (cache *Cache) UpdateNameEntry(entry *Entry) error { nameInfo, err := cache.get(entry.Name) if err != nil { return err @@ -67,7 +67,7 @@ func (cache *NameRegCache) UpdateNameRegEntry(entry *NameRegEntry) error { nameInfo.Lock() defer nameInfo.Unlock() if nameInfo.removed { - return fmt.Errorf("UpdateNameRegEntry on a removed name: %s", nameInfo.entry.Name) + return fmt.Errorf("UpdateNameEntry on a removed name: %s", nameInfo.entry.Name) } nameInfo.entry = entry @@ -75,7 +75,7 @@ func (cache *NameRegCache) UpdateNameRegEntry(entry *NameRegEntry) error { return nil } -func (cache *NameRegCache) RemoveNameRegEntry(name string) error { +func (cache *Cache) RemoveNameEntry(name string) error { nameInfo, err := cache.get(name) if err != nil { return err @@ -83,15 +83,15 @@ func (cache *NameRegCache) RemoveNameRegEntry(name string) error { nameInfo.Lock() defer nameInfo.Unlock() if nameInfo.removed { - return fmt.Errorf("RemoveNameRegEntry on removed name: %s", name) + return fmt.Errorf("RemoveNameEntry on removed name: %s", name) } nameInfo.removed = true return nil } -// Writes whatever is in the cache to the output NameRegWriter state. Does not flush the cache, to do that call Reset() +// Writes whatever is in the cache to the output Writer state. Does not flush the cache, to do that call Reset() // after Sync or use Flusth if your wish to use the output state as your next backend -func (cache *NameRegCache) Sync(state NameRegWriter) error { +func (cache *Cache) Sync(state Writer) error { cache.Lock() defer cache.Unlock() // Determine order for names @@ -107,13 +107,13 @@ func (cache *NameRegCache) Sync(state NameRegWriter) error { nameInfo := cache.names[name] nameInfo.RLock() if nameInfo.removed { - err := state.RemoveNameRegEntry(name) + err := state.RemoveNameEntry(name) if err != nil { nameInfo.RUnlock() return err } } else if nameInfo.updated { - err := state.UpdateNameRegEntry(nameInfo.entry) + err := state.UpdateNameEntry(nameInfo.entry) if err != nil { nameInfo.RUnlock() return err @@ -125,15 +125,15 @@ func (cache *NameRegCache) Sync(state NameRegWriter) error { } // Resets the cache to empty initialising the backing map to the same size as the previous iteration. -func (cache *NameRegCache) Reset(backend NameRegGetter) { +func (cache *Cache) Reset(backend Getter) { cache.Lock() defer cache.Unlock() cache.backend = backend cache.names = make(map[string]*nameInfo) } -// Syncs the NameRegCache and Resets it to use NameRegWriter as the backend NameRegGetter -func (cache *NameRegCache) Flush(state NameRegWriter) error { +// Syncs the Cache and Resets it to use Writer as the backend Getter +func (cache *Cache) Flush(state Writer) error { err := cache.Sync(state) if err != nil { return err @@ -142,12 +142,12 @@ func (cache *NameRegCache) Flush(state NameRegWriter) error { return nil } -func (cache *NameRegCache) Backend() NameRegGetter { +func (cache *Cache) Backend() Getter { return cache.backend } // Get the cache accountInfo item creating it if necessary -func (cache *NameRegCache) get(name string) (*nameInfo, error) { +func (cache *Cache) get(name string) (*nameInfo, error) { cache.RLock() nmeInfo := cache.names[name] cache.RUnlock() @@ -156,7 +156,7 @@ func (cache *NameRegCache) get(name string) (*nameInfo, error) { defer cache.Unlock() nmeInfo = cache.names[name] if nmeInfo == nil { - entry, err := cache.backend.GetNameRegEntry(name) + entry, err := cache.backend.GetNameEntry(name) if err != nil { return nil, err } diff --git a/execution/names/namereg_cache_test.go b/execution/names/cache_test.go similarity index 100% rename from execution/names/namereg_cache_test.go rename to execution/names/cache_test.go diff --git a/execution/names/namereg.go b/execution/names/namereg.go deleted file mode 100644 index 157fe2f4..00000000 --- a/execution/names/namereg.go +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2017 Monax Industries Limited -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package names - -import "github.com/hyperledger/burrow/crypto" - -// NameReg provides a global key value store based on Name, Data pairs that are subject to expiry and ownership by an -// account. -type NameRegEntry struct { - // registered name for the entry - Name string - // address that created the entry - Owner crypto.Address - // data to store under this name - Data string - // block at which this entry expires - Expires uint64 -} - -type NameRegGetter interface { - GetNameRegEntry(name string) (*NameRegEntry, error) -} - -type NameRegUpdater interface { - // Updates the name entry creating it if it does not exist - UpdateNameRegEntry(entry *NameRegEntry) error - // Remove the name entry - RemoveNameRegEntry(name string) error -} - -type NameRegWriter interface { - NameRegGetter - NameRegUpdater -} - -type NameRegIterable interface { - NameRegGetter - IterateNameRegEntries(consumer func(*NameRegEntry) (stop bool)) (stopped bool, err error) -} diff --git a/execution/names/names.go b/execution/names/names.go index cfa656d6..586fb7b3 100644 --- a/execution/names/names.go +++ b/execution/names/names.go @@ -14,6 +14,8 @@ package names +import "github.com/hyperledger/burrow/crypto" + var ( MinNameRegistrationPeriod uint64 = 5 @@ -29,6 +31,40 @@ var ( MaxDataLength = 1 << 16 ) +// NameReg provides a global key value store based on Name, Data pairs that are subject to expiry and ownership by an +// account. +type Entry struct { + // registered name for the entry + Name string + // address that created the entry + Owner crypto.Address + // data to store under this name + Data string + // block at which this entry expires + Expires uint64 +} + +type Getter interface { + GetNameEntry(name string) (*Entry, error) +} + +type Updater interface { + // Updates the name entry creating it if it does not exist + UpdateNameEntry(entry *Entry) error + // Remove the name entry + RemoveNameEntry(name string) error +} + +type Writer interface { + Getter + Updater +} + +type Iterable interface { + Getter + IterateNameEntries(consumer func(*Entry) (stop bool)) (stopped bool, err error) +} + // base cost is "effective" number of bytes func NameBaseCost(name, data string) uint64 { return uint64(len(data) + 32) diff --git a/execution/state.go b/execution/state.go index d70646fc..469b1082 100644 --- a/execution/state.go +++ b/execution/state.go @@ -271,9 +271,9 @@ func (s *State) IterateStorage(address crypto.Address, //------------------------------------- // State.nameReg -var _ names.NameRegIterable = &State{} +var _ names.Iterable = &State{} -func (s *State) GetNameRegEntry(name string) (*names.NameRegEntry, error) { +func (s *State) GetNameEntry(name string) (*names.Entry, error) { _, valueBytes := s.tree.Get(prefixedKey(nameRegPrefix, []byte(name))) if valueBytes == nil { return nil, nil @@ -282,13 +282,13 @@ func (s *State) GetNameRegEntry(name string) (*names.NameRegEntry, error) { return DecodeNameRegEntry(valueBytes), nil } -func (s *State) IterateNameRegEntries(consumer func(*names.NameRegEntry) (stop bool)) (stopped bool, err error) { +func (s *State) IterateNameEntries(consumer func(*names.Entry) (stop bool)) (stopped bool, err error) { return s.tree.IterateRange(nameRegStart, nameRegEnd, true, func(key []byte, value []byte) (stop bool) { return consumer(DecodeNameRegEntry(value)) }), nil } -func (s *State) UpdateNameRegEntry(entry *names.NameRegEntry) error { +func (s *State) UpdateNameEntry(entry *names.Entry) error { w := new(bytes.Buffer) var n int var err error @@ -300,7 +300,7 @@ func (s *State) UpdateNameRegEntry(entry *names.NameRegEntry) error { return nil } -func (s *State) RemoveNameRegEntry(name string) error { +func (s *State) RemoveNameEntry(name string) error { s.tree.Remove(prefixedKey(nameRegPrefix, []byte(name))) return nil } @@ -315,19 +315,19 @@ func (s *State) Copy(db dbm.DB) *State { return state } -func DecodeNameRegEntry(entryBytes []byte) *names.NameRegEntry { +func DecodeNameRegEntry(entryBytes []byte) *names.Entry { var n int var err error value := NameRegDecode(bytes.NewBuffer(entryBytes), &n, &err) - return value.(*names.NameRegEntry) + return value.(*names.Entry) } func NameRegEncode(o interface{}, w io.Writer, n *int, err *error) { - wire.WriteBinary(o.(*names.NameRegEntry), w, n, err) + wire.WriteBinary(o.(*names.Entry), w, n, err) } func NameRegDecode(r io.Reader, n *int, err *error) interface{} { - return wire.ReadBinary(&names.NameRegEntry{}, r, names.MaxDataLength, n, err) + return wire.ReadBinary(&names.Entry{}, r, names.MaxDataLength, n, err) } func prefixedKey(prefix string, suffices ...[]byte) []byte { diff --git a/rpc/filters/namereg.go b/rpc/filters/namereg.go index df617a24..6d822fb1 100644 --- a/rpc/filters/namereg.go +++ b/rpc/filters/namereg.go @@ -82,7 +82,7 @@ func (nrnf *NameRegNameFilter) Configure(fd *FilterData) error { } func (nrnf *NameRegNameFilter) Match(v interface{}) bool { - nre, ok := v.(*names.NameRegEntry) + nre, ok := v.(*names.Entry) if !ok { return false } @@ -121,7 +121,7 @@ func (nrof *NameRegOwnerFilter) Configure(fd *FilterData) error { } func (nrof *NameRegOwnerFilter) Match(v interface{}) bool { - nre, ok := v.(*names.NameRegEntry) + nre, ok := v.(*names.Entry) if !ok { return false } @@ -157,7 +157,7 @@ func (nrdf *NameRegDataFilter) Configure(fd *FilterData) error { } func (nrdf *NameRegDataFilter) Match(v interface{}) bool { - nre, ok := v.(*names.NameRegEntry) + nre, ok := v.(*names.Entry) if !ok { return false } @@ -188,7 +188,7 @@ func (nref *NameRegExpiresFilter) Configure(fd *FilterData) error { } func (nref *NameRegExpiresFilter) Match(v interface{}) bool { - nre, ok := v.(*names.NameRegEntry) + nre, ok := v.(*names.Entry) if !ok { return false } diff --git a/rpc/result.go b/rpc/result.go index 06a70a36..4dc921fc 100644 --- a/rpc/result.go +++ b/rpc/result.go @@ -162,7 +162,7 @@ type ResultPeers struct { type ResultListNames struct { BlockHeight uint64 - Names []*names.NameRegEntry + Names []*names.Entry } type ResultGeneratePrivateAccount struct { @@ -206,7 +206,7 @@ type ResultListUnconfirmedTxs struct { } type ResultGetName struct { - Entry *names.NameRegEntry + Entry *names.Entry } type ResultGenesis struct { diff --git a/rpc/service.go b/rpc/service.go index 72b40f1c..dab10524 100644 --- a/rpc/service.go +++ b/rpc/service.go @@ -46,7 +46,7 @@ const AccountsRingMutexCount = 100 type Service struct { ctx context.Context state state.Iterable - nameReg names.NameRegIterable + nameReg names.Iterable mempoolAccounts *execution.Accounts subscribable event.Subscribable blockchain *bcm.Blockchain @@ -55,7 +55,7 @@ type Service struct { logger *logging.Logger } -func NewService(ctx context.Context, state state.Iterable, nameReg names.NameRegIterable, +func NewService(ctx context.Context, state state.Iterable, nameReg names.Iterable, checker state.Reader, subscribable event.Subscribable, blockchain *bcm.Blockchain, keyClient keys.KeyClient, transactor *execution.Transactor, nodeView *query.NodeView, logger *logging.Logger) *Service { @@ -321,7 +321,7 @@ func (s *Service) GetAccountHumanReadable(address crypto.Address) (*ResultGetAcc // Name registry func (s *Service) GetName(name string) (*ResultGetName, error) { - entry, err := s.nameReg.GetNameRegEntry(name) + entry, err := s.nameReg.GetNameEntry(name) if err != nil { return nil, err } @@ -331,9 +331,9 @@ func (s *Service) GetName(name string) (*ResultGetName, error) { return &ResultGetName{Entry: entry}, nil } -func (s *Service) ListNames(predicate func(*names.NameRegEntry) bool) (*ResultListNames, error) { - var nms []*names.NameRegEntry - s.nameReg.IterateNameRegEntries(func(entry *names.NameRegEntry) (stop bool) { +func (s *Service) ListNames(predicate func(*names.Entry) bool) (*ResultListNames, error) { + var nms []*names.Entry + s.nameReg.IterateNameEntries(func(entry *names.Entry) (stop bool) { if predicate(entry) { nms = append(nms, entry) } diff --git a/rpc/tm/client/client.go b/rpc/tm/client/client.go index 0083da72..1b03a76e 100644 --- a/rpc/tm/client/client.go +++ b/rpc/tm/client/client.go @@ -125,7 +125,7 @@ func Call(client RPCClient, fromAddress, toAddress crypto.Address, data []byte) return res, nil } -func GetName(client RPCClient, name string) (*names.NameRegEntry, error) { +func GetName(client RPCClient, name string) (*names.Entry, error) { res := new(rpc.ResultGetName) _, err := client.Call(tm.GetName, pmap("name", name), res) if err != nil { diff --git a/rpc/tm/integration/shared.go b/rpc/tm/integration/shared.go index 2263a193..d01322d0 100644 --- a/rpc/tm/integration/shared.go +++ b/rpc/tm/integration/shared.go @@ -173,7 +173,7 @@ func callContract(t *testing.T, client tmClient.RPCClient, fromAddress, toAddres } // get the namereg entry -func getNameRegEntry(t *testing.T, client tmClient.RPCClient, name string) *names.NameRegEntry { +func getNameRegEntry(t *testing.T, client tmClient.RPCClient, name string) *names.Entry { entry, err := tmClient.GetName(client, name) if err != nil { t.Fatal(err) diff --git a/rpc/tm/methods.go b/rpc/tm/methods.go index 6c815b38..47883f6d 100644 --- a/rpc/tm/methods.go +++ b/rpc/tm/methods.go @@ -168,7 +168,7 @@ func GetRoutes(service *rpc.Service, logger *logging.Logger) map[string]*server. // Names GetName: server.NewRPCFunc(service.GetName, "name"), ListNames: server.NewRPCFunc(func() (*rpc.ResultListNames, error) { - return service.ListNames(func(*names.NameRegEntry) bool { + return service.ListNames(func(*names.Entry) bool { return true }) }, ""), diff --git a/rpc/v0/methods.go b/rpc/v0/methods.go index a0ffe912..e391f533 100644 --- a/rpc/v0/methods.go +++ b/rpc/v0/methods.go @@ -348,7 +348,7 @@ func GetMethods(codec rpc.Codec, service *rpc.Service, logger *logging.Logger) m if err != nil { return nil, rpc.INVALID_PARAMS, err } - list, err := service.ListNames(func(entry *names.NameRegEntry) bool { + list, err := service.ListNames(func(entry *names.Entry) bool { return filter.Match(entry) }) if err != nil { -- GitLab