github.com/nspcc-dev/neo-go@v0.105.2-0.20240517133400-6be757af3eba/docs/node-configuration.md (about)

     1  # NeoGo node configuration file
     2  
     3  This section contains detailed NeoGo node configuration file description
     4  including default config values and some tips to set up configurable values.
     5  
     6  Each config file contains two sections. `ApplicationConfiguration` describes node-related
     7  settings and `ProtocolConfiguration` contains protocol-related settings. See the
     8  [Application Configuration](#Application-Configuration) and
     9  [Protocol Configuration](#Protocol-Configuration) sections for details on configurable
    10  values.
    11  
    12  ## Application Configuration
    13  
    14  `ApplicationConfiguration` section of `yaml` node configuration file contains
    15  node-related settings described in the table below.
    16  
    17  | Section | Type | Default value | Description |
    18  | --- | --- | --- | --- |
    19  | DBConfiguration | [DB Configuration](#DB-Configuration) |  | Describes configuration for database. See the [DB Configuration](#DB-Configuration) section for details. |
    20  | LogLevel | `string` | "info" | Minimal logged messages level (can be "debug", "info", "warn", "error", "dpanic", "panic" or "fatal"). |
    21  | GarbageCollectionPeriod | `uint32` | 10000 | Controls MPT garbage collection interval (in blocks) for configurations with `RemoveUntraceableBlocks` enabled and `KeepOnlyLatestState` disabled. In this mode the node stores a number of MPT trees (corresponding to `MaxTraceableBlocks` and `StateSyncInterval`), but the DB needs to be clean from old entries from time to time. Doing it too often will cause too much processing overhead, doing it too rarely will leave more useless data in the DB. |
    22  | KeepOnlyLatestState | `bool` | `false` | Specifies if MPT should only store the latest state (or a set of latest states, see `P2PStateExchangeExtensions` section in the ProtocolConfiguration for details). If true, DB size will be smaller, but older roots won't be accessible. This value should remain the same for the same database. |  |
    23  | LogPath | `string` | "", so only console logging | File path where to store node logs. |
    24  | Oracle | [Oracle Configuration](#Oracle-Configuration) | | Oracle module configuration. See the [Oracle Configuration](#Oracle-Configuration) section for details. |
    25  | P2P | [P2P Configuration](#P2P-Configuration) | | Configuration values for P2P network interaction. See the [P2P Configuration](#P2P-Configuration) section for details. |
    26  | P2PNotary | [P2P Notary Configuration](#P2P-Notary-Configuration) | | P2P Notary module configuration. See the [P2P Notary Configuration](#P2P-Notary-Configuration) section for details. |
    27  | Pprof | [Metrics Services Configuration](#Metrics-Services-Configuration) | | Configuration for pprof service (profiling statistics gathering). See the [Metrics Services Configuration](#Metrics-Services-Configuration) section for details. |
    28  | Prometheus | [Metrics Services Configuration](#Metrics-Services-Configuration) | | Configuration for Prometheus (monitoring system). See the [Metrics Services Configuration](#Metrics-Services-Configuration) section for details |
    29  | Relay | `bool` | `true` | Determines whether the server is forwarding its inventory. |
    30  | Consensus | [Consensus Configuration](#Consensus-Configuration) |  | Describes consensus (dBFT) configuration. See the [Consensus Configuration](#Consensus-Configuration) for details. |
    31  | RemoveUntraceableBlocks | `bool`| `false` | Denotes whether old blocks should be removed from cache and database. If enabled, then only the last `MaxTraceableBlocks` are stored and accessible to smart contracts. Old MPT data is also deleted in accordance with `GarbageCollectionPeriod` setting. If enabled along with `P2PStateExchangeExtensions` protocol extension, then old blocks and MPT states will be removed up to the second latest state synchronisation point (see `StateSyncInterval`). |
    32  | RPC | [RPC Configuration](#RPC-Configuration) |  | Describes [RPC subsystem](rpc.md) configuration. See the [RPC Configuration](#RPC-Configuration) for details. |
    33  | SaveStorageBatch | `bool` | `false` | Enables storage batch saving before every persist. It is similar to StorageDump plugin for C# node. |
    34  | SkipBlockVerification | `bool` | `false` | Allows to disable verification of received/processed blocks (including cryptographic checks). |
    35  | StateRoot | [State Root Configuration](#State-Root-Configuration) |  | State root module configuration. See the [State Root Configuration](#State-Root-Configuration) section for details. |
    36  
    37  ### P2P Configuration
    38  
    39  `P2P` section contains configuration for peer-to-peer node communications and has
    40  the following format:
    41  ```
    42  P2P:
    43    Addresses:
    44      - "0.0.0.0:0" # any free port on all available addresses (in form of "[host]:[port][:announcedPort]")
    45    AttemptConnPeers: 20
    46    BroadcastFactor: 0
    47    DialTimeout: 0s
    48    MaxPeers: 100
    49    MinPeers: 5
    50    PingInterval: 30s
    51    PingTimeout: 90s
    52    ProtoTickInterval: 5s
    53    ExtensiblePoolSize: 20
    54  ```
    55  where:
    56  - `Addresses` (`[]string`) is the list of the node addresses that P2P protocol
    57     handler binds to. Each address has the form of `[address]:[nodePort][:announcedPort]`
    58     where `address` is the address itself, `nodePort` is the actual P2P port node listens at;
    59     `announcedPort` is the node port which should be used to announce node's port on P2P layer,
    60     it can differ from the `nodePort` the node is bound to if specified (for example, if your
    61     node is behind NAT).
    62  - `AttemptConnPeers` (`int`) is the number of connection to try to establish when the
    63     connection count drops below the `MinPeers` value.
    64  - `BroadcastFactor` (`int`) is the multiplier that is used to determine the number of
    65     optimal gossip fan-out peer number for broadcasted messages (0-100). By default, it's
    66     zero, node uses the most optimized value depending on the estimated network size
    67     (`2.5×log(size)`), so the node may have 20 peers and calculate that it needs to broadcast
    68     messages to just 10 of them. With BroadcastFactor set to 100 it will always send messages
    69     to all peers, any value in-between 0 and 100 is used for weighted calculation, for example
    70     if it's 30 then 13 neighbors will be used in the previous case.
    71  - `DialTimeout` (`Duration`) is the maximum duration a single dial may take.
    72  - `ExtensiblePoolSize` (`int`) is the maximum amount of the extensible payloads from a single
    73     sender stored in a local pool.
    74  - `MaxPeers` (`int`) is the maximum numbers of peers that can be connected to the server.
    75  - `MinPeers` (`int`) is the minimum number of peers for normal operation; when the node has
    76     less than this number of peers it tries to connect with some new ones. Note that consensus
    77     node won't start the consensus process until at least `MinPeers` number of peers are
    78     connected.
    79  - `PingInterval` (`Duration`) is the interval used in pinging mechanism for syncing
    80     blocks.
    81  - `PingTimeout` (`Duration`) is the time to wait for pong (response for sent ping request).
    82  - `ProtoTickInterval` (`Duration`) is the duration between protocol ticks with each
    83     connected peer.
    84  
    85  ### DB Configuration
    86  
    87  `DBConfiguration` section describes configuration for node database and has
    88  the following format:
    89  ```
    90  DBConfiguration:
    91    Type: leveldb
    92    LevelDBOptions:
    93      DataDirectoryPath: /chains/privnet
    94      ReadOnly: false
    95    BoltDBOptions:
    96      FilePath: ./chains/privnet.bolt
    97      ReadOnly: false
    98  ```
    99  where:
   100  - `Type` is the database type (string value). Supported types: `leveldb`, `boltdb` and
   101    `inmemory` (not recommended for production usage).
   102  - `LevelDBOptions` are settings for LevelDB. Includes the DB files path and ReadOnly mode toggle.
   103    If ReadOnly mode is on, then an error will be returned on attempt to connect to unexisting or empty
   104    database. Database doesn't allow changes in this mode, a warning will be logged on DB persist attempts.
   105  - `BoltDBOptions` configures BoltDB. Includes the DB files path and ReadOnly mode toggle. If ReadOnly
   106    mode is on, then an error will be returned on attempt to connect with unexisting or empty database.
   107    Database doesn't allow changes in this mode, a warning will be logged on DB persist attempts.
   108  
   109  Only options for the specified database type will be used.
   110  
   111  ### Oracle Configuration
   112  
   113  `Oracle` configuration section describes configuration for Oracle node module
   114  and has the following structure:
   115  ```
   116  Oracle:
   117    Enabled: false
   118    AllowPrivateHost: false
   119    MaxTaskTimeout: 3600s
   120    MaxConcurrentRequests: 10
   121    Nodes: ["172.200.0.1:30333", "172.200.0.2:30334"]
   122    NeoFS:
   123      Nodes: ["172.200.0.1:30335", "172.200.0.2:30336"]
   124      Timeout: 2
   125    RefreshInterval: 180s
   126    RequestTimeout: 5s
   127    ResponseTimeout: 5s
   128    UnlockWallet:
   129      Path: "./oracle_wallet.json"
   130      Password: "pass"
   131  ```
   132  
   133  Please, refer to the [Oracle module documentation](./oracle.md#Configuration) for
   134  details on configurable values.
   135  
   136  ### P2P Notary Configuration
   137  
   138  `P2PNotary` configuration section describes configuration for P2P Notary node
   139  module and has the following structure:
   140  ```
   141  P2PNotary:
   142    Enabled: false
   143    UnlockWallet:
   144      Path: "/notary_wallet.json"
   145      Password: "pass"
   146  ```
   147  where:
   148  - `Enabled` denotes whether P2P Notary module is active.
   149  - `UnlockWallet` is a Notary node wallet configuration, see the
   150    [Unlock Wallet Configuration](#Unlock-Wallet-Configuration) section for
   151    structure details.
   152  
   153  Please, refer to the [Notary module documentation](./notary.md#Notary node module) for
   154  details on module features.
   155  
   156  ### Metrics Services Configuration
   157  
   158  Metrics services configuration describes options for metrics services (pprof,
   159  Prometheus) and has the following structure:
   160  ```
   161  Pprof:
   162    Enabled: false
   163    Addresses:
   164      - ":30001"
   165  Prometheus:
   166    Enabled: false
   167    Addresses:
   168      - ":40001"
   169  ```
   170  where:
   171  - `Enabled` denotes whether the service is enabled.
   172  - `Addresses` is a list of service addresses to be running at and listen to in
   173     the form of "host:port".
   174  
   175  ### RPC Configuration
   176  
   177  `RPC` configuration section describes settings for the RPC server and has
   178  the following structure:
   179  ```
   180  RPC:
   181    Enabled: true
   182    Addresses:
   183      - ":10332"
   184    EnableCORSWorkaround: false
   185    MaxGasInvoke: 50
   186    MaxIteratorResultItems: 100
   187    MaxFindResultItems: 100
   188    MaxFindStoragePageSize: 50
   189    MaxNEP11Tokens: 100
   190    MaxRequestBodyBytes: 5242880
   191    MaxRequestHeaderBytes: 1048576
   192    MaxWebSocketClients: 64
   193    SessionEnabled: false
   194    SessionExpirationTime: 15
   195    SessionBackedByMPT: false
   196    SessionPoolSize: 20
   197    StartWhenSynchronized: false
   198    TLSConfig:
   199      Addresses:
   200        - ":10331"
   201      CertFile: serv.crt
   202      Enabled: true
   203      KeyFile: serv.key
   204  ```
   205  where:
   206  - `Enabled` denotes whether an RPC server should be started.
   207  - `Addresses` is a list of RPC server addresses to be running at and listen to in
   208    the form of "host:port".
   209  - `EnableCORSWorkaround` turns on a set of origin-related behaviors that make
   210    RPC server wide open for connections from any origins. It enables OPTIONS
   211    request handling for pre-flight CORS and makes the server send
   212    `Access-Control-Allow-Origin` and `Access-Control-Allow-Headers` headers for
   213    regular HTTP requests (allowing any origin which effectively makes CORS
   214    useless). It also makes websocket connections work for any `Origin`
   215    specified in the request header. This option is not recommended (reverse
   216    proxy can be used to have proper app-specific CORS settings), but it's an
   217    easy way to make RPC interface accessible from the browser.
   218  - `MaxGasInvoke` is the maximum GAS allowed to spend during `invokefunction` and
   219    `invokescript` RPC-calls. `calculatenetworkfee` also can't exceed this GAS amount
   220    (normally the limit for it is MaxVerificationGAS from Policy, but if MaxGasInvoke
   221    is lower than that then this limit is respected).
   222  - `MaxIteratorResultItems` - maximum number of elements extracted from iterator
   223     returned by `invoke*` call. When the `MaxIteratorResultItems` value is set to
   224     `n`, only `n` iterations are returned and truncated is true, indicating that
   225     there is still data to be returned.
   226  - `MaxFindResultItems` - the maximum number of elements for `findstates` response.
   227  - `MaxFindStoragePageSize` - the maximum number of elements for `findstorage` response per single page.
   228  - `MaxNEP11Tokens` - limit for the number of tokens returned from
   229    `getnep11balances` call.
   230  - `MaxRequestBodyBytes` - the maximum allowed HTTP request body size in bytes
   231    (5MB by default).
   232  - `MaxRequestHeaderBytes` - the maximum allowed HTTP request header size in bytes
   233    (1MB by default).
   234  - `MaxWebSocketClients` - the maximum simultaneous websocket client connection
   235    number (64 by default). Attempts to establish additional connections will
   236    lead to websocket handshake failures. Use "-1" to disable websocket
   237    connections (0 will lead to using the default value).
   238  - `SessionEnabled` denotes whether session-based iterator JSON-RPC API is enabled.
   239    If true, then all iterators got from `invoke*` calls will be stored as sessions
   240    on the server side available for further traverse. `traverseiterator` and
   241    `terminatesession` JSON-RPC calls will be handled by the server. It is not
   242    recommended to enable this setting for public RPC servers due to possible DoS
   243    attack. Set to `false` by default. If `false`, iterators are expanded into a
   244    set of values (see `MaxIteratorResultItems` setting). Implementation note: when
   245    BoltDB storage is used as a node backend DB, then enabling iterator sessions may
   246    cause blockchain persist delays up to 2*`SessionExpirationTime` seconds on
   247    early blockchain lifetime stages with relatively small DB size. It can happen
   248    due to BoltDB re-mmapping behaviour traits. If regular persist is a critical
   249    requirement, then we recommend either to decrease `SessionExpirationTime` or to
   250    enable `SessionBackedByMPT`, see `SessionBackedByMPT` documentation for more
   251    details.
   252  - `SessionExpirationTime` is a lifetime of iterator session in seconds. It is set
   253    to `TimePerBlock` seconds by default and is relevant only if `SessionEnabled`
   254    is set to `true`.
   255  - `SessionBackedByMPT` is a flag forcing JSON-RPC server into using MPT-backed
   256    storage for delayed iterator traversal. If `true`, then iterator resources got
   257    after `invoke*` calls will be released immediately. Further iterator traversing
   258    will be performed using MPT-backed storage by retrieving iterator via historical
   259    MPT-provided `invoke*` recall. `SessionBackedByMPT` set to `true` strongly affects
   260    the `traverseiterator` call performance and doesn't allow iterator traversing
   261    for outdated or removed states (see `KeepOnlyLatestState` and
   262    `RemoveUntraceableBlocks` settings documentation for details), thus, it is not
   263    recommended to enable `SessionBackedByMPT` needlessly. `SessionBackedByMPT` is
   264    set to `false` by default and is relevant only if `SessionEnabled` is set to
   265    `true`.
   266  - `SessionPoolSize` is the maximum number of concurrent iterator sessions. It is
   267    set to `20` by default. If the subsequent session can't be added to the session
   268    pool, then invocation result will contain corresponding error inside the
   269    `FaultException` field.
   270  - `StartWhenSynchronized` controls when RPC server will be started, by default
   271    (`false` setting) it's started immediately and RPC is available during node
   272    synchronization. Setting it to `true` will make the node start RPC service only
   273    after full synchronization.
   274  - `TLS` section configures TLS protocol.
   275  
   276  ### State Root Configuration
   277  
   278  `StateRoot` configuration section contains settings for state roots exchange and has
   279  the following structure:
   280  ```
   281  StateRoot:
   282    Enabled: false
   283    UnlockWallet:
   284      Path: "./wallet.json"
   285      Password: "pass"
   286  ```
   287  where:
   288  - `Enabled` enables state root module.
   289  - `UnlockWallet` contains wallet settings, see
   290    [Unlock Wallet Configuration](#Unlock-Wallet-Configuration) section for
   291    structure details.
   292  
   293  ### Consensus Configuration
   294  
   295  `Consensus` configuration section describes configuration for dBFT node
   296  module and has the following structure:
   297  ```
   298  Consensus:
   299    Enabled: false
   300    UnlockWallet:
   301      Path: "/consensus_node_wallet.json"
   302      Password: "pass"
   303  ```
   304  where:
   305  - `Enabled` denotes whether dBFT module is active.
   306  - `UnlockWallet` is a consensus node wallet configuration, see the
   307    [Unlock Wallet Configuration](#Unlock-Wallet-Configuration) section for
   308    structure details.
   309  
   310  Please, refer to the [consensus node documentation](./consensus.md) for more
   311  details on consensus node setup.
   312  
   313  ### Unlock Wallet Configuration
   314  
   315  `UnlockWallet` configuration section contains wallet settings and has the following
   316  structure:
   317  ```
   318  UnlockWallet:
   319    Path: "./wallet.json"
   320    Password: "pass"
   321  ```
   322  where:
   323  - `Path` is a path to wallet.
   324  - `Password` is a wallet password.
   325  
   326  ## Protocol Configuration
   327  
   328  `ProtocolConfiguration` section of `yaml` node configuration file contains
   329  protocol-related settings described in the table below.
   330  
   331  | Section | Type | Default value | Description | Notes |
   332  | --- | --- | --- | --- | --- |
   333  | CommitteeHistory | map[uint32]uint32 | none | Number of committee members after the given height, for example `{0: 1, 20: 4}` sets up a chain with one committee member since the genesis and then changes the setting to 4 committee members at the height of 20. `StandbyCommittee` committee setting must have the number of keys equal or exceeding the highest value in this option. Blocks numbers where the change happens must be divisible by the old and by the new values simultaneously. If not set, committee size is derived from the `StandbyCommittee` setting and never changes. |
   334  | Genesis | [Genesis](#Genesis-Configuration) | none | The set of genesis block settings including NeoGo-specific protocol extensions that should be enabled at the genesis block or during native contracts initialisation. |
   335  | Hardforks | `map[string]uint32` | [] | The set of incompatible changes that affect node behaviour starting from the specified height. The default value is an empty set which should be interpreted as "each known hard-fork is applied from the zero blockchain height". The list of valid hard-fork names:<br>• `Aspidochelone` represents hard-fork introduced in [#2469](https://github.com/nspcc-dev/neo-go/pull/2469) (ported from the [reference](https://github.com/neo-project/neo/pull/2712)). It adjusts the prices of `System.Contract.CreateStandardAccount` and `System.Contract.CreateMultisigAccount` interops so that the resulting prices are in accordance with `sha256` method of native `CryptoLib` contract. It also includes [#2519](https://github.com/nspcc-dev/neo-go/pull/2519) (ported from the [reference](https://github.com/neo-project/neo/pull/2749)) that adjusts the price of `System.Runtime.GetRandom` interop and fixes its vulnerability. A special NeoGo-specific change is included as well for ContractManagement's update/deploy call flags behaviour to be compatible with pre-0.99.0 behaviour that was changed because of the [3.2.0 protocol change](https://github.com/neo-project/neo/pull/2653).<br>• `Basilisk` represents hard-fork introduced in [#3056](https://github.com/nspcc-dev/neo-go/pull/3056) (ported from the [reference](https://github.com/neo-project/neo/pull/2881)). It enables strict smart contract script check against a set of JMP instructions and against method boundaries enabled on contract deploy or update. It also includes [#3080](https://github.com/nspcc-dev/neo-go/pull/3080) (ported from the [reference](https://github.com/neo-project/neo/pull/2883)) that increases `stackitem.Integer` JSON parsing precision up to the maximum value supported by the NeoVM. It also includes [#3085](https://github.com/nspcc-dev/neo-go/pull/3085) (ported from the [reference](https://github.com/neo-project/neo/pull/2810)) that enables strict check for notifications emitted by a contract to precisely match the events specified in the contract manifest. <br>• `Cockatrice` represents hard-fork introduced in [#3402](https://github.com/nspcc-dev/neo-go/pull/3402) (ported from the [reference](https://github.com/neo-project/neo/pull/2942)). Initially it is introduced along with the ability to update native contracts. This hard-fork also includes a couple of new native smart contract APIs: `keccak256` of native CryptoLib contract introduced in [#3301](https://github.com/nspcc-dev/neo-go/pull/3301) (ported from the [reference](https://github.com/neo-project/neo/pull/2925)) and `getCommitteeAddress` of native NeoToken contract inctroduced in [#3362](https://github.com/nspcc-dev/neo-go/pull/3362) (ported from the [reference](https://github.com/neo-project/neo/pull/3154)). |
   336  | Magic | `uint32` | `0` | Magic number which uniquely identifies Neo network. |
   337  | MaxBlockSize | `uint32` | `262144` | Maximum block size in bytes. |
   338  | MaxBlockSystemFee | `int64` | `900000000000` | Maximum overall transactions system fee per block. |
   339  | MaxTraceableBlocks | `uint32` | `2102400` | Length of the chain accessible to smart contracts. | `RemoveUntraceableBlocks` should be enabled to use this setting. |
   340  | MaxTransactionsPerBlock | `uint16` | `512` | Maximum number of transactions per block. |
   341  | MaxValidUntilBlockIncrement | `uint32` | `5760` | Upper height increment limit for transaction's ValidUntilBlock field value relative to the current blockchain height, exceeding which a transaction will fail validation. It is set to estimated daily number of blocks with 15s interval by default. |
   342  | MemPoolSize | `int` | `50000` | Size of the node's memory pool where transactions are stored before they are added to block. |
   343  | P2PNotaryRequestPayloadPoolSize | `int` | `1000` | Size of the node's P2P Notary request payloads memory pool where P2P Notary requests are stored before main or fallback transaction is completed and added to the chain.<br>This option is valid only if `P2PSigExtensions` are enabled. | Not supported by the C# node, thus may affect heterogeneous networks functionality. |
   344  | P2PSigExtensions | `bool` | `false` | Enables following additional Notary service related logic:<br>• Transaction attribute `NotaryAssisted`<br>• Network payload of the `P2PNotaryRequest` type<br>• Native `Notary` contract<br>• Notary node module | Not supported by the C# node, thus may affect heterogeneous networks functionality. |
   345  | P2PStateExchangeExtensions | `bool` | `false` | Enables the following P2P MPT state data exchange logic: <br>• `StateSyncInterval` protocol setting <br>• P2P commands `GetMPTDataCMD` and `MPTDataCMD` | Not supported by the C# node, thus may affect heterogeneous networks functionality. Can be supported either on MPT-complete node (`KeepOnlyLatestState`=`false`) or on light GC-enabled node (`RemoveUntraceableBlocks=true`) in which case `KeepOnlyLatestState` setting doesn't change the behavior, an appropriate set of MPTs is always stored (see `RemoveUntraceableBlocks`). |
   346  | ReservedAttributes | `bool` | `false` | Allows to have reserved attributes range for experimental or private purposes. |
   347  | SeedList | `[]string` | [] | List of initial nodes addresses used to establish connectivity. |
   348  | StandbyCommittee | `[]string` | [] | List of public keys of standby committee validators are chosen from. | The list of keys is not required to be sorted, but it must be exactly the same within the configuration files of all the nodes in the network. |
   349  | StateRootInHeader | `bool` | `false` | Enables storing state root in block header. | Experimental protocol extension! |
   350  | StateSyncInterval | `int` | `40000` | The number of blocks between state heights available for MPT state data synchronization. | `P2PStateExchangeExtensions` should be enabled to use this setting. |
   351  | TimePerBlock | `Duration` | `15s` | Minimal (and targeted for) time interval between blocks. Must be an integer number of milliseconds. |
   352  | ValidatorsCount | `uint32` | `0` | Number of validators set for the whole network lifetime, can't be set if `ValidatorsHistory` setting is used. |
   353  | ValidatorsHistory | map[uint32]uint32 | none | Number of consensus nodes to use after given height (see `CommitteeHistory` also). Heights where the change occurs must be divisible by the number of committee members at that height. Can't be used with `ValidatorsCount` not equal to zero. Initial validators count for genesis block must always be specified. |
   354  | VerifyTransactions | `bool` | `false` | Denotes whether to verify transactions in the received blocks. |
   355  
   356  ### Genesis Configuration
   357  
   358  `Genesis` subsection of protocol configuration section contains a set of settings
   359  specific for genesis block including NeoGo node extensions that should be enabled
   360  during genesis block persist or at the moment of native contracts initialisation.
   361  `Genesis` has the following structure:
   362  ```
   363  Genesis:
   364    Roles:
   365      NeoFSAlphabet:
   366        - 033238fa63bd08115ebf442d4af897eea2f6866e4c2001cd1f6e7656acdd91a5d3
   367        - 03b209fd4f53a7170ea4444e0cb0a6bb6a53c2bd016926989cf85f9b0fba17a70c
   368        - 02aaec38470f6aad0042c6e877cfd8087d2676b0f516fddd362801b9bd3936399e
   369        - 03c6aa6e12638b36e88adc1ccdceac4db9929575c3e03576c617c49cce7114a050
   370      Oracle:
   371        - 03409f31f0d66bdc2f70a9730b66fe186658f84a8018204db01c106edc36553cd0
   372        - 0222038884bbd1d8ff109ed3bdef3542e768eef76c1247aea8bc8171f532928c30
   373    Transaction:
   374      Script: "DCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG5BVuezJw=="
   375      SystemFee: 100000000
   376  ```
   377  where:
   378  - `Roles` is a map from node roles that should be set at the moment of native
   379    RoleManagement contract initialisation to the list of hex-encoded public keys
   380    corresponding to this role. The set of valid roles includes:
   381    - `StateValidator`
   382    - `Oracle`
   383    - `NeoFSAlphabet`
   384    - `P2PNotary`
   385    
   386    Roles designation order follows the enumeration above. Designation
   387    notifications will be emitted after each configured role designation.
   388    
   389    Note that Roles is a NeoGo extension that isn't supported by the NeoC# node and
   390    must be disabled on the public Neo N3 networks. Roles extension is compatible
   391    with Hardforks setting, which means that specified roles will be set
   392    only during native RoleManagement contract initialisation (which may be
   393    performed in some non-genesis hardfork). By default, no roles are designated.
   394  
   395  - `Transaction` is a container for transaction script that should be deployed in
   396    the genesis block if provided. `Transaction` includes `Script` which is a
   397    base64-encoded transaction script and `SystemFee` which is a transaction's
   398    system fee value (in GAS) that will be spent during transaction execution.
   399    Transaction generated from the provided parameters has two signers at max with
   400    CalledByEntry witness scope: the first one is standby validators multisignature
   401    signer and the second one (if differs from the first) is committee
   402    multisignature signer.
   403  
   404    Note that `Transaction` is a NeoGo extension that isn't supported by the NeoC#
   405    node and must be disabled on the public Neo N3 networks.