[#496] morph/container: Construct client wrapper in notary mode

Some of the client wrapper's methods should produce notary contract's
invocations. In previous implementation all wrappers provided separate
methods to do it. Since notary and non-notary invocation scenarios have very
different goals, it makes sense to separate the scenarios of using the
client wrapper  at the stage of its creation.

Define `Option` constructor for container client wrapper. Add `TryNotary`
option which enables tries of the notary invocations on underlying static
client. Mark all notary-dedicated methods as deprecated.

Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
This commit is contained in:
Leonard Lyubich 2021-05-25 15:15:21 +03:00 committed by Alex Vanin
parent b794aeab63
commit 9f122f279a
4 changed files with 38 additions and 2 deletions

View file

@ -48,6 +48,8 @@ func Put(w *Wrapper, cnr *container.Container, sig *pkg.Signature) (*container.I
// //
// Returns calculated container identifier and any error // Returns calculated container identifier and any error
// encountered that caused the saving to interrupt. // encountered that caused the saving to interrupt.
//
// If TryNotary is provided, call notary contract.
func (w *Wrapper) Put(cnr, key, sig []byte) error { func (w *Wrapper) Put(cnr, key, sig []byte) error {
if len(sig) == 0 || len(key) == 0 { if len(sig) == 0 || len(key) == 0 {
return errNilArgument return errNilArgument
@ -136,6 +138,8 @@ func Delete(w *Wrapper, cid *container.ID, sig *pkg.Signature) error {
// //
// Returns any error encountered that caused // Returns any error encountered that caused
// the removal to interrupt. // the removal to interrupt.
//
// If TryNotary is provided, calls notary contract.
func (w *Wrapper) Delete(cid, signature []byte) error { func (w *Wrapper) Delete(cid, signature []byte) error {
if len(signature) == 0 { if len(signature) == 0 {
return errNilArgument return errNilArgument

View file

@ -56,6 +56,8 @@ func (w *Wrapper) GetEACL(cid *containerSDK.ID) (*eacl.Table, *pkg.Signature, er
// along with sig.Key() and sig.Sign(). // along with sig.Key() and sig.Sign().
// //
// Returns error if table is nil. // Returns error if table is nil.
//
// If TryNotary is provided, calls notary contract.
func PutEACL(w *Wrapper, table *eacl.Table, sig *pkg.Signature) error { func PutEACL(w *Wrapper, table *eacl.Table, sig *pkg.Signature) error {
if table == nil { if table == nil {
return errNilArgument return errNilArgument

View file

@ -14,6 +14,9 @@ func (w *Wrapper) StartEstimation(epoch uint64) error {
// StartEstimationNotary votes to produce start estimation notification through // StartEstimationNotary votes to produce start estimation notification through
// notary contract. // notary contract.
//
// Deprecated: provide TryNotary() option to NewFromMorph
// and use StartEstimation.
func (w *Wrapper) StartEstimationNotary(epoch uint64) error { func (w *Wrapper) StartEstimationNotary(epoch uint64) error {
args := container.StartEstimation{} args := container.StartEstimation{}
args.SetEpoch(int64(epoch)) args.SetEpoch(int64(epoch))
@ -31,6 +34,9 @@ func (w *Wrapper) StopEstimation(epoch uint64) error {
// StopEstimationNotary votes to produce stop estimation notification through // StopEstimationNotary votes to produce stop estimation notification through
// notary contract. // notary contract.
//
// Deprecated: provide TryNotary() option to NewFromMorph
// and use StopEstimation.
func (w *Wrapper) StopEstimationNotary(epoch uint64) error { func (w *Wrapper) StopEstimationNotary(epoch uint64) error {
args := container.StopEstimation{} args := container.StopEstimation{}
args.SetEpoch(int64(epoch)) args.SetEpoch(int64(epoch))

View file

@ -21,9 +21,33 @@ type Wrapper struct {
client *container.Client client *container.Client
} }
// Option allows to set an optional
// parameter of ClientWrapper.
type Option func(*opts)
type opts []client.StaticClientOption
func defaultOpts() *opts {
return new(opts)
}
// TryNotaryInvoke returns option to enable
// notary invocation tries.
func TryNotary() Option {
return func(o *opts) {
*o = append(*o, client.TryNotary())
}
}
// NewFromMorph returns the wrapper instance from the raw morph client. // NewFromMorph returns the wrapper instance from the raw morph client.
func NewFromMorph(cli *client.Client, contract util.Uint160, fee fixedn.Fixed8) (*Wrapper, error) { func NewFromMorph(cli *client.Client, contract util.Uint160, fee fixedn.Fixed8, opts ...Option) (*Wrapper, error) {
staticClient, err := client.NewStatic(cli, contract, fee) o := defaultOpts()
for i := range opts {
opts[i](o)
}
staticClient, err := client.NewStatic(cli, contract, fee, ([]client.StaticClientOption)(*o)...)
if err != nil { if err != nil {
return nil, fmt.Errorf("can't create container static client: %w", err) return nil, fmt.Errorf("can't create container static client: %w", err)
} }