diff --git a/cli/server/server.go b/cli/server/server.go index 15a86a2e0..05e1a3eeb 100644 --- a/cli/server/server.go +++ b/cli/server/server.go @@ -2,6 +2,7 @@ package server import ( "context" + "errors" "fmt" "os" "os/signal" @@ -14,10 +15,12 @@ import ( "github.com/nspcc-dev/neo-go/pkg/core/block" "github.com/nspcc-dev/neo-go/pkg/core/chaindump" "github.com/nspcc-dev/neo-go/pkg/core/storage" + "github.com/nspcc-dev/neo-go/pkg/core/transaction" "github.com/nspcc-dev/neo-go/pkg/io" "github.com/nspcc-dev/neo-go/pkg/network" "github.com/nspcc-dev/neo-go/pkg/network/metrics" "github.com/nspcc-dev/neo-go/pkg/rpc/server" + "github.com/nspcc-dev/neo-go/pkg/services/notary" "github.com/nspcc-dev/neo-go/pkg/services/oracle" "github.com/nspcc-dev/neo-go/pkg/services/stateroot" "github.com/urfave/cli" @@ -360,6 +363,32 @@ func mkConsensus(config network.ServerConfig, chain *core.Blockchain, serv *netw return srv, nil } +func mkP2PNotary(config network.ServerConfig, chain *core.Blockchain, serv *network.Server, log *zap.Logger) (*notary.Notary, error) { + if !config.P2PNotaryCfg.Enabled { + return nil, nil + } + if !chain.P2PSigExtensionsEnabled() { + return nil, errors.New("P2PSigExtensions are disabled, but Notary service is enabled") + } + cfg := notary.Config{ + MainCfg: config.P2PNotaryCfg, + Chain: chain, + Log: log, + } + n, err := notary.NewNotary(cfg, serv.Net, serv.GetNotaryPool(), func(tx *transaction.Transaction) error { + if err := serv.RelayTxn(tx); err != nil { + return fmt.Errorf("can't relay completed notary transaction: hash %s, error: %w", tx.Hash().StringLE(), err) + } + return nil + }) + if err != nil { + return nil, fmt.Errorf("failed to create Notary module: %w", err) + } + serv.AddService(n) + chain.SetNotary(n) + return n, nil +} + func startServer(ctx *cli.Context) error { cfg, err := getConfigFromContext(ctx) if err != nil { @@ -398,6 +427,10 @@ func startServer(ctx *cli.Context) error { if err != nil { return err } + _, err = mkP2PNotary(serverConfig, chain, serv, log) + if err != nil { + return err + } rpcServer := server.New(chain, cfg.ApplicationConfiguration.RPC, serv, oracleSrv, log) errChan := make(chan error) diff --git a/pkg/network/server.go b/pkg/network/server.go index f732e53ba..b1f0f43c6 100644 --- a/pkg/network/server.go +++ b/pkg/network/server.go @@ -23,7 +23,6 @@ import ( "github.com/nspcc-dev/neo-go/pkg/network/capability" "github.com/nspcc-dev/neo-go/pkg/network/extpool" "github.com/nspcc-dev/neo-go/pkg/network/payload" - "github.com/nspcc-dev/neo-go/pkg/services/notary" "github.com/nspcc-dev/neo-go/pkg/util" "go.uber.org/atomic" "go.uber.org/zap" @@ -78,7 +77,6 @@ type ( notaryRequestPool *mempool.Pool extensiblePool *extpool.Pool notaryFeer NotaryFeer - notaryModule *notary.Notary services []Service extensHandlers map[string]func(*payload.Extensible) error extensHighPrio string @@ -167,27 +165,6 @@ func newServerFromConstructors(config ServerConfig, chain blockchainer.Blockchai return bc.IsTxStillRelevant(t, txpool, true) }, s.notaryFeer) }) - if config.P2PNotaryCfg.Enabled { - cfg := notary.Config{ - MainCfg: config.P2PNotaryCfg, - Chain: chain, - Log: log, - } - n, err := notary.NewNotary(cfg, s.network, s.notaryRequestPool, func(tx *transaction.Transaction) error { - if err := s.RelayTxn(tx); err != nil { - return fmt.Errorf("can't relay completed notary transaction: hash %s, error: %w", tx.Hash().StringLE(), err) - } - return nil - }) - if err != nil { - return nil, fmt.Errorf("failed to create Notary module: %w", err) - } - s.notaryModule = n - s.services = append(s.services, n) - chain.SetNotary(n) - } - } else if config.P2PNotaryCfg.Enabled { - return nil, errors.New("P2PSigExtensions are disabled, but Notary service is enabled") } s.bQueue = newBlockQueue(maxBlockBatch, chain, log, func(b *block.Block) { s.tryStartServices() @@ -288,6 +265,11 @@ func (s *Server) AddExtensibleHPService(svc Service, category string, handler fu s.AddExtensibleService(svc, category, handler) } +// GetNotaryPool allows to retrieve notary pool, if it's configured. +func (s *Server) GetNotaryPool() *mempool.Pool { + return s.notaryRequestPool +} + // UnconnectedPeers returns a list of peers that are in the discovery peer list // but are not connected to the server. func (s *Server) UnconnectedPeers() []string {