> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ton.org/llms.txt
> Use this file to discover all available pages before exploring further.

<AgentInstructions>

## Submitting Feedback

If you encounter incorrect, outdated, or confusing documentation on this page, submit feedback:

POST https://docs.ton.org/feedback

```json
{
  "path": "/ecosystem/nodes/rust/node-config-ref",
  "feedback": "Description of the issue"
}
```

Only submit feedback when you have something specific and actionable to report.

</AgentInstructions>

# Node configuration reference

export const Aside = ({type = "note", title = "", icon = "", iconType = "regular", children}) => {
  const asideVariants = ["note", "tip", "caution", "danger"];
  const asideComponents = {
    note: {
      outerStyle: "border-sky-500/20 bg-sky-50/50 dark:border-sky-500/30 dark:bg-sky-500/10",
      innerStyle: "text-sky-900 dark:text-sky-200",
      calloutType: "note",
      icon: <svg width="14" height="14" viewBox="0 0 14 14" fill="currentColor" xmlns="http://www.w3.org/2000/svg" className="w-4 h-4 text-sky-500" aria-label="Note">
          <path fill-rule="evenodd" clip-rule="evenodd" d="M7 1.3C10.14 1.3 12.7 3.86 12.7 7C12.7 10.14 10.14 12.7 7 12.7C5.48908 12.6974 4.0408 12.096 2.97241 11.0276C1.90403 9.9592 1.30264 8.51092 1.3 7C1.3 3.86 3.86 1.3 7 1.3ZM7 0C3.14 0 0 3.14 0 7C0 10.86 3.14 14 7 14C10.86 14 14 10.86 14 7C14 3.14 10.86 0 7 0ZM8 3H6V8H8V3ZM8 9H6V11H8V9Z"></path>
        </svg>
    },
    tip: {
      outerStyle: "border-emerald-500/20 bg-emerald-50/50 dark:border-emerald-500/30 dark:bg-emerald-500/10",
      innerStyle: "text-emerald-900 dark:text-emerald-200",
      calloutType: "tip",
      icon: <svg width="11" height="14" viewBox="0 0 11 14" fill="currentColor" xmlns="http://www.w3.org/2000/svg" className="text-emerald-600 dark:text-emerald-400/80 w-3.5 h-auto" aria-label="Tip">
          <path d="M3.12794 12.4232C3.12794 12.5954 3.1776 12.7634 3.27244 12.907L3.74114 13.6095C3.88471 13.8248 4.21067 14 4.46964 14H6.15606C6.41415 14 6.74017 13.825 6.88373 13.6095L7.3508 12.9073C7.43114 12.7859 7.49705 12.569 7.49705 12.4232L7.50055 11.3513H3.12521L3.12794 12.4232ZM5.31288 0C2.52414 0.00875889 0.5 2.26889 0.5 4.78826C0.5 6.00188 0.949566 7.10829 1.69119 7.95492C2.14321 8.47011 2.84901 9.54727 3.11919 10.4557C3.12005 10.4625 3.12175 10.4698 3.12261 10.4771H7.50342C7.50427 10.4698 7.50598 10.463 7.50684 10.4557C7.77688 9.54727 8.48281 8.47011 8.93484 7.95492C9.67728 7.13181 10.1258 6.02703 10.1258 4.78826C10.1258 2.15486 7.9709 0.000106649 5.31288 0ZM7.94902 7.11267C7.52078 7.60079 6.99082 8.37878 6.6077 9.18794H4.02051C3.63739 8.37878 3.10743 7.60079 2.67947 7.11294C2.11997 6.47551 1.8126 5.63599 1.8126 4.78826C1.8126 3.09829 3.12794 1.31944 5.28827 1.3126C7.2435 1.3126 8.81315 2.88226 8.81315 4.78826C8.81315 5.63599 8.50688 6.47551 7.94902 7.11267ZM4.87534 2.18767C3.66939 2.18767 2.68767 3.16939 2.68767 4.37534C2.68767 4.61719 2.88336 4.81288 3.12521 4.81288C3.36705 4.81288 3.56274 4.61599 3.56274 4.37534C3.56274 3.6515 4.1515 3.06274 4.87534 3.06274C5.11719 3.06274 5.31288 2.86727 5.31288 2.62548C5.31288 2.38369 5.11599 2.18767 4.87534 2.18767Z"></path>
        </svg>
    },
    caution: {
      outerStyle: "border-amber-500/20 bg-amber-50/50 dark:border-amber-500/30 dark:bg-amber-500/10",
      innerStyle: "text-amber-900 dark:text-amber-200",
      calloutType: "warning",
      icon: <svg className="flex-none w-5 h-5 text-amber-400 dark:text-amber-300/80" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" aria-label="Warning">
          <path stroke-linecap="round" stroke-linejoin="round" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"></path>
        </svg>
    },
    danger: {
      outerStyle: "border-red-500/20 bg-red-50/50 dark:border-red-500/30 dark:bg-red-500/10",
      innerStyle: "text-red-900 dark:text-red-200",
      calloutType: "danger",
      icon: <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="currentColor" className="text-red-600 dark:text-red-400/80 w-4 h-4" aria-label="Danger">
          <path d="M17.1 292c-12.9-22.3-12.9-49.7 0-72L105.4 67.1c12.9-22.3 36.6-36 62.4-36l176.6 0c25.7 0 49.5 13.7 62.4 36L494.9 220c12.9 22.3 12.9 49.7 0 72L406.6 444.9c-12.9 22.3-36.6 36-62.4 36l-176.6 0c-25.7 0-49.5-13.7-62.4-36L17.1 292zm41.6-48c-4.3 7.4-4.3 16.6 0 24l88.3 152.9c4.3 7.4 12.2 12 20.8 12l176.6 0c8.6 0 16.5-4.6 20.8-12L453.4 268c4.3-7.4 4.3-16.6 0-24L365.1 91.1c-4.3-7.4-12.2-12-20.8-12l-176.6 0c-8.6 0-16.5 4.6-20.8 12L58.6 244zM256 128c13.3 0 24 10.7 24 24l0 112c0 13.3-10.7 24-24 24s-24-10.7-24-24l0-112c0-13.3 10.7-24 24-24zM224 352a32 32 0 1 1 64 0 32 32 0 1 1 -64 0z"></path>
        </svg>
    }
  };
  let variant = type;
  let gotInvalidVariant = false;
  if (!asideVariants.includes(type)) {
    gotInvalidVariant = true;
    variant = "danger";
  }
  const iconVariants = ["regular", "solid", "light", "thin", "sharp-solid", "duotone", "brands"];
  if (!iconVariants.includes(iconType)) {
    iconType = "regular";
  }
  return <>
      <div className={`callout my-4 px-5 py-4 overflow-hidden rounded-2xl flex gap-3 border ${asideComponents[variant].outerStyle}`} data-callout-type={asideComponents[variant].calloutType}>
        <div className="mt-0.5 w-4" data-component-part="callout-icon">
          {}
          {icon === "" ? asideComponents[variant].icon : <Icon icon={icon} iconType={iconType} size={14} />}
        </div>
        <div className={`text-sm prose min-w-0 w-full ${asideComponents[variant].innerStyle}`} data-component-part="callout-content">
          {gotInvalidVariant ? <p>
              <span className="font-bold">
                Invalid <code>type</code> passed!
              </span>
              <br />
              <span className="font-bold">Received: </span>
              {type}
              <br />
              <span className="font-bold">Expected one of: </span>
              {asideVariants.join(", ")}
            </p> : <>
              {title && <p className="font-bold">{title}</p>}
              {children}
            </>}
        </div>
      </div>
    </>;
};

## Top-level fields

### `log_config_name`

Path to the [loggers YAML configuration file](/ecosystem/nodes/rust/logs-config). Relative paths are resolved from the directory containing `config.json`.

| Type           | Required | Default                                               |
| -------------- | -------- | ----------------------------------------------------- |
| string \| null | no       | `null`; falls back to console output at `info` level. |

In the Helm chart, set this field to `"/main/logs.config.yml"`.

### `ton_global_config_name`

Path to the [global network config](/ecosystem/nodes/rust/global-config). Determines which network the node joins.

| Type           | Required | Default |
| -------------- | -------- | ------- |
| string \| null | yes      | `null`  |

In the Helm chart, always set to `"/main/global.config.json"`.

### `internal_db_path`

Path to the node's internal database directory. Stores blocks, states, indexes, and other persistent data. Requires substantial disk space; on mainnet, storage requirements are typically hundreds of gigabytes.

| Type           | Required | Default     |
| -------------- | -------- | ----------- |
| string \| null | no       | `"node_db"` |

In the Helm chart, always set to `"/db"`, where the database PVC is mounted.

### `restore_db`

Enable database integrity check and repair on startup.

| Type | Required | Default |
| ---- | -------- | ------- |
| bool | no       | `false` |

### `boot_from_zerostate`

If `true`, the node starts synchronization from the zero state, which is the genesis block, instead of the `init_block` specified in the [global config](/ecosystem/nodes/rust/global-config). This increases sync time but verifies the entire blockchain history from genesis.

| Type         | Required | Default |
| ------------ | -------- | ------- |
| bool \| null | no       | `false` |

### `sync_by_archives`

If `true`, the node syncs by downloading block archives. Faster than block-by-block sync but requires peers that serve archives.

| Type | Required | Default |
| ---- | -------- | ------- |
| bool | no       | `true`  |

### `skip_saving_persistent_states`

If `true`, the node skips saving periodic shard state snapshots. Saves disk space but makes recovery after failures harder.

| Type | Required | Default |
| ---- | -------- | ------- |
| bool | no       | `false` |

### `states_cache_mode`

Shards state caching strategy.

| Type          | Required | Default      |
| ------------- | -------- | ------------ |
| string (enum) | no       | `"Moderate"` |

| Value        | Description                                    |
| ------------ | ---------------------------------------------- |
| `"Off"`      | States are saved synchronously and not cached. |
| `"Moderate"` | States are saved asynchronously; recommended.  |

### `accelerated_consensus_disabled`

If `true`, uses the standard consensus procedure instead of the accelerated one.

| Type | Required | Default |
| ---- | -------- | ------- |
| bool | no       | `false` |

### `validation_countdown_mode`

Controls the countdown behavior for block validation.

| Type           | Required | Default                           |
| -------------- | -------- | --------------------------------- |
| string \| null | no       | `null`; equivalent to `"always"`. |

| Value                | Description                                 |
| -------------------- | ------------------------------------------- |
| `"always"`           | Countdown applies to all blocks.            |
| `"except-zerostate"` | Countdown does not apply to the zero state. |

### `default_rldp_roundtrip_ms`

Initial round-trip time or RTT estimates for the [Reliable Large Datagram Protocol (RLDP)](/foundations/whitepapers/ton#3-1-9-rldp-or-reliable-large-datagram-protocol-over-adnl) in milliseconds. RLDP is a transport layer on top of ADNL that provides ordered, retransmitted delivery for large data transfers.

| Type        | Required | Default                                       |
| ----------- | -------- | --------------------------------------------- |
| u32 \| null | no       | `null`; uses the RLDP implementation default. |

### `unsafe_catchain_patches_path`

Path to a directory with catchain JSON patch files. Used for emergency intervention in the [catchain protocol](/foundations/whitepapers/catchain) for resync and rotation. Only for emergency situations.

| Type           | Required | Default |
| -------------- | -------- | ------- |
| string \| null | no       | `null`  |

## `adnl_node`

ADNL (Abstract Datagram Network Layer) is the core networking protocol of TON. This section defines how the node participates in the ADNL network.

### `adnl_node.ip_address`

The node's external IP address and UDP port. Must be reachable from the internet. Other nodes connect to this address.

| Type   | Required | Format      |
| ------ | -------- | ----------- |
| string | yes      | `"IP:PORT"` |

<Aside type="note">
  The `adnl_node.ip_address` value must match the external IP assigned to this replica's `LoadBalancer` service. The port must match `ports.adnl` defined in Helm values.
</Aside>

### `adnl_node.keys`

Cryptographic keys for different node functions. Each key has a `tag` that determines its purpose.

| Field          | Type            | Description                             |
| -------------- | --------------- | --------------------------------------- |
| `tag`          | integer         | Key purpose; defined in the "Key tags". |
| `data.type_id` | integer         | Key type. `1209251014` = Ed25519        |
| `data.pvt_key` | string (base64) | 256-bit Ed25519 private key             |

Key tags:

| Tag | Purpose                                         |
| --- | ----------------------------------------------- |
| `1` | DHT key – used for peer discovery.              |
| `2` | Overlay key – used for block and data exchange. |

### Additional `adnl_node` fields

These optional fields are not commonly needed:

| Field                              | Type        | Default | Description                                         |
| ---------------------------------- | ----------- | ------- | --------------------------------------------------- |
| `recv_pipeline_pool`               | u8 \| null  | `null`  | Percentage of CPU cores for packet receive workers. |
| `recv_priority_pool`               | u8 \| null  | `null`  | Percentage of workers for priority receive.         |
| `throughput`                       | u32 \| null | `null`  | Max send throughput in bytes/sec.                   |
| `timeout_expire_queued_packet_sec` | u32 \| null | `null`  | Timeout for queued packets in seconds.              |

## `gc`

Garbage collector settings for cleaning up stale data.

### `gc.enable_for_archives`

Enables automatic cleanup of old block archives. If `false`, archives accumulate indefinitely.

| Type | Default |
| ---- | ------- |
| bool | `false` |

### `gc.archives_life_time_hours`

Archive retention period in hours. Archives older than the specified number of hours are pruned by `gc`.

| Type        | Default                             |
| ----------- | ----------------------------------- |
| u32 \| null | `null`; delete as soon as possible. |

Example: `48` keeps archives for the last 2 days.

### `gc.enable_for_shard_state_persistent`

Enable cleanup of old persistent shard state snapshots.

| Type | Default |
| ---- | ------- |
| bool | `false` |

### `gc.cells_gc_config`

`gc` settings for cells – the basic data storage units in TON.

| Field                | Type | Default            | Description                                                              |
| -------------------- | ---- | ------------------ | ------------------------------------------------------------------------ |
| `gc_interval_sec`    | u32  | `900` (15 min)     | Interval between cell `gc` runs.                                         |
| `cells_lifetime_sec` | u64  | `86400` (24 hours) | Cells unused for longer than this duration become eligible for deletion. |

This setting only affects cells required for serving external queries (e.g., account state requests from a lite-client). Cells required for the node’s own operation are retained regardless of this configuration.

For validators or nodes without a liteserver, a lower value, such as `1800 = 30 min`, can be used to reduce disk usage and improve performance.

## `cells_db_config`

Cell database tuning. If omitted entirely, the node uses built-in defaults for all fields. If the section is present, all fields must be specified — partial configs fail to deserialize.

### `cells_db_config.states_db_queue_len`

Maximum queue length for state write operations. Controls backpressure during async saves.

| Type | Default |
| ---- | ------- |
| u32  | `1000`  |

### `cells_db_config.prefill_cells_counters`

If `true`, pre-fills the cell counter cache during startup. Improves performance after start but increases startup time.

| Type | Default |
| ---- | ------- |
| bool | `false` |

### `cells_db_config.cells_cache_size_bytes`

Size of the cell cache in bytes. Larger values reduce disk I/O at the cost of increased memory usage.

| Type | Default               |
| ---- | --------------------- |
| u64  | `4000000000` (\~4 GB) |

### `cells_db_config.counters_cache_size_bytes`

Size of the cell reference counter cache in bytes. Used for reference counting during `gc`.

| Type | Default               |
| ---- | --------------------- |
| u64  | `4000000000` (\~4 GB) |

## `collator_config`

Configuration of the collator component responsible for assembling new blocks. Only relevant for validators.

### `collator_config.cutoff_timeout_ms`

Soft collation timeout in milliseconds. After this interval, the collator stops accepting new transactions and begins block finalization.

| Type | Default           |
| ---- | ----------------- |
| u32  | `1000` (1 second) |

### `collator_config.stop_timeout_ms`

Hard collation timeout in milliseconds. Collation is forcibly terminated after this interval. Must be greater than or equal to `cutoff_timeout_ms`.

| Type | Default              |
| ---- | -------------------- |
| u32  | `1500` (1.5 seconds) |

### `collator_config.clean_timeout_percentage_points`

Cleanup timeout as a fraction of `cutoff_timeout`. Measured in per-mille; out of 1000. For example, `150` corresponds to 15% of `cutoff_timeout` and defines the time allocated for removing processed messages during collation.

| Type | Default |
| ---- | ------- |
| u32  | `150`   |

### `collator_config.optimistic_clean_percentage_points`

Fraction of `clean_timeout` used for the first cleanup attempt. `1000` corresponds to 100%.

| Type | Default |
| ---- | ------- |
| u32  | `1000`  |

### `collator_config.max_secondary_clean_timeout_percentage_points`

Maximum secondary cleanup timeout as a fraction of `cutoff_timeout`. `350` corresponds to 35%.

| Type | Default |
| ---- | ------- |
| u32  | `350`   |

### `collator_config.max_collate_threads`

Maximum number of parallel collation threads.

| Type | Default |
| ---- | ------- |
| u32  | `10`    |

### `collator_config.retry_if_empty`

If `true`, retries collation when the resulting block contains no transactions. For TON consensus, `false` is recommended. Setting `true` may be useful in experimental networks to reduce block frequency during periods of low activity.

| Type | Default |
| ---- | ------- |
| bool | `false` |

### `collator_config.finalize_empty_after_ms`

Time in milliseconds to wait for transactions before finalizing an empty block. If no transactions are received within this interval, the block is finalized as empty.

| Type | Default |
| ---- | ------- |
| u32  | `800`   |

### `collator_config.empty_collation_sleep_ms`

Pause in milliseconds between collation attempts when there are no transactions. Reduces CPU usage during low activity.

| Type | Default |
| ---- | ------- |
| u32  | `100`   |

### `collator_config.external_messages_timeout_percentage_points`

Fraction of `cutoff_timeout` allocated for processing external messages. `100` corresponds to 10%.

| Type | Default |
| ---- | ------- |
| u32  | `100`   |

### `collator_config.external_messages_maximum_queue_length`

Maximum external message queue length. Limits memory usage during external message spam.

| Type        | Default |
| ----------- | ------- |
| u32 \| null | `25600` |

### `collator_config_mc`

Separate collator config for the masterchain. Same format as `collator_config`. If not set, `collator_config` is used for all chains.

| Type           | Default |
| -------------- | ------- |
| object \| null | `null`  |

## `control_server`

Administrative interface for managing the node — validator key rotation, monitoring, etc. Required for validators; optional for full nodes.

### `control_server.address`

Address and port to listen on.

| Type   | Format      |
| ------ | ----------- |
| string | `"IP:PORT"` |

Use `"0.0.0.0:<port>"` to listen on all interfaces. For security, consider `"127.0.0.1:<port>"` if management is local only. The port must match `ports.control` in Helm values.

### `control_server.server_key`

Server private key for ADNL encryption.

| Field     | Type            | Description            |
| --------- | --------------- | ---------------------- |
| `type_id` | integer         | `1209251014` = Ed25519 |
| `pvt_key` | string (base64) | 256-bit private key    |

### `control_server.clients`

Authorized clients allowed to connect.

| Field            | Type            | Description                 |
| ---------------- | --------------- | --------------------------- |
| `list`           | array           | Array of client public keys |
| `list[].type_id` | integer         | `1209251014` = Ed25519      |
| `list[].pub_key` | string (base64) | Client public key           |

If `clients` is omitted or empty, any client can connect.

## `lite_server`

Allows lite clients, such as tonlib, etc., to connect to the node for queries. The corresponding public key is published in the global config's `liteservers` section for clients to discover it.

### `lite_server.address`

Address and port for liteclient connections. The port must match `ports.liteserver` in Helm values.

| Type   | Format      |
| ------ | ----------- |
| string | `"IP:PORT"` |

### `lite_server.server_key`

Server private key. Same format as `control_server.server_key`.

### `lite_server.max_parallel_fast_queries`

Maximum number of concurrent "fast" queries, which read from cache or perform simple lookups. Limits concurrency to prevent resource exhaustion under high load.

| Type        | Required | Default |
| ----------- | -------- | ------- |
| u64 \| null | no       | `256`   |

### `lite_server.max_parallel_slow_queries`

Maximum number of concurrent "slow" queries, which require disk reads, state traversal, or proof generation. These are more resource-intensive, so the default is lower.

| Type        | Required | Default |
| ----------- | -------- | ------- |
| u64 \| null | no       | `16`    |

### `lite_server.account_state_cache_size_mb`

Size of the in-memory cache for account states in megabytes. Caches recently queried account states to avoid repeated disk lookups.

| Type        | Required | Default    |
| ----------- | -------- | ---------- |
| u64 \| null | no       | `256` (MB) |

## `json_rpc_server`

HTTP JSON-RPC server for API requests.

### `json_rpc_server.address`

Address and port for the HTTP API. The port must match `ports.jsonRpc` in Helm values.

| Type   | Format      |
| ------ | ----------- |
| string | `"IP:PORT"` |

## `metrics`

Prometheus metrics and Kubernetes health probe HTTP server. When present, the node starts an HTTP server with three endpoints:

| Endpoint       | Purpose                    |
| -------------- | -------------------------- |
| `GET /metrics` | Prometheus scrape endpoint |
| `GET /healthz` | Kubernetes liveness probe  |
| `GET /readyz`  | Kubernetes readiness probe |

If the `metrics` section is absent from the config, the metrics server is not started, meaning no metrics and no probes.

### `metrics.address`

Address and port for the [metrics](/ecosystem/nodes/rust/metrics) and [probes](/ecosystem/nodes/rust/probes) HTTP server. The port must match `ports.metrics` in Helm values.

| Type   | Required | Format      |
| ------ | -------- | ----------- |
| string | yes      | `"IP:PORT"` |

Recommended: `"0.0.0.0:9100"`.

### `metrics.histogram_buckets`

Custom histogram bucket boundaries, keyed by metric name suffix. If a key matches the end of a histogram metric name, those buckets are used.

| Type                   | Required | Default                                                            |
| ---------------------- | -------- | ------------------------------------------------------------------ |
| map\<string, float\[]> | no       | `{}`; default duration buckets applied to all `*_seconds` metrics. |

When empty or absent, the following default buckets are applied to all histograms whose name ends with `seconds`:

```
[0.000001, 0.0001, 0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0, 60.0, 120.0, 300.0, 600.0, 3600.0]
```

Example of overriding buckets for all `*_seconds` histograms and adding custom ones for `gas_used`:

```json theme={"theme":{"light":"github-light-default","dark":"dark-plus"},"languages":{"custom":["/resources/grammars/tolk.tmLanguage.json","/resources/grammars/tlb.tmLanguage.json","/resources/grammars/fift.tmLanguage.json","/resources/grammars/tasm.tmLanguage.json","/resources/grammars/func.tmLanguage.json"]}}
"histogram_buckets": {
  "seconds": [0.001, 0.01, 0.1, 0.5, 1.0, 5.0, 30.0, 60.0],
  "gas_used": [1000, 10000, 100000, 500000, 1000000]
}
```

### `metrics.global_labels`

Key-value pairs added to every metric. Useful for distinguishing nodes when multiple instances report to the same Prometheus.

| Type                 | Required | Default |
| -------------------- | -------- | ------- |
| map\<string, string> | no       | `{}`    |

<Aside type="note">
  The bundled [Grafana dashboard](https://github.com/RSquad/ton-rust-node/tree/master/grafana) relies on the `network` and `node_id` labels for filtering. If `global_labels` is not set or is empty, dashboard variables will be empty and panels will display no data.

  Both labels must be defined.
</Aside>

Example:

```json theme={"theme":{"light":"github-light-default","dark":"dark-plus"},"languages":{"custom":["/resources/grammars/tolk.tmLanguage.json","/resources/grammars/tlb.tmLanguage.json","/resources/grammars/fift.tmLanguage.json","/resources/grammars/tasm.tmLanguage.json","/resources/grammars/func.tmLanguage.json"]}}
"global_labels": {
  "network": "mainnet",
  "node_id": "validator-01"
}
```

### Full example

```json theme={"theme":{"light":"github-light-default","dark":"dark-plus"},"languages":{"custom":["/resources/grammars/tolk.tmLanguage.json","/resources/grammars/tlb.tmLanguage.json","/resources/grammars/fift.tmLanguage.json","/resources/grammars/tasm.tmLanguage.json","/resources/grammars/func.tmLanguage.json"]}}
"metrics": {
  "address": "0.0.0.0:9100",
  "histogram_buckets": {},
  "global_labels": {
    "network": "mainnet",
    "node_id": "validator-01"
  }
}
```

## `extensions`

Optional network extensions.

| Field                          | Type       | Default | Description                                                                                                                   |
| ------------------------------ | ---------- | ------- | ----------------------------------------------------------------------------------------------------------------------------- |
| `disable_broadcast_retransmit` | bool       | `false` | Disable broadcast retransmission. Reduces traffic but hurts data propagation.                                                 |
| `adnl_compression`             | bool       | `false` | Enable ADNL packet compression. Not compatible with C++ TON nodes; only enable in networks where all peers run the Rust node. |
| `broadcast_hops`               | u8 \| null | `null`  | Maximum number of broadcast hops.                                                                                             |

<Aside type="danger" title="Mainnet compatibility">
  Do not enable `adnl_compression` on mainnet while any dependent peers run C++ TON nodes. This option is only safe when all interacting peers run the Rust node implementation.
</Aside>

## `secrets_vault_config`

External secrets vault for storing private keys outside of `config.json`.

```json theme={"theme":{"light":"github-light-default","dark":"dark-plus"},"languages":{"custom":["/resources/grammars/tolk.tmLanguage.json","/resources/grammars/tlb.tmLanguage.json","/resources/grammars/fift.tmLanguage.json","/resources/grammars/tasm.tmLanguage.json","/resources/grammars/func.tmLanguage.json"]}}
"secrets_vault_config": {
  "url": "file:///path/to/vault"
}
```

| Type           | Default |
| -------------- | ------- |
| object \| null | `null`  |

<Aside type="note" title="Helm integration">
  For Helm deployments, prefer chart-level `vault.url` or `vault.secretName` values. When `VAULT_URL` is set by Helm, do not also set `secrets_vault_config` in `config.json`.
</Aside>

## Auto-managed fields

The following fields are written by the node itself through the control server and must not be edited manually:

| Field                | Description                                                       |
| -------------------- | ----------------------------------------------------------------- |
| `validator_keys`     | Validator key records with election IDs and expiration timestamps |
| `validator_key_ring` | Private key storage for validator keys                            |

These fields are primarily relevant in testing environments. During validator elections, the node rotates keys and writes updated values to `config.json`. In a Kubernetes environment, this has no persistent effect because the configuration is stored in a Secret and is overwritten on pod restart or Helm upgrade.

These fields should be treated as initialization-only or system-managed. The node regenerates them as required through the control server.

## Validator-specific sections

The [`collator_config` section](/ecosystem/nodes/rust/node-config-ref#collator_config) defines block collation parameters, including timeouts, threading, and message queue limits. Use the [validator node config example](/ecosystem/nodes/rust/node-config#validator-node-config-example) for typical values.

## Advanced fields

The following fields are present in the configuration but are not required for standard node operation. They should be left unchanged unless explicitly instructed otherwise.

| Field                            | Type           | Default             | Description                                                                       |
| -------------------------------- | -------------- | ------------------- | --------------------------------------------------------------------------------- |
| `accelerated_consensus_disabled` | bool           | `false`             | Disables accelerated consensus, falling back to the standard procedure.           |
| `validation_countdown_mode`      | string \| null | `null` (`"always"`) | Defines when validation countdown is applied: `"always"` or `"except-zerostate"`. |
| `default_rldp_roundtrip_ms`      | u32 \| null    | `null`              | Initial RTT estimate for the RLDP protocol, in milliseconds.                      |
| `unsafe_catchain_patches_path`   | string \| null | `null`              | Path to catchain emergency patch files. Intended for emergency use only.          |
