2021-05-04 08:50:13 +00:00
|
|
|
package innerring
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
2021-10-11 17:09:52 +00:00
|
|
|
"fmt"
|
2021-05-04 08:50:13 +00:00
|
|
|
|
|
|
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
|
|
|
"github.com/nspcc-dev/neofs-node/pkg/morph/client"
|
2021-11-01 15:55:25 +00:00
|
|
|
"github.com/nspcc-dev/neofs-node/pkg/morph/event"
|
2021-05-04 08:50:13 +00:00
|
|
|
"github.com/spf13/viper"
|
2021-11-01 15:55:25 +00:00
|
|
|
"go.uber.org/zap"
|
2021-05-04 08:50:13 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
type (
|
|
|
|
notaryConfig struct {
|
2021-10-12 13:56:16 +00:00
|
|
|
disabled bool // true if notary disabled on chain
|
2021-05-04 08:50:13 +00:00
|
|
|
}
|
|
|
|
)
|
|
|
|
|
2021-10-11 17:09:52 +00:00
|
|
|
const (
|
|
|
|
// gasMultiplier defines how many times more the notary
|
|
|
|
// balance must be compared to the GAS balance of the IR:
|
|
|
|
// notaryBalance = GASBalance * gasMultiplier
|
|
|
|
gasMultiplier = 3
|
|
|
|
|
|
|
|
// gasDivisor defines what part of GAS balance (1/gasDivisor)
|
|
|
|
// should be transferred to the notary service
|
|
|
|
gasDivisor = 2
|
|
|
|
)
|
|
|
|
|
2021-05-04 08:50:13 +00:00
|
|
|
func (s *Server) depositMainNotary() (tx util.Uint256, err error) {
|
2021-10-11 17:09:52 +00:00
|
|
|
depositAmount, err := client.CalculateNotaryDepositAmount(s.mainnetClient, gasMultiplier, gasDivisor)
|
|
|
|
if err != nil {
|
|
|
|
return util.Uint256{}, fmt.Errorf("could not calculate main notary deposit amount: %w", err)
|
|
|
|
}
|
|
|
|
|
2021-05-04 08:50:13 +00:00
|
|
|
return s.mainnetClient.DepositNotary(
|
2021-10-11 17:09:52 +00:00
|
|
|
depositAmount,
|
|
|
|
uint32(s.epochDuration.Load())+notaryExtraBlocks,
|
2021-05-04 08:50:13 +00:00
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *Server) depositSideNotary() (tx util.Uint256, err error) {
|
2021-10-11 17:09:52 +00:00
|
|
|
depositAmount, err := client.CalculateNotaryDepositAmount(s.morphClient, gasMultiplier, gasDivisor)
|
|
|
|
if err != nil {
|
|
|
|
return util.Uint256{}, fmt.Errorf("could not calculate side notary deposit amount: %w", err)
|
|
|
|
}
|
|
|
|
|
2021-05-04 08:50:13 +00:00
|
|
|
return s.morphClient.DepositNotary(
|
2021-10-11 17:09:52 +00:00
|
|
|
depositAmount,
|
|
|
|
uint32(s.epochDuration.Load())+notaryExtraBlocks,
|
2021-05-04 08:50:13 +00:00
|
|
|
)
|
|
|
|
}
|
|
|
|
|
2021-11-01 15:55:25 +00:00
|
|
|
func (s *Server) notaryHandler(_ event.Event) {
|
|
|
|
if !s.mainNotaryConfig.disabled {
|
|
|
|
_, err := s.depositMainNotary()
|
|
|
|
if err != nil {
|
|
|
|
s.log.Error("can't make notary deposit in main chain", zap.Error(err))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if !s.sideNotaryConfig.disabled {
|
|
|
|
_, err := s.depositSideNotary()
|
|
|
|
if err != nil {
|
|
|
|
s.log.Error("can't make notary deposit in side chain", zap.Error(err))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-05-04 08:50:13 +00:00
|
|
|
func (s *Server) awaitMainNotaryDeposit(ctx context.Context, tx util.Uint256) error {
|
|
|
|
return awaitNotaryDepositInClient(ctx, s.mainnetClient, tx)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *Server) awaitSideNotaryDeposit(ctx context.Context, tx util.Uint256) error {
|
|
|
|
return awaitNotaryDepositInClient(ctx, s.morphClient, tx)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *Server) initNotary(ctx context.Context, deposit depositor, await awaiter, msg string) error {
|
|
|
|
tx, err := deposit()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
s.log.Info(msg)
|
|
|
|
|
|
|
|
return await(ctx, tx)
|
|
|
|
}
|
|
|
|
|
|
|
|
func awaitNotaryDepositInClient(ctx context.Context, cli *client.Client, txHash util.Uint256) error {
|
|
|
|
for i := 0; i < notaryDepositTimeout; i++ {
|
|
|
|
select {
|
|
|
|
case <-ctx.Done():
|
|
|
|
return nil
|
|
|
|
default:
|
|
|
|
}
|
|
|
|
|
|
|
|
ok, err := cli.TxHalt(txHash)
|
|
|
|
if err == nil {
|
|
|
|
if ok {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
return errDepositFail
|
|
|
|
}
|
|
|
|
|
2021-09-07 10:14:45 +00:00
|
|
|
_ = cli.Wait(ctx, 1)
|
2021-05-04 08:50:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return errDepositTimeout
|
|
|
|
}
|
|
|
|
|
2021-07-23 14:37:56 +00:00
|
|
|
func parseNotaryConfigs(cfg *viper.Viper, withSideNotary, withMainNotary bool) (main, side *notaryConfig) {
|
2021-05-04 08:50:13 +00:00
|
|
|
main = new(notaryConfig)
|
|
|
|
side = new(notaryConfig)
|
|
|
|
|
2021-07-23 14:37:56 +00:00
|
|
|
if !withSideNotary {
|
2021-05-04 08:50:13 +00:00
|
|
|
main.disabled = true
|
|
|
|
side.disabled = true
|
|
|
|
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2021-08-03 17:51:02 +00:00
|
|
|
main.disabled = !withMainNotary
|
2021-05-04 08:50:13 +00:00
|
|
|
|
|
|
|
return
|
|
|
|
}
|