nitro server fixes

inject logger into slog for nitro
This commit is contained in:
Roy Crihfield 2025-01-03 15:37:13 +08:00
parent ba0ba384fc
commit 49a9af72d5
7 changed files with 128 additions and 25 deletions

View File

@ -149,7 +149,7 @@ func InitRootCmd[T app.Tx](
// nitrobank := deps.ModuleManager.Modules()[nitrobank.ModuleName].(nitrobank.AppModule)
// accounts := deps.ModuleManager.Modules()[accounts.ModuleName]
nitroServer, err := nitro.New(logger, deps.GlobalConfig)
nitroServer, err := nitro.NewServer(logger, deps.GlobalConfig, deps.ClientContext)
if err != nil {
return nil, err
}

94
cmd/laconicd/cmd/log.go Normal file
View File

@ -0,0 +1,94 @@
package cmd
import (
"fmt"
"io"
"log/slog"
"math"
"time"
"cosmossdk.io/core/server"
"cosmossdk.io/log"
sdk_slog "cosmossdk.io/log/slog"
serverv2 "cosmossdk.io/server/v2"
"github.com/lmittmann/tint"
)
// TODO stderr logger?
func newSlogLogger(cfg server.ConfigMap, out io.Writer) (log.Logger, error) {
handler, err := newSlogHandler(cfg, out)
if err != nil {
return nil, err
}
return sdk_slog.NewCustomLogger(slog.New(handler)), nil
}
// newSlogHandler creates a slog handler based on the server configuration.
func newSlogHandler(cfg server.ConfigMap, out io.Writer) (slog.Handler, error) {
var (
format string
noColor bool
trace bool
level string
)
if v, ok := cfg[serverv2.FlagLogFormat]; ok {
format = v.(string)
}
if v, ok := cfg[serverv2.FlagLogNoColor]; ok {
noColor = v.(bool)
}
if v, ok := cfg[serverv2.FlagTrace]; ok {
trace = v.(bool)
}
if v, ok := cfg[serverv2.FlagLogLevel]; ok {
level = v.(string)
}
_ = trace
logLvl, err := parseSlogLevel(level)
if err != nil {
// If the log level is not a valid zerolog level, then we try to parse it as a key filter.
filterFunc, err := log.ParseLogLevel(level, parseSlogLevel)
if err != nil {
return nil, err
}
out = log.NewFilterWriter(out, filterFunc)
}
var handler slog.Handler
// if json format is requested, ignore no_color
if format == serverv2.OutputFormatJSON {
handler = slog.NewJSONHandler(out, &slog.HandlerOptions{
Level: logLvl,
})
} else {
handler = tint.NewHandler(out, &tint.Options{
Level: logLvl,
TimeFormat: time.Kitchen,
NoColor: noColor,
})
}
return handler, nil
}
func parseSlogLevel(l string) (slog.Level, error) {
// Legal log level values are hardcoded into server/v2 command factory:
// (trace|debug|info|warn|error|fatal|panic|disabled or '*:<level>,<key>:<level>')
// however, slog only has debug, info, warn, error
switch l {
case "debug", "trace":
return slog.LevelDebug, nil
case "info":
return slog.LevelInfo, nil
case "warn":
return slog.LevelWarn, nil
case "error":
return slog.LevelError, nil
case "fatal", "panic":
return slog.LevelError, nil
case "disabled":
return slog.Level(math.MaxInt), nil
}
return 0, fmt.Errorf("invalid log level: %s", l)
}

View File

@ -42,6 +42,7 @@ func NewRootCmd[T app.Tx](
serverv2.WithConfigWriter(configWriter),
serverv2.WithStdDefaultHomeDir(DefaultNodeHome),
serverv2.WithLoggerFactory(serverv2.NewLogger),
// serverv2.WithLoggerFactory(newSlogLogger),
)
if err != nil {
return nil, err

3
go.mod
View File

@ -69,6 +69,7 @@ require (
cosmossdk.io/x/protocolpool v1.0.0-alpha.4
cosmossdk.io/x/slashing v0.0.0-20241007000829-38662ecb209f
cosmossdk.io/x/staking v1.0.0-alpha.4
github.com/lmittmann/tint v1.0.2
)
require (
@ -222,7 +223,6 @@ require (
github.com/libp2p/go-reuseport v0.4.0 // indirect
github.com/libp2p/go-yamux/v4 v4.0.1 // indirect
github.com/linxGnu/grocksdb v1.9.3 // indirect
github.com/lmittmann/tint v1.0.2 // indirect
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
github.com/magiconair/properties v1.8.7 // indirect
github.com/manifoldco/promptui v0.9.0 // indirect
@ -384,6 +384,7 @@ replace (
cosmossdk.io/client/v2 => ../mod/cosmos-sdk/client/v2
cosmossdk.io/core/testing => ../mod/cosmos-sdk/core/testing
cosmossdk.io/depinject => ../mod/cosmos-sdk/depinject
cosmossdk.io/log => ../mod/cosmos-sdk/log
cosmossdk.io/runtime/v2 => ../mod/cosmos-sdk/runtime/v2
cosmossdk.io/server/v2 => ../mod/cosmos-sdk/server/v2
cosmossdk.io/server/v2/appmanager => ../mod/cosmos-sdk/server/v2/appmanager

2
go.sum
View File

@ -14,8 +14,6 @@ cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0=
cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U=
cosmossdk.io/errors/v2 v2.0.0-20240731132947-df72853b3ca5 h1:IQNdY2kB+k+1OM2DvqFG1+UgeU1JzZrWtwuWzI3ZfwA=
cosmossdk.io/errors/v2 v2.0.0-20240731132947-df72853b3ca5/go.mod h1:0CuYKkFHxc1vw2JC+t21THBCALJVROrWVR/3PQ1urpc=
cosmossdk.io/log v1.5.0 h1:dVdzPJW9kMrnAYyMf1duqacoidB9uZIl+7c6z0mnq0g=
cosmossdk.io/log v1.5.0/go.mod h1:Tr46PUJjiUthlwQ+hxYtUtPn4D/oCZXAkYevBeh5+FI=
cosmossdk.io/math v1.4.0 h1:XbgExXFnXmF/CccPPEto40gOO7FpWu9yWNAZPN3nkNQ=
cosmossdk.io/math v1.4.0/go.mod h1:O5PkD4apz2jZs4zqFdTr16e1dcaQCc5z6lkEnrrppuk=
cosmossdk.io/schema v0.3.1-0.20241128094659-bd76b47e1d8b h1:svpFdulZRrYz+RTHu2u9CeKkMKrIHx5354vjiHerovo=

View File

@ -9,9 +9,9 @@ type Config struct {
EthUrl string `mapstructure:"eth-url" toml:"eth-url" comment:"eth-url specifies the URL of the Ethereum node to connect to."`
EthAuthToken string `mapstructure:"eth-auth-token" toml:"eth-auth-token" comment:"eth-auth-token specifies the bearer token used for auth in requests to the Ethereum chain's RPC endpoint."`
EthStartBlock uint64 `mapstructure:"eth-start-block" toml:"eth-start-block" comment:"eth-start-block specifies the Ethereum block number to start listening for Nitro Adjudicator events."`
NaAddress string `mapstructure:"na-address" toml:"na-address" comment:"na-address specifies the address of the Nitro Adjudicator contract."`
VpaAddress string `mapstructure:"vpa-address" toml:"vpa-address" comment:"vpa-address specifies the address of the Virtual Payment App contract."`
CaAddress string `mapstructure:"ca-address" toml:"ca-address" comment:"ca-address specifies the address of the Consensus App contract."`
EthNaAddress string `mapstructure:"eth-na-address" toml:"na-address" comment:"na-address specifies the address of the Nitro Adjudicator contract."`
EthVpaAddress string `mapstructure:"eth-vpa-address" toml:"vpa-address" comment:"vpa-address specifies the address of the Virtual Payment App contract."`
EthCaAddress string `mapstructure:"eth-ca-address" toml:"ca-address" comment:"ca-address specifies the address of the Consensus App contract."`
BootPeers string `mapstructure:"boot-peers" toml:"boot-peers" comment:"boot-peers is a comma-delimited list of peer multiaddrs the messaging service will connect to when initialized."`
PublicIp string `mapstructure:"public-ip" toml:"public-ip" comment:"public-ip specifies the public IP address used for the message service."`

View File

@ -3,7 +3,9 @@ package nitro
import (
"context"
"encoding/hex"
"errors"
"fmt"
"log/slog"
"path/filepath"
"strings"
@ -55,11 +57,12 @@ type Server struct {
ScAddr types.PartyAddress
}
func New(logger log.Logger, cfg server.ConfigMap) (*Server, error) {
func NewServer(logger log.Logger, cfg server.ConfigMap, clientCtx client.Context) (*Server, error) {
home, _ := cfg[serverv2.FlagHome].(string)
s := &Server{
logger: logger.With(log.ModuleKey, serverName),
storeDir: filepath.Join(home, "nitro")}
storeDir: filepath.Join(home, "nitro"),
}
s.config = s.Config().(*Config)
if len(cfg) > 0 {
@ -67,19 +70,15 @@ func New(logger log.Logger, cfg server.ConfigMap) (*Server, error) {
return nil, fmt.Errorf("failed to unmarshal config: %w", err)
}
}
return s, nil
return s, s.init(clientCtx)
}
func (s *Server) init(ctx context.Context) error {
func (s *Server) init(clientCtx client.Context) error {
c := s.config
var clientCtx client.Context
if v := ctx.Value(client.ClientContextKey); v != nil {
clientCtx = v.(client.Context)
}
sckey, err := extractPrivKeyBytes(clientCtx.Keyring, c.Pk)
if err != nil {
return nil
return err
}
ethkey, err := extractPrivKeyBytes(clientCtx.Keyring, c.EthPk)
if err != nil {
@ -97,12 +96,15 @@ func (s *Server) init(ctx context.Context) error {
UseDurableStore: true,
DurableStoreFolder: s.storeDir,
}
var bootPeers []string
if c.BootPeers != "" {
bootPeers = strings.Split(c.BootPeers, ",")
}
messageOpts := p2pms.MessageOpts{
PkBytes: sckey,
TcpPort: c.MsgPort,
WsMsgPort: c.WsMsgPort,
BootPeers: strings.Split(c.BootPeers, ","),
BootPeers: bootPeers,
PublicIp: c.PublicIp,
ExtMultiAddr: c.ExtMultiAddr,
}
@ -111,10 +113,16 @@ func (s *Server) init(ctx context.Context) error {
ChainStartBlockNum: c.EthStartBlock,
ChainAuthToken: c.EthAuthToken,
ChainPk: hex.EncodeToString(ethkey),
NaAddress: common.HexToAddress(c.NaAddress),
VpaAddress: common.HexToAddress(c.VpaAddress),
CaAddress: common.HexToAddress(c.CaAddress),
NaAddress: common.HexToAddress(c.EthNaAddress),
VpaAddress: common.HexToAddress(c.EthVpaAddress),
CaAddress: common.HexToAddress(c.EthCaAddress),
}
loggerImpl, ok := s.logger.Impl().(*slog.Logger)
if !ok {
return errors.New("logger does not have slog implementation")
}
slog.SetDefault(loggerImpl)
node, store, _, _, err := initNode(s.logger, chainOpts, storeOpts, messageOpts, &engine.PermissivePolicy{})
if err != nil {
return err
@ -171,7 +179,7 @@ func initNode(
policymaker,
)
return &node, ourStore, messageService, ourChain, nil
return node, ourStore, messageService, ourChain, nil
}
func (s *Server) Name() string {
@ -179,13 +187,14 @@ func (s *Server) Name() string {
}
func (s *Server) Start(ctx context.Context) error {
s.logger.Info("starting Nitro server",
"rpc-port", fmt.Sprintf("http://%s:%d", s.config.PublicIp, s.config.RpcPort))
s.Node.Start()
return nil
}
func (s *Server) Stop(context.Context) error {
return nil
return s.Close()
}
func (s *Server) Config() any {