forked from TrueCloudLab/frostfs-node
[#720] pkg/innerring: Check Notary availability automatically
Do not read `without_notary` config value from env. Make morph client constructor return client without notary support. Enabling notary support should be done with public `EnableNotarySupport` method separately. Notary availability is deducted with client. Further, if notary is presented on chain its support is enabled at the corresponding client. Signed-off-by: Pavel Karpy <carpawell@nspcc.ru>
This commit is contained in:
parent
28aa0f521e
commit
896c749b92
4 changed files with 56 additions and 59 deletions
|
@ -303,7 +303,6 @@ func New(ctx context.Context, log *zap.Logger, cfg *viper.Viper) (*Server, error
|
||||||
|
|
||||||
// parse notary support
|
// parse notary support
|
||||||
server.feeConfig = config.NewFeeConfig(cfg)
|
server.feeConfig = config.NewFeeConfig(cfg)
|
||||||
server.mainNotaryConfig, server.sideNotaryConfig = parseNotaryConfigs(cfg)
|
|
||||||
|
|
||||||
// prepare inner ring node private key
|
// prepare inner ring node private key
|
||||||
acc, err := utilConfig.LoadAccount(
|
acc, err := utilConfig.LoadAccount(
|
||||||
|
@ -316,25 +315,6 @@ func New(ctx context.Context, log *zap.Logger, cfg *viper.Viper) (*Server, error
|
||||||
|
|
||||||
server.key = acc.PrivateKey()
|
server.key = acc.PrivateKey()
|
||||||
|
|
||||||
withoutMainNet := cfg.GetBool("without_mainnet")
|
|
||||||
|
|
||||||
// get all script hashes of contracts
|
|
||||||
server.contracts, err = parseContracts(
|
|
||||||
cfg,
|
|
||||||
withoutMainNet,
|
|
||||||
server.mainNotaryConfig.disabled,
|
|
||||||
server.sideNotaryConfig.disabled,
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// parse default validators
|
|
||||||
server.predefinedValidators, err = parsePredefinedValidators(cfg)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("ir: can't parse predefined validators list: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
morphChain := &chainParams{
|
morphChain := &chainParams{
|
||||||
log: log,
|
log: log,
|
||||||
cfg: cfg,
|
cfg: cfg,
|
||||||
|
@ -348,18 +328,14 @@ func New(ctx context.Context, log *zap.Logger, cfg *viper.Viper) (*Server, error
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// enable notary support in the client
|
|
||||||
var morphNotaryOpts []client.NotaryOption
|
|
||||||
if !server.sideNotaryConfig.disabled {
|
|
||||||
morphNotaryOpts = append(morphNotaryOpts, client.WithProxyContract(server.contracts.proxy))
|
|
||||||
}
|
|
||||||
|
|
||||||
// create morph client
|
// create morph client
|
||||||
server.morphClient, err = createClient(ctx, morphChain, morphNotaryOpts...)
|
server.morphClient, err = createClient(ctx, morphChain)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
withoutMainNet := cfg.GetBool("without_mainnet")
|
||||||
|
|
||||||
if withoutMainNet {
|
if withoutMainNet {
|
||||||
// This works as long as event Listener starts listening loop once,
|
// This works as long as event Listener starts listening loop once,
|
||||||
// otherwise Server.Start will run two similar routines.
|
// otherwise Server.Start will run two similar routines.
|
||||||
|
@ -376,21 +352,57 @@ func New(ctx context.Context, log *zap.Logger, cfg *viper.Viper) (*Server, error
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// enable notary support in the client
|
|
||||||
var mainnetNotaryOpts []client.NotaryOption
|
|
||||||
if !server.mainNotaryConfig.disabled {
|
|
||||||
mainnetNotaryOpts = append(mainnetNotaryOpts,
|
|
||||||
client.WithProxyContract(server.contracts.processing),
|
|
||||||
client.WithAlphabetSource(server.morphClient.Committee))
|
|
||||||
}
|
|
||||||
|
|
||||||
// create mainnet client
|
// create mainnet client
|
||||||
server.mainnetClient, err = createClient(ctx, mainnetChain, mainnetNotaryOpts...)
|
server.mainnetClient, err = createClient(ctx, mainnetChain)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
server.mainNotaryConfig, server.sideNotaryConfig = parseNotaryConfigs(
|
||||||
|
cfg,
|
||||||
|
server.morphClient.ProbeNotary(),
|
||||||
|
!withoutMainNet && server.mainnetClient.ProbeNotary(), // if mainnet disabled then notary flag must be disabled too
|
||||||
|
)
|
||||||
|
|
||||||
|
// get all script hashes of contracts
|
||||||
|
server.contracts, err = parseContracts(
|
||||||
|
cfg,
|
||||||
|
withoutMainNet,
|
||||||
|
server.mainNotaryConfig.disabled,
|
||||||
|
server.sideNotaryConfig.disabled,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if !server.sideNotaryConfig.disabled {
|
||||||
|
// enable notary support in the side client
|
||||||
|
err = server.morphClient.EnableNotarySupport(
|
||||||
|
client.WithProxyContract(server.contracts.proxy),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("could not enable side chain notary support: %w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !server.mainNotaryConfig.disabled {
|
||||||
|
// enable notary support in the main client
|
||||||
|
err = server.mainnetClient.EnableNotarySupport(
|
||||||
|
client.WithProxyContract(server.contracts.processing),
|
||||||
|
client.WithAlphabetSource(server.morphClient.Committee),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("could not enable main chain notary support: %w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// parse default validators
|
||||||
|
server.predefinedValidators, err = parsePredefinedValidators(cfg)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("ir: can't parse predefined validators list: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
server.pubKey = server.key.PublicKey().Bytes()
|
server.pubKey = server.key.PublicKey().Bytes()
|
||||||
|
|
||||||
auditPool, err := ants.NewPool(cfg.GetInt("audit.task.exec_pool_size"))
|
auditPool, err := ants.NewPool(cfg.GetInt("audit.task.exec_pool_size"))
|
||||||
|
@ -845,14 +857,13 @@ func createListener(ctx context.Context, p *chainParams) (event.Listener, error)
|
||||||
return listener, err
|
return listener, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func createClient(ctx context.Context, p *chainParams, notaryOpts ...client.NotaryOption) (*client.Client, error) {
|
func createClient(ctx context.Context, p *chainParams) (*client.Client, error) {
|
||||||
return client.New(
|
return client.New(
|
||||||
p.key,
|
p.key,
|
||||||
p.cfg.GetString(p.name+".endpoint.client"),
|
p.cfg.GetString(p.name+".endpoint.client"),
|
||||||
client.WithContext(ctx),
|
client.WithContext(ctx),
|
||||||
client.WithLogger(p.log),
|
client.WithLogger(p.log),
|
||||||
client.WithDialTimeout(p.cfg.GetDuration(p.name+".dial_timeout")),
|
client.WithDialTimeout(p.cfg.GetDuration(p.name+".dial_timeout")),
|
||||||
client.WithNotaryOptions(notaryOpts...),
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -73,18 +73,18 @@ func awaitNotaryDepositInClient(ctx context.Context, cli *client.Client, txHash
|
||||||
return errDepositTimeout
|
return errDepositTimeout
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseNotaryConfigs(cfg *viper.Viper) (main, side *notaryConfig) {
|
func parseNotaryConfigs(cfg *viper.Viper, withSideNotary, withMainNotary bool) (main, side *notaryConfig) {
|
||||||
main = new(notaryConfig)
|
main = new(notaryConfig)
|
||||||
side = new(notaryConfig)
|
side = new(notaryConfig)
|
||||||
|
|
||||||
if cfg.GetBool("without_notary") {
|
if !withSideNotary {
|
||||||
main.disabled = true
|
main.disabled = true
|
||||||
side.disabled = true
|
side.disabled = true
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
main.disabled = cfg.GetBool("without_main_notary")
|
main.disabled = withMainNotary
|
||||||
main.amount = fixedn.Fixed8(cfg.GetInt64("notary.main.deposit_amount"))
|
main.amount = fixedn.Fixed8(cfg.GetInt64("notary.main.deposit_amount"))
|
||||||
main.duration = cfg.GetUint32("timers.main_notary")
|
main.duration = cfg.GetUint32("timers.main_notary")
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,6 @@ package client
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/native/nativenames"
|
"github.com/nspcc-dev/neo-go/pkg/core/native/nativenames"
|
||||||
|
@ -28,8 +27,6 @@ type cfg struct {
|
||||||
gas util.Uint160 // native gas script-hash
|
gas util.Uint160 // native gas script-hash
|
||||||
|
|
||||||
waitInterval time.Duration
|
waitInterval time.Duration
|
||||||
|
|
||||||
notaryOpts []NotaryOption
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -47,6 +44,8 @@ func defaultConfig() *cfg {
|
||||||
}
|
}
|
||||||
|
|
||||||
// New creates, initializes and returns the Client instance.
|
// New creates, initializes and returns the Client instance.
|
||||||
|
// Notary support should be enabled with EnableNotarySupport client
|
||||||
|
// method separately.
|
||||||
//
|
//
|
||||||
// If private key is nil, it panics.
|
// If private key is nil, it panics.
|
||||||
//
|
//
|
||||||
|
@ -105,12 +104,6 @@ func New(key *keys.PrivateKey, endpoint string, opts ...Option) (*Client, error)
|
||||||
waitInterval: cfg.waitInterval,
|
waitInterval: cfg.waitInterval,
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(cfg.notaryOpts) != 0 {
|
|
||||||
if err := c.enableNotarySupport(cfg.notaryOpts...); err != nil {
|
|
||||||
return nil, fmt.Errorf("can't enable notary support: %w", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return c, nil
|
return c, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -155,10 +148,3 @@ func WithLogger(logger *logger.Logger) Option {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithNotaryOptions enables notary support and sets notary options for the client.
|
|
||||||
func WithNotaryOptions(opts ...NotaryOption) Option {
|
|
||||||
return func(c *cfg) {
|
|
||||||
c.notaryOpts = opts
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -65,10 +65,10 @@ func defaultNotaryConfig(c *Client) *notaryCfg {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// enableNotarySupport creates notary structure in client that provides
|
// EnableNotarySupport creates notary structure in client that provides
|
||||||
// ability for client to get alphabet keys from committee or provided source
|
// ability for client to get alphabet keys from committee or provided source
|
||||||
// and use proxy contract script hash to create tx for notary contract.
|
// and use proxy contract script hash to create tx for notary contract.
|
||||||
func (c *Client) enableNotarySupport(opts ...NotaryOption) error {
|
func (c *Client) EnableNotarySupport(opts ...NotaryOption) error {
|
||||||
cfg := defaultNotaryConfig(c)
|
cfg := defaultNotaryConfig(c)
|
||||||
|
|
||||||
for _, opt := range opts {
|
for _, opt := range opts {
|
||||||
|
|
Loading…
Reference in a new issue