From 8799138fcb67f21d2cc41749463ad6146bbedacd Mon Sep 17 00:00:00 2001
From: Pavel Karpy
Date: Fri, 14 Apr 2023 14:05:31 +0300
Subject: [PATCH] [#247] morph: Drop reputation contract
Signed-off-by: Pavel Karpy
---
pkg/morph/client/nns.go | 2 -
pkg/morph/client/reputation/client.go | 83 -----------------
pkg/morph/client/reputation/get.go | 108 -----------------------
pkg/morph/client/reputation/list.go | 55 ------------
pkg/morph/client/reputation/put.go | 47 ----------
pkg/morph/event/reputation/put.go | 99 ---------------------
pkg/morph/event/reputation/put_notary.go | 74 ----------------
pkg/morph/event/reputation/put_test.go | 92 -------------------
8 files changed, 560 deletions(-)
delete mode 100644 pkg/morph/client/reputation/client.go
delete mode 100644 pkg/morph/client/reputation/get.go
delete mode 100644 pkg/morph/client/reputation/list.go
delete mode 100644 pkg/morph/client/reputation/put.go
delete mode 100644 pkg/morph/event/reputation/put.go
delete mode 100644 pkg/morph/event/reputation/put_notary.go
delete mode 100644 pkg/morph/event/reputation/put_test.go
diff --git a/pkg/morph/client/nns.go b/pkg/morph/client/nns.go
index 473b3500..236cf1ba 100644
--- a/pkg/morph/client/nns.go
+++ b/pkg/morph/client/nns.go
@@ -32,8 +32,6 @@ const (
NNSNetmapContractName = "netmap.frostfs"
// NNSProxyContractName is a name of the proxy contract in NNS.
NNSProxyContractName = "proxy.frostfs"
- // NNSReputationContractName is a name of the reputation contract in NNS.
- NNSReputationContractName = "reputation.frostfs"
// NNSSubnetworkContractName is a name of the subnet contract in NNS.
NNSSubnetworkContractName = "subnet.frostfs"
// NNSGroupKeyName is a name for the FrostFS group key record in NNS.
diff --git a/pkg/morph/client/reputation/client.go b/pkg/morph/client/reputation/client.go
deleted file mode 100644
index cdaf191a..00000000
--- a/pkg/morph/client/reputation/client.go
+++ /dev/null
@@ -1,83 +0,0 @@
-package reputation
-
-import (
- "fmt"
-
- "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/client"
- "github.com/nspcc-dev/neo-go/pkg/encoding/fixedn"
- "github.com/nspcc-dev/neo-go/pkg/util"
-)
-
-// Client is a wrapper over StaticClient
-// which makes calls with the names and arguments
-// of the FrostFS reputation contract.
-//
-// Working client must be created via constructor New.
-// Using the Client that has been created with new(Client)
-// expression (or just declaring a Client variable) is unsafe
-// and can lead to panic.
-type Client struct {
- client *client.StaticClient // static reputation contract client
-}
-
-const (
- putMethod = "put"
- getMethod = "get"
- getByIDMethod = "getByID"
- listByEpochMethod = "listByEpoch"
-)
-
-// NewFromMorph returns the wrapper instance from the raw morph client.
-func NewFromMorph(cli *client.Client, contract util.Uint160, fee fixedn.Fixed8, opts ...Option) (*Client, error) {
- o := defaultOpts()
-
- for i := range opts {
- opts[i](o)
- }
-
- sc, err := client.NewStatic(cli, contract, fee, ([]client.StaticClientOption)(*o)...)
- if err != nil {
- return nil, fmt.Errorf("could not create static client of reputation contract: %w", err)
- }
-
- return &Client{client: sc}, nil
-}
-
-// Morph returns raw morph client.
-func (c Client) Morph() *client.Client {
- return c.client.Morph()
-}
-
-// ContractAddress returns the address of the associated contract.
-func (c Client) ContractAddress() util.Uint160 {
- return c.client.ContractAddress()
-}
-
-// Option allows to set an optional
-// parameter of ClientWrapper.
-type Option func(*opts)
-
-type opts []client.StaticClientOption
-
-func defaultOpts() *opts {
- return new(opts)
-}
-
-// TryNotary returns option to enable
-// notary invocation tries.
-func TryNotary() Option {
- return func(o *opts) {
- *o = append(*o, client.TryNotary())
- }
-}
-
-// AsAlphabet returns option to sign main TX
-// of notary requests with client's private
-// key.
-//
-// Considered to be used by IR nodes only.
-func AsAlphabet() Option {
- return func(o *opts) {
- *o = append(*o, client.AsAlphabet())
- }
-}
diff --git a/pkg/morph/client/reputation/get.go b/pkg/morph/client/reputation/get.go
deleted file mode 100644
index 8f1d2417..00000000
--- a/pkg/morph/client/reputation/get.go
+++ /dev/null
@@ -1,108 +0,0 @@
-package reputation
-
-import (
- "fmt"
-
- "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/client"
- "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/reputation"
- "github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
-)
-
-type (
- // GetPrm groups the arguments of "get reputation value" test invocation.
- GetPrm struct {
- epoch uint64
- peerID reputation.PeerID
- }
-
- // GetByIDPrm groups the arguments of "get reputation value by
- // reputation id" test invocation.
- GetByIDPrm struct {
- id ID
- }
-)
-
-// SetEpoch sets epoch of expected reputation value.
-func (g *GetPrm) SetEpoch(v uint64) {
- g.epoch = v
-}
-
-// SetPeerID sets peer id of expected reputation value.
-func (g *GetPrm) SetPeerID(v reputation.PeerID) {
- g.peerID = v
-}
-
-// SetID sets id of expected reputation value in reputation contract.
-func (g *GetByIDPrm) SetID(v ID) {
- g.id = v
-}
-
-// Get invokes the call of "get reputation value" method of reputation contract.
-func (c *Client) Get(p GetPrm) ([]reputation.GlobalTrust, error) {
- invokePrm := client.TestInvokePrm{}
- invokePrm.SetMethod(getMethod)
- invokePrm.SetArgs(p.epoch, p.peerID.PublicKey())
-
- res, err := c.client.TestInvoke(invokePrm)
- if err != nil {
- return nil, fmt.Errorf("could not perform test invocation (%s): %w", getMethod, err)
- }
-
- return parseReputations(res, getMethod)
-}
-
-// GetByID invokes the call of "get reputation value by reputation id" method
-// of reputation contract.
-func (c *Client) GetByID(p GetByIDPrm) ([]reputation.GlobalTrust, error) {
- invokePrm := client.TestInvokePrm{}
- invokePrm.SetMethod(getByIDMethod)
- invokePrm.SetArgs([]byte(p.id))
-
- prms, err := c.client.TestInvoke(invokePrm)
- if err != nil {
- return nil, fmt.Errorf("could not perform test invocation (%s): %w", getByIDMethod, err)
- }
-
- return parseReputations(prms, getByIDMethod)
-}
-
-func parseGetResult(rawReputations [][]byte, method string) ([]reputation.GlobalTrust, error) {
- reputations := make([]reputation.GlobalTrust, 0, len(rawReputations))
-
- for i := range rawReputations {
- r := reputation.GlobalTrust{}
-
- err := r.Unmarshal(rawReputations[i])
- if err != nil {
- return nil, fmt.Errorf("can't unmarshal global trust value (%s): %w", method, err)
- }
-
- reputations = append(reputations, r)
- }
-
- return reputations, nil
-}
-
-func parseReputations(items []stackitem.Item, method string) ([]reputation.GlobalTrust, error) {
- if ln := len(items); ln != 1 {
- return nil, fmt.Errorf("unexpected stack item count (%s): %d", method, ln)
- }
-
- items, err := client.ArrayFromStackItem(items[0])
- if err != nil {
- return nil, fmt.Errorf("could not get stack item array from stack item (%s): %w", method, err)
- }
-
- res := make([][]byte, 0, len(items))
-
- for i := range items {
- rawReputation, err := client.BytesFromStackItem(items[i])
- if err != nil {
- return nil, fmt.Errorf("could not get byte array from stack item (%s): %w", method, err)
- }
-
- res = append(res, rawReputation)
- }
-
- return parseGetResult(res, method)
-}
diff --git a/pkg/morph/client/reputation/list.go b/pkg/morph/client/reputation/list.go
deleted file mode 100644
index 0090efb1..00000000
--- a/pkg/morph/client/reputation/list.go
+++ /dev/null
@@ -1,55 +0,0 @@
-package reputation
-
-import (
- "fmt"
-
- "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/client"
-)
-
-type (
- // ID is an ID of the reputation record in reputation contract.
- ID []byte
-
- // ListByEpochArgs groups the arguments of
- // "list reputation ids by epoch" test invoke call.
- ListByEpochArgs struct {
- epoch uint64
- }
-)
-
-// SetEpoch sets epoch of expected reputation ids.
-func (l *ListByEpochArgs) SetEpoch(v uint64) {
- l.epoch = v
-}
-
-// ListByEpoch invokes the call of "list reputation ids by epoch" method of
-// reputation contract.
-func (c *Client) ListByEpoch(p ListByEpochArgs) ([]ID, error) {
- invokePrm := client.TestInvokePrm{}
- invokePrm.SetMethod(listByEpochMethod)
- invokePrm.SetArgs(p.epoch)
-
- prms, err := c.client.TestInvoke(invokePrm)
- if err != nil {
- return nil, fmt.Errorf("could not perform test invocation (%s): %w", listByEpochMethod, err)
- } else if ln := len(prms); ln != 1 {
- return nil, fmt.Errorf("unexpected stack item count (%s): %d", listByEpochMethod, ln)
- }
-
- items, err := client.ArrayFromStackItem(prms[0])
- if err != nil {
- return nil, fmt.Errorf("could not get stack item array from stack item (%s): %w", listByEpochMethod, err)
- }
-
- result := make([]ID, 0, len(items))
- for i := range items {
- rawReputation, err := client.BytesFromStackItem(items[i])
- if err != nil {
- return nil, fmt.Errorf("could not get byte array from stack item (%s): %w", listByEpochMethod, err)
- }
-
- result = append(result, rawReputation)
- }
-
- return result, nil
-}
diff --git a/pkg/morph/client/reputation/put.go b/pkg/morph/client/reputation/put.go
deleted file mode 100644
index 02b47def..00000000
--- a/pkg/morph/client/reputation/put.go
+++ /dev/null
@@ -1,47 +0,0 @@
-package reputation
-
-import (
- "fmt"
-
- "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/client"
- "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/reputation"
-)
-
-type (
- // PutPrm groups the arguments of "put reputation value" invocation call.
- PutPrm struct {
- epoch uint64
- peerID reputation.PeerID
- value reputation.GlobalTrust
- }
-)
-
-// SetEpoch sets epoch of reputation value.
-func (p *PutPrm) SetEpoch(v uint64) {
- p.epoch = v
-}
-
-// SetPeerID sets peer id of reputation value.
-func (p *PutPrm) SetPeerID(v reputation.PeerID) {
- p.peerID = v
-}
-
-// SetValue sets reputation value.
-func (p *PutPrm) SetValue(v reputation.GlobalTrust) {
- p.value = v
-}
-
-// Put invokes direct call of "put reputation value" method of reputation contract.
-//
-// If TryNotary is provided, calls notary contract.
-func (c *Client) Put(p PutPrm) error {
- prm := client.InvokePrm{}
- prm.SetMethod(putMethod)
- prm.SetArgs(p.epoch, p.peerID.PublicKey(), p.value.Marshal())
-
- err := c.client.Invoke(prm)
- if err != nil {
- return fmt.Errorf("could not invoke method (%s): %w", putMethod, err)
- }
- return nil
-}
diff --git a/pkg/morph/event/reputation/put.go b/pkg/morph/event/reputation/put.go
deleted file mode 100644
index a182bf26..00000000
--- a/pkg/morph/event/reputation/put.go
+++ /dev/null
@@ -1,99 +0,0 @@
-package reputation
-
-import (
- "fmt"
-
- "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/client"
- "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/event"
- "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/reputation"
- "github.com/nspcc-dev/neo-go/pkg/core/state"
- "github.com/nspcc-dev/neo-go/pkg/network/payload"
-)
-
-// Put structure of reputation.reputationPut notification from
-// morph chain.
-type Put struct {
- epoch uint64
- peerID reputation.PeerID
- value reputation.GlobalTrust
-
- // For notary notifications only.
- // Contains raw transactions of notary request.
- notaryRequest *payload.P2PNotaryRequest
-}
-
-const peerIDLength = 33 // compressed public key
-
-// MorphEvent implements Neo:Morph Event interface.
-func (Put) MorphEvent() {}
-
-// Epoch returns epoch value of reputation data.
-func (p Put) Epoch() uint64 {
- return p.epoch
-}
-
-// PeerID returns peer id of reputation data.
-func (p Put) PeerID() reputation.PeerID {
- return p.peerID
-}
-
-// Value returns reputation structure.
-func (p Put) Value() reputation.GlobalTrust {
- return p.value
-}
-
-// NotaryRequest returns raw notary request if notification
-// was received via notary service. Otherwise, returns nil.
-func (p Put) NotaryRequest() *payload.P2PNotaryRequest {
- return p.notaryRequest
-}
-
-// ParsePut from notification into reputation event structure.
-func ParsePut(e *state.ContainedNotificationEvent) (event.Event, error) {
- var (
- ev Put
- err error
- )
-
- params, err := event.ParseStackArray(e)
- if err != nil {
- return nil, fmt.Errorf("could not parse stack items from notify event: %w", err)
- }
-
- if ln := len(params); ln != 3 {
- return nil, event.WrongNumberOfParameters(3, ln)
- }
-
- // parse epoch number
- epoch, err := client.IntFromStackItem(params[0])
- if err != nil {
- return nil, fmt.Errorf("could not get integer epoch number: %w", err)
- }
-
- ev.epoch = uint64(epoch)
-
- // parse peer ID value
- peerID, err := client.BytesFromStackItem(params[1])
- if err != nil {
- return nil, fmt.Errorf("could not get peer ID value: %w", err)
- }
-
- if ln := len(peerID); ln != peerIDLength {
- return nil, fmt.Errorf("peer ID is %d byte long, expected %d", ln, peerIDLength)
- }
-
- ev.peerID.SetPublicKey(peerID)
-
- // parse global trust value
- rawValue, err := client.BytesFromStackItem(params[2])
- if err != nil {
- return nil, fmt.Errorf("could not get global trust value: %w", err)
- }
-
- err = ev.value.Unmarshal(rawValue)
- if err != nil {
- return nil, fmt.Errorf("could not parse global trust value: %w", err)
- }
-
- return ev, nil
-}
diff --git a/pkg/morph/event/reputation/put_notary.go b/pkg/morph/event/reputation/put_notary.go
deleted file mode 100644
index f3cd749f..00000000
--- a/pkg/morph/event/reputation/put_notary.go
+++ /dev/null
@@ -1,74 +0,0 @@
-package reputation
-
-import (
- "fmt"
-
- "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/event"
-)
-
-func (p *Put) setEpoch(v uint64) {
- p.epoch = v
-}
-
-func (p *Put) setPeerID(v []byte) error {
- if ln := len(v); ln != peerIDLength {
- return fmt.Errorf("peer ID is %d byte long, expected %d", ln, peerIDLength)
- }
-
- p.peerID.SetPublicKey(v)
-
- return nil
-}
-
-func (p *Put) setValue(v []byte) error {
- return p.value.Unmarshal(v)
-}
-
-var fieldSetters = []func(*Put, []byte) error{
- // order on stack is reversed
- (*Put).setValue,
- (*Put).setPeerID,
-}
-
-const (
- // PutNotaryEvent is method name for reputation put operations
- // in `Reputation` contract. Is used as identifier for notary
- // put reputation requests.
- PutNotaryEvent = "put"
-)
-
-// ParsePutNotary from NotaryEvent into reputation event structure.
-func ParsePutNotary(ne event.NotaryEvent) (event.Event, error) {
- var ev Put
-
- fieldNum := 0
-
- for _, op := range ne.Params() {
- switch fieldNum {
- case 0, 1:
- data, err := event.BytesFromOpcode(op)
- if err != nil {
- return nil, err
- }
-
- err = fieldSetters[fieldNum](&ev, data)
- if err != nil {
- return nil, fmt.Errorf("can't parse field num %d: %w", fieldNum, err)
- }
- case 2:
- n, err := event.IntFromOpcode(op)
- if err != nil {
- return nil, err
- }
-
- ev.setEpoch(uint64(n))
- default:
- return nil, event.UnexpectedArgNumErr(PutNotaryEvent)
- }
- fieldNum++
- }
-
- ev.notaryRequest = ne.Raw()
-
- return ev, nil
-}
diff --git a/pkg/morph/event/reputation/put_test.go b/pkg/morph/event/reputation/put_test.go
deleted file mode 100644
index 46356b31..00000000
--- a/pkg/morph/event/reputation/put_test.go
+++ /dev/null
@@ -1,92 +0,0 @@
-package reputation
-
-import (
- "math/big"
- "testing"
-
- "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/event"
- "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/reputation"
- reputationtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/reputation/test"
- "github.com/nspcc-dev/neo-go/pkg/core/state"
- "github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
- "github.com/stretchr/testify/require"
-)
-
-func TestParsePut(t *testing.T) {
- var (
- peerID = reputationtest.PeerID()
-
- value reputation.GlobalTrust
- trust reputation.Trust
- trustValue float64 = 0.64
-
- epoch uint64 = 42
- )
-
- trust.SetValue(trustValue)
- trust.SetPeer(peerID)
-
- value.SetTrust(trust)
-
- rawValue := value.Marshal()
-
- t.Run("wrong number of parameters", func(t *testing.T) {
- prms := []stackitem.Item{
- stackitem.NewMap(),
- stackitem.NewMap(),
- }
-
- _, err := ParsePut(createNotifyEventFromItems(prms))
- require.EqualError(t, err, event.WrongNumberOfParameters(3, len(prms)).Error())
- })
-
- t.Run("wrong epoch parameter", func(t *testing.T) {
- _, err := ParsePut(createNotifyEventFromItems([]stackitem.Item{
- stackitem.NewMap(),
- }))
-
- require.Error(t, err)
- })
-
- t.Run("wrong peerID parameter", func(t *testing.T) {
- _, err := ParsePut(createNotifyEventFromItems([]stackitem.Item{
- stackitem.NewBigInteger(new(big.Int).SetUint64(epoch)),
- stackitem.NewMap(),
- }))
-
- require.Error(t, err)
- })
-
- t.Run("wrong value parameter", func(t *testing.T) {
- _, err := ParsePut(createNotifyEventFromItems([]stackitem.Item{
- stackitem.NewBigInteger(new(big.Int).SetUint64(epoch)),
- stackitem.NewByteArray(peerID.PublicKey()),
- stackitem.NewMap(),
- }))
-
- require.Error(t, err)
- })
-
- t.Run("correct behavior", func(t *testing.T) {
- ev, err := ParsePut(createNotifyEventFromItems([]stackitem.Item{
- stackitem.NewBigInteger(new(big.Int).SetUint64(epoch)),
- stackitem.NewByteArray(peerID.PublicKey()),
- stackitem.NewByteArray(rawValue),
- }))
- require.NoError(t, err)
-
- require.Equal(t, Put{
- epoch: epoch,
- peerID: peerID,
- value: value,
- }, ev)
- })
-}
-
-func createNotifyEventFromItems(items []stackitem.Item) *state.ContainedNotificationEvent {
- return &state.ContainedNotificationEvent{
- NotificationEvent: state.NotificationEvent{
- Item: stackitem.NewArray(items),
- },
- }
-}