[#493] node: Connect to main chain

Establish client connection with main chain node on storage node startup.
Client is configured simlarly to morph client.

Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
This commit is contained in:
Leonard Lyubich 2021-05-11 13:24:13 +03:00 committed by Alex Vanin
parent 1fa49bca9c
commit 6339f1a468
2 changed files with 47 additions and 21 deletions

View file

@ -80,6 +80,9 @@ const (
cfgMorphNotifyRPCAddress = "morph.notification_endpoint" cfgMorphNotifyRPCAddress = "morph.notification_endpoint"
cfgMorphNotifyDialTimeout = "morph.dial_timeout" cfgMorphNotifyDialTimeout = "morph.dial_timeout"
cfgMainChainRPCAddress = "mainchain.rpc_endpoint"
cfgMainChainDialTimeout = "mainchain.dial_timeout"
// config keys for cfgAccounting // config keys for cfgAccounting
cfgAccountingContract = "accounting.scripthash" cfgAccountingContract = "accounting.scripthash"
cfgAccountingFee = "accounting.fee" cfgAccountingFee = "accounting.fee"
@ -219,6 +222,8 @@ type cfg struct {
closers []func() closers []func()
cfgReputation cfgReputation cfgReputation cfgReputation
mainChainClient *client.Client
} }
type cfgGRPC struct { type cfgGRPC struct {

View file

@ -4,6 +4,7 @@ import (
"context" "context"
"errors" "errors"
"fmt" "fmt"
"time"
"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/util" "github.com/nspcc-dev/neo-go/pkg/util"
@ -27,31 +28,51 @@ var (
func initMorphComponents(c *cfg) { func initMorphComponents(c *cfg) {
var err error var err error
addresses := c.viper.GetStringSlice(cfgMorphRPCAddress) fn := func(endpointCfg, dialTOCfg string, handler func(*client.Client)) {
if len(addresses) == 0 { addresses := c.viper.GetStringSlice(endpointCfg)
fatalOnErr(errNoRPCEndpoints) if len(addresses) == 0 {
} fatalOnErr(errNoRPCEndpoints)
crand := rand.New() // math/rand with cryptographic source
crand.Shuffle(len(addresses), func(i, j int) {
addresses[i], addresses[j] = addresses[j], addresses[i]
})
for i := range addresses {
c.cfgMorph.client, err = client.New(c.key, addresses[i])
if err == nil {
c.log.Info("neo RPC connection established",
zap.String("endpoint", addresses[i]))
break
} }
c.log.Info("failed to establish neo RPC connection, trying another", crand := rand.New() // math/rand with cryptographic source
zap.String("endpoint", addresses[i]), crand.Shuffle(len(addresses), func(i, j int) {
zap.String("error", err.Error())) addresses[i], addresses[j] = addresses[j], addresses[i]
})
var dialTimeout time.Duration
if dialTOCfg != "" {
dialTimeout = c.viper.GetDuration(dialTOCfg)
}
for i := range addresses {
cli, err := client.New(c.key, addresses[i], client.WithDialTimeout(dialTimeout))
if err == nil {
c.log.Info("neo RPC connection established",
zap.String("endpoint", addresses[i]))
handler(cli)
break
}
c.log.Info("failed to establish neo RPC connection, trying another",
zap.String("endpoint", addresses[i]),
zap.String("error", err.Error()))
}
fatalOnErr(err)
} }
fatalOnErr(err) // replace to a separate initialing block during refactoring
// since current function initializes sidechain components
fn(cfgMainChainRPCAddress, cfgMainChainDialTimeout, func(cli *client.Client) {
c.mainChainClient = cli
})
fn(cfgMorphRPCAddress, "", func(cli *client.Client) {
c.cfgMorph.client = cli
})
staticClient, err := client.NewStatic( staticClient, err := client.NewStatic(
c.cfgMorph.client, c.cfgMorph.client,