forked from TrueCloudLab/frostfs-node
[#1496] morph: Move tx waiter to morph package
Signed-off-by: Evgenii Stratonikov <e.stratonikov@yadro.com>
This commit is contained in:
parent
d77a218f7c
commit
69c63006da
2 changed files with 62 additions and 44 deletions
|
@ -17,11 +17,7 @@ import (
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/util/rand"
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/util/rand"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/state"
|
"github.com/nspcc-dev/neo-go/pkg/core/state"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/neorpc/result"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/rpcclient/waiter"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract/trigger"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/util"
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/vm/vmstate"
|
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -164,49 +160,14 @@ func makeNotaryDeposit(ctx context.Context, c *cfg) (util.Uint256, uint32, error
|
||||||
return c.cfgMorph.client.DepositEndlessNotary(ctx, depositAmount)
|
return c.cfgMorph.client.DepositEndlessNotary(ctx, depositAmount)
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
|
||||||
errNotaryDepositFail = errors.New("notary deposit tx has faulted")
|
|
||||||
errNotaryDepositTimeout = errors.New("notary deposit tx has not appeared in the network")
|
|
||||||
)
|
|
||||||
|
|
||||||
type waiterClient struct {
|
|
||||||
c *client.Client
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *waiterClient) Context() context.Context {
|
|
||||||
return context.Background()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *waiterClient) GetApplicationLog(hash util.Uint256, trig *trigger.Type) (*result.ApplicationLog, error) {
|
|
||||||
return w.c.GetApplicationLog(hash, trig)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *waiterClient) GetBlockCount() (uint32, error) {
|
|
||||||
return w.c.BlockCount()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *waiterClient) GetVersion() (*result.Version, error) {
|
|
||||||
return w.c.GetVersion()
|
|
||||||
}
|
|
||||||
|
|
||||||
func waitNotaryDeposit(ctx context.Context, c *cfg, tx util.Uint256, vub uint32) error {
|
func waitNotaryDeposit(ctx context.Context, c *cfg, tx util.Uint256, vub uint32) error {
|
||||||
w, err := waiter.NewPollingBased(&waiterClient{c: c.cfgMorph.client})
|
if err := c.cfgMorph.client.WaitTxHalt(ctx, client.WaitParams{Hash: tx, ValidUntilBlock: vub}); err != nil {
|
||||||
if err != nil {
|
return err
|
||||||
return fmt.Errorf("could not create notary deposit waiter: %w", err)
|
|
||||||
}
|
}
|
||||||
res, err := w.WaitAny(ctx, vub, tx)
|
|
||||||
if err != nil {
|
|
||||||
if errors.Is(err, waiter.ErrTxNotAccepted) {
|
|
||||||
return errNotaryDepositTimeout
|
|
||||||
}
|
|
||||||
return fmt.Errorf("could not wait for notary deposit persists in chain: %w", err)
|
|
||||||
}
|
|
||||||
if res.Execution.VMState.HasFlag(vmstate.Halt) {
|
|
||||||
c.log.Info(ctx, logs.ClientNotaryDepositTransactionWasSuccessfullyPersisted)
|
c.log.Info(ctx, logs.ClientNotaryDepositTransactionWasSuccessfullyPersisted)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return errNotaryDepositFail
|
|
||||||
}
|
|
||||||
|
|
||||||
func listenMorphNotifications(ctx context.Context, c *cfg) {
|
func listenMorphNotifications(ctx context.Context, c *cfg) {
|
||||||
var (
|
var (
|
||||||
|
|
57
pkg/morph/client/waiter.go
Normal file
57
pkg/morph/client/waiter.go
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
package client
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/neorpc/result"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/rpcclient/waiter"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract/trigger"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/vm/vmstate"
|
||||||
|
)
|
||||||
|
|
||||||
|
// WaitParams represents transaction to wait for.
|
||||||
|
type WaitParams struct {
|
||||||
|
Hash util.Uint256
|
||||||
|
ValidUntilBlock uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
type waiterClient struct {
|
||||||
|
c *Client
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *waiterClient) Context() context.Context {
|
||||||
|
return context.Background()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *waiterClient) GetApplicationLog(hash util.Uint256, trig *trigger.Type) (*result.ApplicationLog, error) {
|
||||||
|
return w.c.GetApplicationLog(hash, trig)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *waiterClient) GetBlockCount() (uint32, error) {
|
||||||
|
return w.c.BlockCount()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *waiterClient) GetVersion() (*result.Version, error) {
|
||||||
|
return w.c.GetVersion()
|
||||||
|
}
|
||||||
|
|
||||||
|
// WaitTxHalt waits until transaction with the specified hash persists on the blockchain.
|
||||||
|
// It also checks execution result to finish in HALT state.
|
||||||
|
func (c *Client) WaitTxHalt(ctx context.Context, p WaitParams) error {
|
||||||
|
w, err := waiter.NewPollingBased(&waiterClient{c: c})
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("create tx waiter: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
res, err := w.WaitAny(ctx, p.ValidUntilBlock, p.Hash)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("wait until tx persists: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if res.VMState.HasFlag(vmstate.Halt) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return wrapFrostFSError(¬HaltStateError{state: res.VMState.String(), exception: res.FaultException})
|
||||||
|
}
|
Loading…
Reference in a new issue