From 7146afcd28dc3f18ad80d69ff0317195dcc7a190 Mon Sep 17 00:00:00 2001 From: Alex Vanin Date: Wed, 21 Jul 2021 15:55:05 +0300 Subject: [PATCH] [#708] morph/client: Add epoch block getter from netmap Signed-off-by: Alex Vanin --- pkg/morph/client/netmap/client.go | 3 ++ pkg/morph/client/netmap/epoch.go | 41 ++++++++++++++++++++++++ pkg/morph/client/netmap/wrapper/epoch.go | 13 ++++++++ 3 files changed, 57 insertions(+) diff --git a/pkg/morph/client/netmap/client.go b/pkg/morph/client/netmap/client.go index 2819b62e6..b41fca2ab 100644 --- a/pkg/morph/client/netmap/client.go +++ b/pkg/morph/client/netmap/client.go @@ -40,6 +40,7 @@ type cfg struct { epochSnapshotMethod, // get network map snapshot by epoch method name updateStateMethod, // update state method name for invocation epochMethod, // get epoch number method name + epochBlockMethod, // get epoch number method name updateInnerRing, // update innerring method name setConfigMethod, // set config method name configMethod string // get config value method name @@ -49,6 +50,7 @@ const ( defaultAddPeerMethod = "addPeer" // default add peer method name defaultConfigMethod = "config" // default get config value method name defaultEpochMethod = "epoch" // default get epoch number method name + defaultEpochBlockMethod = "epochBlock" // default get epoch block number method name defaultInnerRingListMethod = "innerRingList" // default get innerring list method name defaultNetMapCandidateMethod = "netmapCandidates" // default get network candidates method name defaultNetMapMethod = "netmap" // default get network map method name @@ -66,6 +68,7 @@ func defaultConfig() *cfg { addPeerMethod: defaultAddPeerMethod, configMethod: defaultConfigMethod, epochMethod: defaultEpochMethod, + epochBlockMethod: defaultEpochBlockMethod, innerRingList: defaultInnerRingListMethod, netMapCandidatesMethod: defaultNetMapCandidateMethod, netMapMethod: defaultNetMapMethod, diff --git a/pkg/morph/client/netmap/epoch.go b/pkg/morph/client/netmap/epoch.go index aee124498..02e00ca77 100644 --- a/pkg/morph/client/netmap/epoch.go +++ b/pkg/morph/client/netmap/epoch.go @@ -22,6 +22,22 @@ func (e EpochValues) Number() int64 { return e.num } +// EpochBlockArgs groups the arguments of +// get epoch block number test invoke call. +type EpochBlockArgs struct { +} + +// EpochBlockValues groups the stack parameters +// returned by get epoch block number test invoke. +type EpochBlockValues struct { + block int64 +} + +// Block return the block number of NeoFS epoch. +func (e EpochBlockValues) Block() int64 { + return e.block +} + // Epoch performs the test invoke of get epoch number // method of NeoFS Netmap contract. func (c *Client) Epoch(_ EpochArgs) (*EpochValues, error) { @@ -47,3 +63,28 @@ func (c *Client) Epoch(_ EpochArgs) (*EpochValues, error) { num: num, }, nil } + +// LastEpochBlock performs the test invoke of get epoch block number +// method of NeoFS Netmap contract. +func (c *Client) LastEpochBlock(_ EpochBlockArgs) (*EpochBlockValues, error) { + items, err := c.client.TestInvoke(c.epochBlockMethod) + if err != nil { + return nil, fmt.Errorf("could not perform test invocation (%s): %w", + c.epochBlockMethod, err) + } + + if ln := len(items); ln != 1 { + return nil, fmt.Errorf("unexpected stack item count (%s): %d", + c.epochBlockMethod, ln) + } + + block, err := client.IntFromStackItem(items[0]) + if err != nil { + return nil, fmt.Errorf("could not get number from stack item (%s): %w", + c.epochBlockMethod, err) + } + + return &EpochBlockValues{ + block: block, + }, nil +} diff --git a/pkg/morph/client/netmap/wrapper/epoch.go b/pkg/morph/client/netmap/wrapper/epoch.go index 9f30d852a..ba3ff0f3d 100644 --- a/pkg/morph/client/netmap/wrapper/epoch.go +++ b/pkg/morph/client/netmap/wrapper/epoch.go @@ -18,3 +18,16 @@ func (w *Wrapper) Epoch() (uint64, error) { return uint64(vals.Number()), nil } + +// LastEpochBlock receives block number of current NeoFS epoch +// through the Netmap contract call. +func (w *Wrapper) LastEpochBlock() (uint32, error) { + args := netmap.EpochBlockArgs{} + + vals, err := w.client.LastEpochBlock(args) + if err != nil { + return 0, fmt.Errorf("(%T) could not get epoch block number: %w", w, err) + } + + return uint32(vals.Block()), nil +}