diff --git a/pkg/client/client.go b/pkg/client/client.go index 1db894b9..20b88b36 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -13,6 +13,7 @@ type Client interface { Netmap Object Session + Reputation // Raw must return underlying raw protobuf client. Raw() *client.Client diff --git a/pkg/client/reputation.go b/pkg/client/reputation.go new file mode 100644 index 00000000..8682f62c --- /dev/null +++ b/pkg/client/reputation.go @@ -0,0 +1,82 @@ +package client + +import ( + "context" + + "github.com/nspcc-dev/neofs-api-go/pkg/reputation" + "github.com/nspcc-dev/neofs-api-go/rpc/client" + v2reputation "github.com/nspcc-dev/neofs-api-go/v2/reputation" + rpcapi "github.com/nspcc-dev/neofs-api-go/v2/rpc" + v2signature "github.com/nspcc-dev/neofs-api-go/v2/signature" + "github.com/pkg/errors" +) + +// Reputation contains methods for working with Reputation system values. +type Reputation interface { + // SendLocalTrust sends local trust values of local peer. + SendLocalTrust(context.Context, SendLocalTrustPrm, ...CallOption) (*SendLocalTrustRes, error) +} + +// SendLocalTrustPrm groups parameters of SendLocalTrust operation. +type SendLocalTrustPrm struct { + epoch uint64 + + trusts []*reputation.Trust +} + +// Epoch returns epoch in which the trust was assessed. +func (x SendLocalTrustPrm) Epoch() uint64 { + return x.epoch +} + +// SetEpoch sets epoch in which the trust was assessed. +func (x *SendLocalTrustPrm) SetEpoch(epoch uint64) { + x.epoch = epoch +} + +// Trusts returns list of local trust values. +func (x SendLocalTrustPrm) Trusts() []*reputation.Trust { + return x.trusts +} + +// SetTrusts sets list of local trust values. +func (x *SendLocalTrustPrm) SetTrusts(trusts []*reputation.Trust) { + x.trusts = trusts +} + +// SendLocalTrustPrm groups results of SendLocalTrust operation. +type SendLocalTrustRes struct{} + +func (c *clientImpl) SendLocalTrust(ctx context.Context, prm SendLocalTrustPrm, opts ...CallOption) (*SendLocalTrustRes, error) { + // apply all available options + callOptions := c.defaultCallOptions() + + for i := range opts { + opts[i](callOptions) + } + + reqBody := new(v2reputation.SendLocalTrustRequestBody) + reqBody.SetEpoch(prm.Epoch()) + reqBody.SetTrusts(reputation.TrustsToV2(prm.Trusts())) + + req := new(v2reputation.SendLocalTrustRequest) + req.SetBody(reqBody) + req.SetMetaHeader(v2MetaHeaderFromOpts(callOptions)) + + err := v2signature.SignServiceMessage(callOptions.key, req) + if err != nil { + return nil, err + } + + resp, err := rpcapi.SendLocalTrust(c.Raw(), req, client.WithContext(ctx)) + if err != nil { + return nil, err + } + + err = v2signature.VerifyServiceMessage(resp) + if err != nil { + return nil, errors.Wrap(err, "can't verify response message") + } + + return new(SendLocalTrustRes), nil +}