Neo-Express for N3 Settings Reference
July 30, 2026 · View on GitHub
The .neo-express file for Neo N3 compatible versions of N3 includes a settings object property.
This document details the values that Neo-Express reads from the settings object.
chain.SecondsPerBlock
The chain.SecondsPerBlock Neo-Express setting corresponds to the MillisecondsPerBlock
config.json property
and the --seconds-per-block option for the Neo-Express run command.
By default, Neo-Express mints a new block every 15 seconds. The chain.SecondsPerBlock setting can
be used to override the default behavior. If the run command --seconds-per-block option is specified,
the chain.SecondsPerBlock setting is ignored.
chain.SecondsPerBlock is specified as an unsigned integer. If you specify an invalid unsigned integer
value for this setting, Neo-Express reverts to the default.
Example usage:
"settings": {
"chain.SecondsPerBlock": "5" // Mint a new block every 5 seconds
}
chain.AutoMine
When chain.AutoMine is enabled on a single-node chain, transactions submitted against a running
node — transfers, contract deploys and invocations, execute, policy and candidate operations —
are confirmed immediately: instead of entering the mempool and waiting for the next dBFT block
(15 seconds by default, 1 second minimum), Neo-Express wraps the transaction in a consensus-signed
block and submits the block directly, the same way the offline node and the fastfwd command
already produce blocks. The regular dBFT block timer keeps running alongside and continues to mint
empty blocks on its normal schedule.
chain.AutoMine is specified as a boolean and defaults to false. It only takes effect on
single-node chains, where the Neo-Express process holds every consensus key; the setting is
ignored on four- and seven-node chains. In the unlikely event that a submitted block races an
in-flight dBFT block at the same height, Neo-Express retries once on the new chain tip and then
falls back to normal mempool submission.
Example usage:
"settings": {
"chain.AutoMine": "true" // Confirm transactions immediately on a single node chain
}
protocol.*
Neo-Express can read Neo protocol configuration values from the settings object. These values
override the defaults used to build the ProtocolSettings passed to the Neo node. The network
magic, address version, consensus committee, validators count and seed list continue to come from
the top-level .neo-express chain definition.
Supported protocol settings:
protocol.MillisecondsPerBlockprotocol.MaxTransactionsPerBlockprotocol.MemoryPoolMaxTransactionsprotocol.MaxTraceableBlocksprotocol.MaxValidUntilBlockIncrementprotocol.InitialGasDistributionprotocol.Hardforks.<HardforkName>
The chain.SecondsPerBlock setting and the run --seconds-per-block option still override
protocol.MillisecondsPerBlock.
Protocol values are specified as unsigned integers, except protocol.MemoryPoolMaxTransactions,
which is a positive integer. Hardfork names use the Neo Hardfork enum names, such as
HF_Echidna, HF_Faun, or HF_Huyao, and values are activation block heights.
Example usage:
"settings": {
"protocol.MillisecondsPerBlock": "3000",
"protocol.MaxTransactionsPerBlock": "1024",
"protocol.MemoryPoolMaxTransactions": "100000",
"protocol.MaxTraceableBlocks": "2102400",
"protocol.MaxValidUntilBlockIncrement": "86400",
"protocol.InitialGasDistribution": "5200000000000000",
"protocol.Hardforks.HF_Echidna": "0",
"protocol.Hardforks.HF_Faun": "0",
"protocol.Hardforks.HF_Gorgon": "0",
"protocol.Hardforks.HF_Huyao": "0"
}
policy.*
Neo-Express can also initialize native policy values from the settings object. These values are
written to the chain state only while the chain is still at genesis height. If the chain has already
produced blocks, use the policy set command to change policy values through a transaction.
Supported native policy settings:
policy.GasPerBlockpolicy.MinimumDeploymentFeepolicy.CandidateRegistrationFeepolicy.OracleRequestFeepolicy.NetworkFeePerBytepolicy.StorageFeeFactorpolicy.ExecutionFeeFactorpolicy.MillisecondsPerBlockpolicy.MaxValidUntilBlockIncrementpolicy.MaxTraceableBlockspolicy.AttributeFee.<TransactionAttributeType>
GAS-denominated policy values are specified in datoshi. One GAS is 100000000 datoshi.
policy.StorageFeeFactor, policy.ExecutionFeeFactor, policy.MillisecondsPerBlock,
policy.MaxValidUntilBlockIncrement and policy.MaxTraceableBlocks are whole-number factors or
counts. Attribute fee keys use Neo TransactionAttributeType enum names, such as HighPriority,
NotValidBefore, Conflicts or NotaryAssisted.
When HF_Echidna is active at genesis height, Neo stores block time, max valid-until-block
increment and max traceable blocks in the native Policy contract. In that case Neo-Express uses
policy.MillisecondsPerBlock, policy.MaxValidUntilBlockIncrement and
policy.MaxTraceableBlocks if they are present; otherwise it initializes those native policy values
from protocol.MillisecondsPerBlock, protocol.MaxValidUntilBlockIncrement and
protocol.MaxTraceableBlocks.
policy.AttributeFee.NotaryAssisted only takes effect when HF_Echidna is active at genesis
height.
Example usage:
"settings": {
"policy.NetworkFeePerByte": "2000",
"policy.StorageFeeFactor": "200000",
"policy.ExecutionFeeFactor": "40",
"policy.MinimumDeploymentFee": "2000000000",
"policy.AttributeFee.HighPriority": "1000"
}
notary.*
Neo-Express can initialize native Notary values from the settings object when the Notary contract
is active at genesis height. These values are written only while the chain is still at genesis
height.
Supported native Notary settings:
notary.MaxNotValidBeforeDelta
notary.MaxNotValidBeforeDelta must be at least the validator count and no more than half of the
current max valid-until-block increment.
Example usage:
"settings": {
"protocol.Hardforks.HF_Echidna": "0",
"notary.MaxNotValidBeforeDelta": "40"
}
dbft.MaxBlockSystemFee
The dbft.MaxBlockSystemFee Neo-Express setting corresponds to the MaxBlockSystemFee
DBFT plugin setting. This setting specifies the maximum transaction system fee, in
datoshi, accepted by the consensus service.
This setting defaults to 2000000000 datoshi, or 20 GAS. If you specify an invalid or
negative integer value for this setting, Neo-Express reverts to the default. One GAS is
100000000 datoshi.
Example usage:
"settings": {
"dbft.MaxBlockSystemFee": "4000000000" // support transaction system fees up to 40 GAS
}
rpc.BindAddress
The rpc.BindAddress Neo-Express setting corresponds to the BindAddress
RpcServer config property.
By default, Neo-Express only listens for JSON-RPC requests on the loopback address. This means that
JSON-RPC requests must originate on the same machine as Neo-Express is running in order to be serviced.
While this is the most secure approach, it limits the ability of the developer to test cross machine
scenarios, especially ones that involve mobile devices. The rpc.BindAddress setting can be used to
override the default behavior.
The rpc.BindAddress field accepts an IP address in dotted quad notation. It specifies the IP Address
that the JSON-RPC server will listen on for client requests. Typically, to enable remote access to
a Neo-Express instance, you would specify the rpc.BindAddress to be 0.0.0.0.
If you specify an invalid IP Address, Neo-Express reverts to the default loopback BindAddress
(aka 127.0.0.1).
Security note: The Neo-Express RPC server exposes unauthenticated administrative methods that control the node, including
expressshutdown(stops the node),expresscreatecheckpoint,expresspersiststorageandexpresspersistcontract(modify chain state). The default loopbackBindAddresslimits these to processes on the same machine. Binding to any other address (for example0.0.0.0) makes them reachable, without authentication, by any host that can route to that address. Only override the default on a trusted network and only for the duration of the testing scenario that requires it.
Example usage:
"settings": {
"rpc.BindAddress": "0.0.0.0" // listens for JSON-RPC requests on all network interfaces
}
rpc.MaxFee
The rpc.MaxFee Neo-Express setting corresponds to the MaxFee
RpcServer config property.
This setting specifies a maximum Network Fee for the
sendfrom,
sendmany
and sendtoaddress
JSON-RPC methods.
This setting defaults to 0.1 GAS. If you specify an invalid decimal value for this setting, Neo-Express reverts to the default.
Example usage:
"settings": {
"rpc.MaxFee": "0.2" // support higher network fee for send[from/many/toaddress] methods
}
rpc.MaxGasInvoke
The rpc.MaxGasInvoke Neo-Express setting corresponds to the MaxGasInvoke
RpcServer config property.
This setting specifies maximum limit in GAS for the
invokefunction
and invokescript
JSON-RPC methods.
This setting defaults to 10.0 GAS. If you specify an invalid decimal value for this setting, Neo-Express reverts to the default.
Example usage:
"settings": {
"rpc.MaxGasInvoke": "15" // support higher GAS limit for invoke[function/script] methods
}
rpc.MaxIteratorResultItems
The rpc.MaxIteratorResultItems Neo-Express setting corresponds to the MaxIteratorResultItems
RpcServer config property.
This setting specifies maximum number of items returned to the RPC caller when there is an iterator
on the result stack.
This setting defaults to 100 items. If you specify an invalid or negative integer value for this setting, Neo-Express reverts to the default.
Example usage:
"settings": {
"rpc.MaxIteratorResultItems": "150" // support higher item limit for iterator results
}
rpc.SessionEnabled
The rpc.SessionEnabled Neo-Express setting corresponds to the SessionEnabled
RpcServer config property.
This setting specifies if iterator sessions are enabled.
This setting defaults to true. If you specify an invalid boolean value for this setting,
Neo-Express reverts to the default.
Example usage:
"settings": {
"rpc.SessionEnabled": "false" // disable sessions
}