Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ Changelog for NeoFS Node
- Graveyard from metabase (#3744)

### Updated
- `github.com/nspcc-dev/neofs-contract` module to `v0.25.2-0.20251219150129-498a820b9d6b` (#3670, #3746)
- `github.com/nspcc-dev/neo-go` module to `v0.114.1-0.20251222145711-e174185e133e` (#3742)
- `github.com/nspcc-dev/neofs-contract` module to `v0.25.2-0.20251223154102-15c76da7ea19` (#3670, #3746, #3742)
- `github.com/nspcc-dev/neofs-sdk-go` module to `v1.0.0-rc.16.0.20251203135706-86667929fbb8` (#3711)
- `github.com/nspcc-dev/locode-db` module to `v0.8.2` (#3729)

Expand Down
2 changes: 2 additions & 0 deletions cmd/neofs-node/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ import (
"github.com/nspcc-dev/neofs-node/pkg/services/replicator"
trustcontroller "github.com/nspcc-dev/neofs-node/pkg/services/reputation/local/controller"
truststorage "github.com/nspcc-dev/neofs-node/pkg/services/reputation/local/storage"
"github.com/nspcc-dev/neofs-node/pkg/services/sidechain"
"github.com/nspcc-dev/neofs-node/pkg/timers"
"github.com/nspcc-dev/neofs-node/pkg/util"
"github.com/nspcc-dev/neofs-node/pkg/util/state"
Expand Down Expand Up @@ -172,6 +173,7 @@ type shared struct {
control *controlSvc.Server

metaService *meta.Meta
sidechain *sidechain.SideChain

containerPayments *paymentChecker
}
Expand Down
35 changes: 34 additions & 1 deletion cmd/neofs-node/config/meta/meta.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,39 @@
package metaconfig

import (
"time"

"github.com/nspcc-dev/neofs-node/pkg/innerring/config"
)

// Meta contains configuration for Meta service.
type Meta struct {
Path string `mapstructure:"path"`
// List of nodes' addresses to communicate with over Neo P2P protocol in
// 'host:port' format.
//
// Optional: by default, node runs as standalone.
SeedNodes []string `mapstructure:"seed_nodes"`

// Storage configuration. Must be set using one of constructors like BoltDB.
//
// Required.
Storage config.Storage `mapstructure:"storage"`

// Maximum time period (approximate) between two adjacent blocks,
// if used enables dynamic block time (contrary to TimePerBlock
// targeting for every block).
//
// Optional: not set by default. Must not be negative, must be
// bigger than TimePerBlock.
MaxTimePerBlock time.Duration `mapstructure:"max_time_per_block"`

// Neo RPC service configuration.
//
// Optional: see RPC defaults.
RPC config.RPC `mapstructure:"rpc"`

// P2P settings.
//
// Required.
P2P config.P2P `mapstructure:"p2p"`
}
1 change: 1 addition & 0 deletions cmd/neofs-node/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ func initApp(c *cfg) {
initAndLog(c, "session", initSessionService)
initAndLog(c, "reputation", initReputationService)
initAndLog(c, "meta", initMeta)
initAndLog(c, "meta sidechain", initMeta_new)
initAndLog(c, "object", initObjectService)

initAndLog(c, "morph notifications", listenMorphNotifications)
Expand Down
70 changes: 34 additions & 36 deletions cmd/neofs-node/meta.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,52 +10,50 @@ import (
"github.com/nspcc-dev/neofs-node/pkg/core/container"
"github.com/nspcc-dev/neofs-node/pkg/core/netmap"
cntClient "github.com/nspcc-dev/neofs-node/pkg/morph/client/container"
"github.com/nspcc-dev/neofs-node/pkg/services/meta"
getsvc "github.com/nspcc-dev/neofs-node/pkg/services/object/get"
containerSDK "github.com/nspcc-dev/neofs-sdk-go/container"
cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
netmapsdk "github.com/nspcc-dev/neofs-sdk-go/netmap"
"github.com/nspcc-dev/neofs-sdk-go/object"
oid "github.com/nspcc-dev/neofs-sdk-go/object/id"
"go.uber.org/zap"
"golang.org/x/sync/errgroup"
)

func initMeta(c *cfg) {
if c.cfgMorph.client == nil {
initMorphComponents(c)
}

c.cfgMeta.network = &neofsNetwork{
key: c.binPublicKey,
cnrClient: c.cCli,
containers: c.cnrSrc,
network: c.netMapSource,
header: c.cfgObject.getSvc,
}

var err error
p := meta.Parameters{
Logger: c.log.With(zap.String("service", "meta data")),
Network: c.cfgMeta.network,
Timeout: c.appCfg.FSChain.DialTimeout,
NeoEnpoints: c.appCfg.FSChain.Endpoints,
ContainerHash: c.containerSH,
NetmapHash: c.netmapSH,
RootPath: c.appCfg.Meta.Path,
}
if p.RootPath == "" {
p.RootPath = "metadata"
}
c.metaService, err = meta.New(p)
fatalOnErr(err)

c.workers = append(c.workers, newWorkerFromFunc(func(ctx context.Context) {
err = c.metaService.Run(ctx)
if err != nil {
c.internalErr <- fmt.Errorf("meta data service error: %w", err)
}
}))
//if c.cfgMorph.client == nil {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it supposed to be commented out?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not, it is a temporary migration/merging of old and new meta services for SNs

// initMorphComponents(c)
//}
//
//c.cfgMeta.network = &neofsNetwork{
// key: c.binPublicKey,
// cnrClient: c.cCli,
// containers: c.cnrSrc,
// network: c.netMapSource,
// header: c.cfgObject.getSvc,
//}
//
//var err error
//p := meta.Parameters{
// Logger: c.log.With(zap.String("service", "metadata chain")),
// Network: c.cfgMeta.network,
// Timeout: c.appCfg.FSChain.DialTimeout,
// NeoEnpoints: c.appCfg.FSChain.Endpoints,
// ContainerHash: c.containerSH,
// NetmapHash: c.netmapSH,
// RootPath: c.appCfg.Meta.Path,
//}
//if p.RootPath == "" {
// p.RootPath = "metadata"
//}
//c.metaService, err = meta.New(p)
//fatalOnErr(err)
//
//c.workers = append(c.workers, newWorkerFromFunc(func(ctx context.Context) {
// err = c.metaService.Run(ctx)
// if err != nil {
// c.internalErr <- fmt.Errorf("meta data service error: %w", err)
// }
//}))
}

type neofsNetwork struct {
Expand Down
169 changes: 169 additions & 0 deletions cmd/neofs-node/meta_new.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
package main

import (
"context"
"fmt"
"time"

"github.com/nspcc-dev/neo-go/pkg/config"
"github.com/nspcc-dev/neo-go/pkg/core/native/noderoles"
"github.com/nspcc-dev/neo-go/pkg/core/storage/dbconfig"
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
"github.com/nspcc-dev/neo-go/pkg/encoding/fixedn"
"github.com/nspcc-dev/neofs-node/pkg/services/sidechain"
"go.uber.org/zap"
)

func initMeta_new(c *cfg) {
l := c.log.With(zap.String("component", "metadata chain"))

v, err := c.cfgMorph.client.GetVersion()
fatalOnErr(err)

fsChainProtocol := v.Protocol
standByCommittee := make([]string, 0, len(v.Protocol.StandbyCommittee))
for _, c := range v.Protocol.StandbyCommittee {
standByCommittee = append(standByCommittee, c.StringCompressed())
}

p2pCfg := c.appCfg.Meta.P2P

var chainCfg = config.Config{
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i would like to be validated on what exact minimum config is enough for an RPC node to start. see applySidechainDefaults also below

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See the reviewcomments below.

ProtocolConfiguration: config.ProtocolConfiguration{
Copy link
Member

@AnnaShaleva AnnaShaleva Dec 19, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just for the record: I don't see Hardforks being set. It means that all stable hardforks are active starting from genesis. It's expected and correct behaviour for meta chain, I'm just letting you know that.

However, NeoGo is continuously adding more hardforks, so if some new hardfork is added, then it may affect states after subsequent NeoGo dependency update in meta chain. So to me, it's better to explicitly set all desired hardfork heights to 0 here.

CommitteeHistory: nil,
Genesis: config.Genesis{
MaxTraceableBlocks: fsChainProtocol.MaxTraceableBlocks,
MaxValidUntilBlockIncrement: fsChainProtocol.MaxValidUntilBlockIncrement,
Roles: map[noderoles.Role]keys.PublicKeys{
noderoles.P2PNotary: v.Protocol.StandbyCommittee,
noderoles.NeoFSAlphabet: v.Protocol.StandbyCommittee,
},
TimePerBlock: time.Duration(fsChainProtocol.MillisecondsPerBlock) * time.Millisecond,
},
Magic: fsChainProtocol.Network + 1,
InitialGASSupply: fsChainProtocol.InitialGasDistribution,
P2PNotaryRequestPayloadPoolSize: 1000,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MaxTraceableBlocks: fsChainProtocol.MaxTraceableBlocks,
MaxValidUntilBlockIncrement: fsChainProtocol.MaxValidUntilBlockIncrement,
P2PSigExtensions: true,
SeedList: c.appCfg.Meta.SeedNodes,
StandbyCommittee: standByCommittee,
StateRootInHeader: false,
MaxTimePerBlock: c.appCfg.Meta.MaxTimePerBlock,
ValidatorsCount: uint32(len(standByCommittee)),
ValidatorsHistory: nil,
VerifyTransactions: true,
},
ApplicationConfiguration: config.ApplicationConfiguration{
P2P: config.P2P{
Addresses: p2pCfg.Listen,
AttemptConnPeers: int(p2pCfg.Peers.Attempts),
DialTimeout: p2pCfg.DialTimeout,
MaxPeers: int(p2pCfg.Peers.Max),
MinPeers: int(p2pCfg.Peers.Min),
PingInterval: p2pCfg.Ping.Interval,
PingTimeout: p2pCfg.Ping.Timeout,
ProtoTickInterval: p2pCfg.ProtoTickInterval,
},
Oracle: config.OracleConfiguration{},
P2PNotary: config.P2PNotary{},
StateRoot: config.StateRoot{},
NeoFSBlockFetcher: config.NeoFSBlockFetcher{},
NeoFSStateFetcher: config.NeoFSStateFetcher{},
},
}

var cfgDB dbconfig.DBConfiguration
cfgDB.Type = c.appCfg.Meta.Storage.Type
switch c.appCfg.Meta.Storage.Type {
case dbconfig.BoltDB:
cfgDB.BoltDBOptions.FilePath = c.appCfg.Meta.Storage.Path
case dbconfig.LevelDB:
cfgDB.LevelDBOptions.DataDirectoryPath = c.appCfg.Meta.Storage.Path
default:
panic(fmt.Sprintf("unsupported metadata storage type: %s", c.appCfg.Meta.Storage.Type))
}
chainCfg.ApplicationConfiguration.DBConfiguration = cfgDB

if len(c.appCfg.Meta.RPC.Listen) > 0 {
var (
rpcConfig config.RPC
rpcCfgRead = c.appCfg.Meta.RPC
)

rpcConfig.BasicService = config.BasicService{
Enabled: true,
Addresses: c.appCfg.Meta.RPC.Listen,
}
rpcConfig.MaxGasInvoke = fixedn.Fixed8FromInt64(int64(rpcCfgRead.MaxGasInvoke))
rpcConfig.MaxIteratorResultItems = 100
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use https://github.com/nspcc-dev/neo-go/blob/2aef3337eed2994ec756bcd145502ce82eb7e7c1/pkg/config/config.go#L28 if you need to set the default. Keep it empty in case if you're OK with server defaults, the config will be sanitized on RPC server construction, ref. https://github.com/nspcc-dev/neo-go/blob/2aef3337eed2994ec756bcd145502ce82eb7e7c1/pkg/services/rpcsrv/server.go#L286.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

rpcConfig.MaxWebSocketClients = int(rpcCfgRead.MaxWebSocketClients)
rpcConfig.SessionEnabled = true
rpcConfig.SessionExpansionEnabled = true
rpcConfig.SessionPoolSize = int(rpcCfgRead.SessionPoolSize)
rpcConfig.StartWhenSynchronized = true
if tlsCfg := rpcCfgRead.TLS; tlsCfg.Enabled {
rpcConfig.TLSConfig.Enabled = true
rpcConfig.TLSConfig.Addresses = tlsCfg.Listen
rpcConfig.TLSConfig.CertFile = tlsCfg.CertFile
rpcConfig.TLSConfig.KeyFile = tlsCfg.KeyFile
}

chainCfg.ApplicationConfiguration.RPC = rpcConfig
}

applySidechainDefaults(&chainCfg)

err = chainCfg.ProtocolConfiguration.Validate()
fatalOnErr(err)

ch, err := sidechain.New(chainCfg, l, c.internalErr)
fatalOnErr(err)

c.sidechain = ch

c.workers = append(c.workers, &workerFromFunc{
fn: func(ctx context.Context) {
err := ch.Run(ctx)
if err != nil {
c.internalErr <- err
}
},
})
}

func applySidechainDefaults(cfg *config.Config) {
if cfg.ApplicationConfiguration.P2P.MaxPeers == 0 {
cfg.ApplicationConfiguration.P2P.MaxPeers = 100
}
if cfg.ApplicationConfiguration.P2P.AttemptConnPeers == 0 {
cfg.ApplicationConfiguration.P2P.AttemptConnPeers = cfg.ApplicationConfiguration.P2P.MinPeers + 10
}
Comment on lines +139 to +141
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As far as some other fields mentioned in applySidechainDefaults. So you may safely omit these checks if NeoGo's defaults are OK for you.

if cfg.ApplicationConfiguration.P2P.DialTimeout == 0 {
cfg.ApplicationConfiguration.P2P.DialTimeout = time.Minute
}
if cfg.ApplicationConfiguration.P2P.ProtoTickInterval == 0 {
cfg.ApplicationConfiguration.P2P.ProtoTickInterval = 2 * time.Second
}
if cfg.ProtocolConfiguration.MaxTraceableBlocks == 0 {
cfg.ProtocolConfiguration.MaxTraceableBlocks = 17280
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't use magic numbers, please. Move it to a constant, add an appropriate comment: it's 3 days of 15-seconds blocks in its essence, ref. nspcc-dev/neo-go#3518.

Also, meta chains will likely have shorter TimePerBlock/MaxTimePerBlock settings, so we may consider reducing the default MTB setting correspondingly.

}
if cfg.ProtocolConfiguration.MaxValidUntilBlockIncrement == 0 {
cfg.ProtocolConfiguration.MaxValidUntilBlockIncrement = 8640
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's set to a day of 15-seconds blocks for FS chains, so https://github.com/nspcc-dev/neofs-node/pull/3742/changes#r2630334320 is relevant for this setting as far. And just for the record: it can't exceed MTB setting.

}
if cfg.ApplicationConfiguration.P2P.PingInterval == 0 {
cfg.ApplicationConfiguration.P2P.PingInterval = 30 * time.Second
}
if cfg.ApplicationConfiguration.P2P.PingTimeout == 0 {
cfg.ApplicationConfiguration.P2P.PingTimeout = time.Minute
}
if cfg.ApplicationConfiguration.RPC.MaxWebSocketClients == 0 {
cfg.ApplicationConfiguration.RPC.MaxWebSocketClients = 64
}
if cfg.ApplicationConfiguration.RPC.SessionPoolSize == 0 {
cfg.ApplicationConfiguration.RPC.SessionPoolSize = 20
}
if cfg.ApplicationConfiguration.RPC.MaxGasInvoke == 0 {
cfg.ApplicationConfiguration.RPC.MaxGasInvoke = 100
}
}
8 changes: 5 additions & 3 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ require (
github.com/nspcc-dev/bbolt v0.0.0-20250911202005-807225ebb0c8
github.com/nspcc-dev/hrw/v2 v2.0.4
github.com/nspcc-dev/locode-db v0.8.2
github.com/nspcc-dev/neo-go v0.114.0
github.com/nspcc-dev/neo-go v0.114.1-0.20251222145711-e174185e133e
github.com/nspcc-dev/neofs-api-go/v2 v2.14.1-0.20240827150555-5ce597aa14ea
github.com/nspcc-dev/neofs-contract v0.25.2-0.20251219150129-498a820b9d6b
github.com/nspcc-dev/neofs-contract v0.25.2-0.20251223154102-15c76da7ea19
github.com/nspcc-dev/neofs-sdk-go v1.0.0-rc.16.0.20251203135706-86667929fbb8
github.com/nspcc-dev/tzhash v1.8.3
github.com/panjf2000/ants/v2 v2.11.3
Expand Down Expand Up @@ -70,7 +70,7 @@ require (
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/nspcc-dev/dbft v0.4.0 // indirect
github.com/nspcc-dev/go-ordered-json v0.0.0-20250911084817-6fb4472993d1 // indirect
github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20251112080609-3c8e29c66609 // indirect
github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20251217090505-857f951d81a9 // indirect
github.com/nspcc-dev/rfc6979 v0.2.4 // indirect
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
github.com/pierrec/lz4 v2.6.1+incompatible // indirect
Expand All @@ -93,7 +93,9 @@ require (
go.yaml.in/yaml/v2 v2.4.2 // indirect
go.yaml.in/yaml/v3 v3.0.4 // indirect
golang.org/x/crypto v0.45.0 // indirect
golang.org/x/mod v0.29.0 // indirect
golang.org/x/text v0.31.0 // indirect
golang.org/x/tools v0.38.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250922171735-9219d122eba9 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
lukechampine.com/blake3 v1.2.1 // indirect
Expand Down
12 changes: 6 additions & 6 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -191,14 +191,14 @@ github.com/nspcc-dev/hrw/v2 v2.0.4 h1:o3Zh/2aF+IgGpvt414f46Ya20WG9u9vWxVd16ErFI8
github.com/nspcc-dev/hrw/v2 v2.0.4/go.mod h1:dUjOx27zTTvoPmT5EG25vSSWL2tKS7ndAa2TPTiZwFo=
github.com/nspcc-dev/locode-db v0.8.2 h1:+9+1Z7ppG+ISDLHzMND7PZ8+R4H3d04doVRyNevOpz0=
github.com/nspcc-dev/locode-db v0.8.2/go.mod h1:PtAASXSG4D4Oz0js9elzTyTr8GLpOJO20qFL881Nims=
github.com/nspcc-dev/neo-go v0.114.0 h1:JxyLGlQGtzrfWvhdrUa35BGzBaadwPtLdNL5ehfOF2k=
github.com/nspcc-dev/neo-go v0.114.0/go.mod h1:visra3tXvGBgBfhMizRGEB+bUI5a/zoeqr5WQRKXFGQ=
github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20251112080609-3c8e29c66609 h1:9jH0IXFw8rjBgBVWSJbWeEHf7XDjANBnmEas49rdAH8=
github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20251112080609-3c8e29c66609/go.mod h1:X2spkE8hK/l08CYulOF19fpK5n3p2xO0L1GnJFIywQg=
github.com/nspcc-dev/neo-go v0.114.1-0.20251222145711-e174185e133e h1:mdGTZLXefDo3zIm42z+XFBbSK3cWU6rYxlyfq1Ir0B8=
github.com/nspcc-dev/neo-go v0.114.1-0.20251222145711-e174185e133e/go.mod h1:2klaZUCv0Ut+6d4GAO3w9NbtS1bOAX0Sqc10CvWjhHI=
github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20251217090505-857f951d81a9 h1:5+Ue5+i72uJVfHoq1+6mc6KlpriaqQaO96LtaDEsTfg=
github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20251217090505-857f951d81a9/go.mod h1:X2spkE8hK/l08CYulOF19fpK5n3p2xO0L1GnJFIywQg=
github.com/nspcc-dev/neofs-api-go/v2 v2.14.1-0.20240827150555-5ce597aa14ea h1:mK0EMGLvunXcFyq7fBURS/CsN4MH+4nlYiqn6pTwWAU=
github.com/nspcc-dev/neofs-api-go/v2 v2.14.1-0.20240827150555-5ce597aa14ea/go.mod h1:YzhD4EZmC9Z/PNyd7ysC7WXgIgURc9uCG1UWDeV027Y=
github.com/nspcc-dev/neofs-contract v0.25.2-0.20251219150129-498a820b9d6b h1:E8yWtvW2DrCEsCKFfvVRrfYu88DezqL4Hh/GPcSJXQI=
github.com/nspcc-dev/neofs-contract v0.25.2-0.20251219150129-498a820b9d6b/go.mod h1:CYX51uP2pNBCK7Q0ygD1LNsoFSHbB2F5luaBrluFkUo=
github.com/nspcc-dev/neofs-contract v0.25.2-0.20251223154102-15c76da7ea19 h1:SHs5o+wWqbdWbqQOlrONKSXhf8pDYdW+FnW04HTQvLg=
github.com/nspcc-dev/neofs-contract v0.25.2-0.20251223154102-15c76da7ea19/go.mod h1:9ziQViIqszec1SRE+mJX8gbAJmXEAY1g0ZE3TGVZYTc=
github.com/nspcc-dev/neofs-sdk-go v1.0.0-rc.16.0.20251203135706-86667929fbb8 h1:oasL8SD11yOmW0a/GqMmm4/0sb86hMOYMi7HC20PIb0=
github.com/nspcc-dev/neofs-sdk-go v1.0.0-rc.16.0.20251203135706-86667929fbb8/go.mod h1:IrM1JG/klBtecZEApIf8USgLonNcarv32R1O0dj4kQI=
github.com/nspcc-dev/rfc6979 v0.2.4 h1:NBgsdCjhLpEPJZqmC9rciMZDcSY297po2smeaRjw57k=
Expand Down
4 changes: 2 additions & 2 deletions pkg/innerring/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,8 +106,8 @@ type Settlement struct {

// Experimental configures experimental features.
type Experimental struct {
ChainMetaData bool `mapstructure:"chain_meta_data"`
AllowEC bool `mapstructure:"allow_ec"`
ChainMetaData MetaChain `mapstructure:"chain_meta_data"`
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

since it is experimental, i dont care if it is changed, but i may be wrong

AllowEC bool `mapstructure:"allow_ec"`
}

// Mainnet configures mainnet chain settings.
Expand Down
Loading