From 88e9d670c6b80f84ae5f087f6264cc3a9fc38021 Mon Sep 17 00:00:00 2001 From: Alex G Date: Tue, 14 Apr 2026 14:54:42 +0900 Subject: [PATCH 1/7] Update config docs --- foundations/config.mdx | 124 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) diff --git a/foundations/config.mdx b/foundations/config.mdx index 87c717f74..83e271d5e 100644 --- a/foundations/config.mdx +++ b/foundations/config.mdx @@ -462,6 +462,130 @@ For up-to-date values, see [https://tonviewer.com/config](https://tonviewer.com/ [Parameter #29 on mainnet](https://tonviewer.com/config#29) +## Param 30: consensus extension + + + +This parameter carries per-workchain configuration for the Catchain 2.0 consensus path ([Simplex](https://github.com/ton-blockchain/simplex-docs/blob/main/Simplex.md)).`ConfigParam 30` does not fully replace `ConfigParam 29`. At runtime, the node still copies `max_block_size` and `max_collated_data_size` from `ConfigParam 29` into `ton::NewConsensusConfig`. + +#### On-chain schema + +Current `crypto/block/block.tlb` [defines](https://github.com/ton-blockchain/ton/blob/af252bcdaea357fee21739e984654c2c84e7d61d/crypto/block/block.tlb#L782): + +```tlb +simplex_config#21 flags:(## 7) use_quic:Bool + target_rate_ms:uint32 slots_per_leader_window:uint32 + first_block_timeout_ms:uint32 max_leader_window_desync:uint32 = NewConsensusConfig; + +simplex_config_v2#22 flags:(## 7) use_quic:Bool + slots_per_leader_window:uint32 + noncritical_params:(HashmapE 8 uint32) = NewConsensusConfig; + +new_consensus_config_all#10 + mc:(Maybe ^NewConsensusConfig) + shard:(Maybe ^NewConsensusConfig) = NewConsensusConfigAll; + +_ NewConsensusConfigAll = ConfigParam 30; +``` + +`NewConsensusConfig` currently has only two constructors: + +- `simplex_config#21` + +- `simplex_config_v2#22` + +#### Top-level fields + +`new_consensus_config_all#10` contains two optional refs: + +| Field | Type | Meaning | +| --- | --- | --- | +| `mc` | `Maybe ^NewConsensusConfig` | Config used for the masterchain (`workchain = -1`) | +| `shard` | `Maybe ^NewConsensusConfig` | Config used for shardchains (all non-masterchain workchains) | + +Both refs may be absent. That means `ConfigParam 30` does not provide a new consensus config for that class of workchain. For now, it means that in the corresponding chain, the old Catchain setting is active. In the future, it is expected that Catchain will be removed, and Catchain 2.0 with default params will be used. + + +#### `simplex_config_v2#22` (current extensible format) + +`simplex_config_v2#22` keeps only the stable top-level fields and moves the rest into a sparse +dictionary: + +```tlb +simplex_config_v2#22 flags:(## 7) use_quic:Bool + slots_per_leader_window:uint32 + noncritical_params:(HashmapE 8 uint32) = NewConsensusConfig; +``` + +| Field | Type | Meaning | +| --- | --- | --- | +| `flags` | `## 7` | Reserved for the future | +| `use_quic` | `Bool` | Whether the new consensus path uses QUIC transport instead of RLDP2. Set to **True** in mainnet | +| `slots_per_leader_window` | `uint32` | Number of consecutive slots assigned to one leader. Set to **4** in mainnet | +| `noncritical_params` | `HashmapE 8 uint32` | Sparse map from parameter id to raw 32-bit value | + +`noncritical_params` dictionary contains parameters that affect different parts of consensus-reaching but doesn't need to be the same on all validators: + +- The key is an 8-bit parameter id. +- The value is always a raw 32-bit word. +- Unknown ids are ignored by the current implementation. +- Missing ids use defaults from `ton::NewConsensusConfig::NoncriticalParams`. +- Duration-like params store milliseconds directly in the `uint32` value. +- Double-like params store an IEEE-754 `float32` bit pattern in the `uint32` value; the loader + reinterprets those bits as `float` and widens to `double`. + +#### Noncritical parameter ids + +The runtime recognizes ids `0..14`. + +Operational note: + +- The implementation supports all ids in the table below. +- In **mainnet** only ids `0`, `1`, and `13` are explicitly set. For other values default are used. +- Other ids are normally left absent and therefore use defaults. + +| Id | Name | Stored as | Default | Meaning | +| --- | --- | --- | --- | --- | +| `0` | `target_rate` | `uint32` milliseconds | `2400 ms` | Target slot/block interval; used for leader pacing, block production timing, and skip scheduling | +| `1` | `first_block_timeout` | `uint32` milliseconds | `1000 ms` | Base timeout before skip voting starts for the first missing block in a leader window | +| `2` | `first_block_timeout_multiplier` | `float32` bits in `uint32` | `1.2` | Multiplier applied to `first_block_timeout` after a window that had skips | +| `3` | `first_block_timeout_cap` | `uint32` milliseconds | `100000 ms` | Cap for the adaptive `first_block_timeout` growth | +| `4` | `candidate_resolve_timeout` | `uint32` milliseconds | `1000 ms` | Initial timeout for candidate / notarization resolution requests | +| `5` | `candidate_resolve_timeout_multiplier` | `float32` bits in `uint32` | `1.2` | Backoff multiplier for candidate resolution retries | +| `6` | `candidate_resolve_timeout_cap` | `uint32` milliseconds | `10000 ms` | Cap for candidate resolution timeout growth | +| `7` | `candidate_resolve_cooldown` | `uint32` milliseconds | `10 ms` | Cooldown between candidate resolution attempts | +| `8` | `standstill_timeout` | `uint32` milliseconds | `10000 ms` | No-progress timeout before standstill recovery / rebroadcast logic triggers | +| `9` | `standstill_max_egress_bytes_per_s` | `uint32` | `6553600` (`50 << 17`) | Egress rate cap used during standstill rebroadcast | +| `10` | `max_leader_window_desync` | `uint32` | `250` | Maximum tolerated future leader-window distance for inbound Simplex traffic | +| `11` | `bad_signature_ban_duration` | `uint32` milliseconds | `5000 ms` | Temporary ban duration after receiving bad signatures from a peer | +| `12` | `candidate_resolve_rate_limit` | `uint32` | `10` | Per-peer rate limit for candidate resolution requests | +| `13` | `min_block_interval` | `uint32` milliseconds | `0 ms` | Minimum interval between parent block time and the next locally generated block | +| `14` | `no_empty_blocks_on_error_timeout` | `uint32` milliseconds | `15000 ms` | How long empty-block fallback remains allowed after the last finalized block when collation fails or times out | + +### Defaults outside the hashmap + +In `ton::NewConsensusConfig`, the defaults relevant to `ConfigParam 30` are: + +- `use_quic = false` +- `slots_per_leader_window = 4` +- `max_block_size = 4 MiB` +- `max_collated_data_size = 4 MiB` + +The two size limits are not stored in `ConfigParam 30`; they are copied from `ConfigParam 29` when +the runtime builds `ton::NewConsensusConfig`. + +### Compatibility and migration notes + +- `simplex_config#21` is the legacy fixed-layout format. +- `simplex_config_v2#22` is the current extensible format. +- `simplex_config_v2#22` should be preferred for new config work because it supports sparse, + per-id extension without changing the outer layout. + + ## Param 31: fee-exempt contracts This parameter represents the configuration of smart contract addresses from which no fees are charged for either gas or storage, and where **tick-tock** transactions can be created. The list usually includes governance contracts. The parameter is presented as a binary tree structure — a tree (HashMap 256), where the keys are a 256-bit representation of the address. Only addresses in the masterchain can be present in this list. From 4b1d3f497d88e8d8e786bac8f05ecbf281d0900c Mon Sep 17 00:00:00 2001 From: Novus Nota <68142933+novusnota@users.noreply.github.com> Date: Tue, 14 Apr 2026 11:31:46 +0200 Subject: [PATCH 2/7] Apply suggestion Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- foundations/config.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/foundations/config.mdx b/foundations/config.mdx index 83e271d5e..c0c6ed21a 100644 --- a/foundations/config.mdx +++ b/foundations/config.mdx @@ -464,7 +464,7 @@ For up-to-date values, see [https://tonviewer.com/config](https://tonviewer.com/ ## Param 30: consensus extension - -This parameter carries per-workchain configuration for the Catchain 2.0 consensus path ([Simplex](https://github.com/ton-blockchain/simplex-docs/blob/main/Simplex.md)).`ConfigParam 30` does not fully replace `ConfigParam 29`. At runtime, the node still copies `max_block_size` and `max_collated_data_size` from `ConfigParam 29` into `ton::NewConsensusConfig`. +This parameter carries per-workchain configuration for the Catchain 2.0 consensus path ([Simplex](https://github.com/ton-blockchain/simplex-docs/blob/main/Simplex.md)). `ConfigParam 30` does not fully replace `ConfigParam 29`. At runtime, the node still copies `max_block_size` and `max_collated_data_size` from `ConfigParam 29` into `ton::NewConsensusConfig`. #### On-chain schema From cda2bd9a0a6a40d2ad40d0973c49dc65857c224d Mon Sep 17 00:00:00 2001 From: Novus Nota <68142933+novusnota@users.noreply.github.com> Date: Tue, 14 Apr 2026 11:50:20 +0200 Subject: [PATCH 4/7] fmt and ID --- foundations/config.mdx | 80 +++++++++++++++++++----------------------- 1 file changed, 37 insertions(+), 43 deletions(-) diff --git a/foundations/config.mdx b/foundations/config.mdx index f6039417f..88877dfe4 100644 --- a/foundations/config.mdx +++ b/foundations/config.mdx @@ -492,24 +492,20 @@ _ NewConsensusConfigAll = ConfigParam 30; `NewConsensusConfig` currently has only two constructors: -- `simplex_config#21` - +- `simplex_config#21` — scheduled for removal - `simplex_config_v2#22` #### Top-level fields `new_consensus_config_all#10` contains two optional refs: -| Field | Type | Meaning | -| --- | --- | --- | -| `mc` | `Maybe ^NewConsensusConfig` | Config used for the masterchain (`workchain = -1`) | +| Field | Type | Meaning | +| ------- | --------------------------- | ------------------------------------------------------------ | +| `mc` | `Maybe ^NewConsensusConfig` | Config used for the masterchain (`workchain = -1`) | | `shard` | `Maybe ^NewConsensusConfig` | Config used for shardchains (all non-masterchain workchains) | Both refs may be absent. That means `ConfigParam 30` does not provide a new consensus config for that class of workchain. For now, it means that in the corresponding chain, the old Catchain setting is active. In the future, it is expected that Catchain will be removed, and Catchain 2.0 with default params will be used. - #### `simplex_config_v2#22` (current extensible format) `simplex_config_v2#22` keeps only the stable top-level fields and moves the rest into a sparse @@ -521,50 +517,50 @@ simplex_config_v2#22 flags:(## 7) use_quic:Bool noncritical_params:(HashmapE 8 uint32) = NewConsensusConfig; ``` -| Field | Type | Meaning | -| --- | --- | --- | -| `flags` | `## 7` | Reserved for the future | -| `use_quic` | `Bool` | Whether the new consensus path uses QUIC transport instead of RLDP2. Set to **True** in mainnet | -| `slots_per_leader_window` | `uint32` | Number of consecutive slots assigned to one leader. Set to **4** in mainnet | -| `noncritical_params` | `HashmapE 8 uint32` | Sparse map from parameter id to raw 32-bit value | +| Field | Type | Meaning | +| ------------------------- | ------------------- | ----------------------------------------------------------------------------------------------- | +| `flags` | `## 7` | Reserved for the future | +| `use_quic` | `Bool` | Whether the new consensus path uses QUIC transport instead of RLDP2. Set to **True** in mainnet | +| `slots_per_leader_window` | `uint32` | Number of consecutive slots assigned to one leader. Set to **4** in mainnet | +| `noncritical_params` | `HashmapE 8 uint32` | Sparse map from parameter ID to raw 32-bit value | `noncritical_params` dictionary contains parameters that affect different parts of consensus-reaching but doesn't need to be the same on all validators: -- The key is an 8-bit parameter id. +- The key is an 8-bit parameter ID. - The value is always a raw 32-bit word. -- Unknown ids are ignored by the current implementation. -- Missing ids use defaults from `ton::NewConsensusConfig::NoncriticalParams`. +- Unknown IDs are ignored by the current implementation. +- Missing IDs use defaults from `ton::NewConsensusConfig::NoncriticalParams`. - Duration-like params store milliseconds directly in the `uint32` value. - Double-like params store an IEEE-754 `float32` bit pattern in the `uint32` value; the loader reinterprets those bits as `float` and widens to `double`. -#### Noncritical parameter ids +#### Noncritical parameter IDs -The runtime recognizes ids `0..14`. +The runtime recognizes IDs `0..14`. Operational note: -- The implementation supports all ids in the table below. -- In **mainnet** only ids `0`, `1`, and `13` are explicitly set. For other values default are used. -- Other ids are normally left absent and therefore use defaults. - -| Id | Name | Stored as | Default | Meaning | -| --- | --- | --- | --- | --- | -| `0` | `target_rate` | `uint32` milliseconds | `2400 ms` | Target slot/block interval; used for leader pacing, block production timing, and skip scheduling | -| `1` | `first_block_timeout` | `uint32` milliseconds | `1000 ms` | Base timeout before skip voting starts for the first missing block in a leader window | -| `2` | `first_block_timeout_multiplier` | `float32` bits in `uint32` | `1.2` | Multiplier applied to `first_block_timeout` after a window that had skips | -| `3` | `first_block_timeout_cap` | `uint32` milliseconds | `100000 ms` | Cap for the adaptive `first_block_timeout` growth | -| `4` | `candidate_resolve_timeout` | `uint32` milliseconds | `1000 ms` | Initial timeout for candidate / notarization resolution requests | -| `5` | `candidate_resolve_timeout_multiplier` | `float32` bits in `uint32` | `1.2` | Backoff multiplier for candidate resolution retries | -| `6` | `candidate_resolve_timeout_cap` | `uint32` milliseconds | `10000 ms` | Cap for candidate resolution timeout growth | -| `7` | `candidate_resolve_cooldown` | `uint32` milliseconds | `10 ms` | Cooldown between candidate resolution attempts | -| `8` | `standstill_timeout` | `uint32` milliseconds | `10000 ms` | No-progress timeout before standstill recovery / rebroadcast logic triggers | -| `9` | `standstill_max_egress_bytes_per_s` | `uint32` | `6553600` (`50 << 17`) | Egress rate cap used during standstill rebroadcast | -| `10` | `max_leader_window_desync` | `uint32` | `250` | Maximum tolerated future leader-window distance for inbound Simplex traffic | -| `11` | `bad_signature_ban_duration` | `uint32` milliseconds | `5000 ms` | Temporary ban duration after receiving bad signatures from a peer | -| `12` | `candidate_resolve_rate_limit` | `uint32` | `10` | Per-peer rate limit for candidate resolution requests | -| `13` | `min_block_interval` | `uint32` milliseconds | `0 ms` | Minimum interval between parent block time and the next locally generated block | -| `14` | `no_empty_blocks_on_error_timeout` | `uint32` milliseconds | `15000 ms` | How long empty-block fallback remains allowed after the last finalized block when collation fails or times out | +- The implementation supports all IDs in the table below. +- In **mainnet** only IDs `0`, `1`, and `13` are explicitly set. For other values default are used. +- Other IDs are normally left absent and therefore use defaults. + +| ID | Name | Stored as | Default | Meaning | +| ---- | -------------------------------------- | -------------------------- | ---------------------- | -------------------------------------------------------------------------------------------------------------- | +| `0` | `target_rate` | `uint32` milliseconds | `2400 ms` | Target slot/block interval; used for leader pacing, block production timing, and skip scheduling | +| `1` | `first_block_timeout` | `uint32` milliseconds | `1000 ms` | Base timeout before skip voting starts for the first missing block in a leader window | +| `2` | `first_block_timeout_multiplier` | `float32` bits in `uint32` | `1.2` | Multiplier applied to `first_block_timeout` after a window that had skips | +| `3` | `first_block_timeout_cap` | `uint32` milliseconds | `100000 ms` | Cap for the adaptive `first_block_timeout` growth | +| `4` | `candidate_resolve_timeout` | `uint32` milliseconds | `1000 ms` | Initial timeout for candidate / notarization resolution requests | +| `5` | `candidate_resolve_timeout_multiplier` | `float32` bits in `uint32` | `1.2` | Backoff multiplier for candidate resolution retries | +| `6` | `candidate_resolve_timeout_cap` | `uint32` milliseconds | `10000 ms` | Cap for candidate resolution timeout growth | +| `7` | `candidate_resolve_cooldown` | `uint32` milliseconds | `10 ms` | Cooldown between candidate resolution attempts | +| `8` | `standstill_timeout` | `uint32` milliseconds | `10000 ms` | No-progress timeout before standstill recovery / rebroadcast logic triggers | +| `9` | `standstill_max_egress_bytes_per_s` | `uint32` | `6553600` (`50 << 17`) | Egress rate cap used during standstill rebroadcast | +| `10` | `max_leader_window_desync` | `uint32` | `250` | Maximum tolerated future leader-window distance for inbound Simplex traffic | +| `11` | `bad_signature_ban_duration` | `uint32` milliseconds | `5000 ms` | Temporary ban duration after receiving bad signatures from a peer | +| `12` | `candidate_resolve_rate_limit` | `uint32` | `10` | Per-peer rate limit for candidate resolution requests | +| `13` | `min_block_interval` | `uint32` milliseconds | `0 ms` | Minimum interval between parent block time and the next locally generated block | +| `14` | `no_empty_blocks_on_error_timeout` | `uint32` milliseconds | `15000 ms` | How long empty-block fallback remains allowed after the last finalized block when collation fails or times out | ### Defaults outside the hashmap @@ -582,9 +578,7 @@ the runtime builds `ton::NewConsensusConfig`. - `simplex_config#21` is the legacy fixed-layout format. - `simplex_config_v2#22` is the current extensible format. -- `simplex_config_v2#22` should be preferred for new config work because it supports sparse, - per-id extension without changing the outer layout. - +- `simplex_config_v2#22` should be preferred for new config work because it supports sparse, per-ID extension without changing the outer layout. ## Param 31: fee-exempt contracts From 22c529fbefdc8763ffd8d55215d6d8405f7fd341 Mon Sep 17 00:00:00 2001 From: Novus Nota <68142933+novusnota@users.noreply.github.com> Date: Tue, 14 Apr 2026 20:59:53 +0200 Subject: [PATCH 5/7] edits --- foundations/config.mdx | 147 +++++++++++++++++------------------------ 1 file changed, 61 insertions(+), 86 deletions(-) diff --git a/foundations/config.mdx b/foundations/config.mdx index 88877dfe4..f825b6588 100644 --- a/foundations/config.mdx +++ b/foundations/config.mdx @@ -465,120 +465,95 @@ For up-to-date values, see [https://tonviewer.com/config](https://tonviewer.com/ ## Param 30: consensus extension -This parameter carries per-workchain configuration for the Catchain 2.0 consensus path ([Simplex](https://github.com/ton-blockchain/simplex-docs/blob/main/Simplex.md)). `ConfigParam 30` does not fully replace `ConfigParam 29`. At runtime, the node still copies `max_block_size` and `max_collated_data_size` from `ConfigParam 29` into `ton::NewConsensusConfig`. +This parameter stores optional per-workchain settings for the [Simplex](https://github.com/ton-blockchain/simplex-docs/blob/main/Simplex.md)-based Catchain 2.0 consensus path. It does not fully replace `ConfigParam 29`: the node still uses `max_block_size` and `max_collated_data_size` from the `ConfigParam 29`. -#### On-chain schema - -Current `crypto/block/block.tlb` [defines](https://github.com/ton-blockchain/ton/blob/af252bcdaea357fee21739e984654c2c84e7d61d/crypto/block/block.tlb#L782): +The `crypto/block/block.tlb` [defines](https://github.com/ton-blockchain/ton/blob/v2026.04/crypto/block/block.tlb#L782) the following schema: ```tlb -simplex_config#21 flags:(## 7) use_quic:Bool - target_rate_ms:uint32 slots_per_leader_window:uint32 - first_block_timeout_ms:uint32 max_leader_window_desync:uint32 = NewConsensusConfig; +simplex_config#21 flags:(## 7) + use_quic:Bool + target_rate_ms:uint32 + slots_per_leader_window:uint32 + first_block_timeout_ms:uint32 + max_leader_window_desync:uint32 + = NewConsensusConfig; -simplex_config_v2#22 flags:(## 7) use_quic:Bool +simplex_config_v2#22 flags:(## 7) + use_quic:Bool slots_per_leader_window:uint32 - noncritical_params:(HashmapE 8 uint32) = NewConsensusConfig; + noncritical_params:(HashmapE 8 uint32) + = NewConsensusConfig; new_consensus_config_all#10 mc:(Maybe ^NewConsensusConfig) - shard:(Maybe ^NewConsensusConfig) = NewConsensusConfigAll; + shard:(Maybe ^NewConsensusConfig) + = NewConsensusConfigAll; _ NewConsensusConfigAll = ConfigParam 30; ``` -`NewConsensusConfig` currently has only two constructors: - -- `simplex_config#21` — scheduled for removal -- `simplex_config_v2#22` - -#### Top-level fields +There are two optional refs in `new_consensus_config_all#10`. If a ref is absent, then the pre-2.0 Catchain config is active for the corresponding class of chains: -`new_consensus_config_all#10` contains two optional refs: +| Field | Type | Meaning | +| ------- | --------------------------- | ------------------------------------------------------- | +| `mc` | `Maybe ^NewConsensusConfig` | Config for the masterchain (`workchain = -1`) | +| `shard` | `Maybe ^NewConsensusConfig` | Config for shardchains (all non-masterchain workchains) | -| Field | Type | Meaning | -| ------- | --------------------------- | ------------------------------------------------------------ | -| `mc` | `Maybe ^NewConsensusConfig` | Config used for the masterchain (`workchain = -1`) | -| `shard` | `Maybe ^NewConsensusConfig` | Config used for shardchains (all non-masterchain workchains) | +The `NewConsensusConfig` has two constructors: -Both refs may be absent. That means `ConfigParam 30` does not provide a new consensus config for that class of workchain. For now, it means that in the corresponding chain, the old Catchain setting is active. In the future, it is expected that Catchain will be removed, and Catchain 2.0 with default params will be used. +- `simplex_config#21` is the legacy fixed-layout format; scheduled for removal. +- `simplex_config_v2#22` is the current extensible format, which supports arbitrary `noncritical_params` without changes to the `block.tlb` layout. -#### `simplex_config_v2#22` (current extensible format) - -`simplex_config_v2#22` keeps only the stable top-level fields and moves the rest into a sparse -dictionary: +The `simplex_config_v2#22` constructor moves noncritical configuration parameters into a sparse dictionary: ```tlb -simplex_config_v2#22 flags:(## 7) use_quic:Bool +simplex_config_v2#22 flags:(## 7) + use_quic:Bool slots_per_leader_window:uint32 - noncritical_params:(HashmapE 8 uint32) = NewConsensusConfig; + noncritical_params:(HashmapE 8 uint32) + = NewConsensusConfig; ``` -| Field | Type | Meaning | -| ------------------------- | ------------------- | ----------------------------------------------------------------------------------------------- | -| `flags` | `## 7` | Reserved for the future | -| `use_quic` | `Bool` | Whether the new consensus path uses QUIC transport instead of RLDP2. Set to **True** in mainnet | -| `slots_per_leader_window` | `uint32` | Number of consecutive slots assigned to one leader. Set to **4** in mainnet | -| `noncritical_params` | `HashmapE 8 uint32` | Sparse map from parameter ID to raw 32-bit value | - -`noncritical_params` dictionary contains parameters that affect different parts of consensus-reaching but doesn't need to be the same on all validators: +### Configuration parameters of `simplex_config_v2` -- The key is an 8-bit parameter ID. -- The value is always a raw 32-bit word. -- Unknown IDs are ignored by the current implementation. -- Missing IDs use defaults from `ton::NewConsensusConfig::NoncriticalParams`. -- Duration-like params store milliseconds directly in the `uint32` value. -- Double-like params store an IEEE-754 `float32` bit pattern in the `uint32` value; the loader - reinterprets those bits as `float` and widens to `double`. - -#### Noncritical parameter IDs - -The runtime recognizes IDs `0..14`. - -Operational note: - -- The implementation supports all IDs in the table below. -- In **mainnet** only IDs `0`, `1`, and `13` are explicitly set. For other values default are used. -- Other IDs are normally left absent and therefore use defaults. - -| ID | Name | Stored as | Default | Meaning | -| ---- | -------------------------------------- | -------------------------- | ---------------------- | -------------------------------------------------------------------------------------------------------------- | -| `0` | `target_rate` | `uint32` milliseconds | `2400 ms` | Target slot/block interval; used for leader pacing, block production timing, and skip scheduling | -| `1` | `first_block_timeout` | `uint32` milliseconds | `1000 ms` | Base timeout before skip voting starts for the first missing block in a leader window | -| `2` | `first_block_timeout_multiplier` | `float32` bits in `uint32` | `1.2` | Multiplier applied to `first_block_timeout` after a window that had skips | -| `3` | `first_block_timeout_cap` | `uint32` milliseconds | `100000 ms` | Cap for the adaptive `first_block_timeout` growth | -| `4` | `candidate_resolve_timeout` | `uint32` milliseconds | `1000 ms` | Initial timeout for candidate / notarization resolution requests | -| `5` | `candidate_resolve_timeout_multiplier` | `float32` bits in `uint32` | `1.2` | Backoff multiplier for candidate resolution retries | -| `6` | `candidate_resolve_timeout_cap` | `uint32` milliseconds | `10000 ms` | Cap for candidate resolution timeout growth | -| `7` | `candidate_resolve_cooldown` | `uint32` milliseconds | `10 ms` | Cooldown between candidate resolution attempts | -| `8` | `standstill_timeout` | `uint32` milliseconds | `10000 ms` | No-progress timeout before standstill recovery / rebroadcast logic triggers | -| `9` | `standstill_max_egress_bytes_per_s` | `uint32` | `6553600` (`50 << 17`) | Egress rate cap used during standstill rebroadcast | -| `10` | `max_leader_window_desync` | `uint32` | `250` | Maximum tolerated future leader-window distance for inbound Simplex traffic | -| `11` | `bad_signature_ban_duration` | `uint32` milliseconds | `5000 ms` | Temporary ban duration after receiving bad signatures from a peer | -| `12` | `candidate_resolve_rate_limit` | `uint32` | `10` | Per-peer rate limit for candidate resolution requests | -| `13` | `min_block_interval` | `uint32` milliseconds | `0 ms` | Minimum interval between parent block time and the next locally generated block | -| `14` | `no_empty_blocks_on_error_timeout` | `uint32` milliseconds | `15000 ms` | How long empty-block fallback remains allowed after the last finalized block when collation fails or times out | - -### Defaults outside the hashmap - -In `ton::NewConsensusConfig`, the defaults relevant to `ConfigParam 30` are: - -- `use_quic = false` -- `slots_per_leader_window = 4` +- `flags`: A general field that can be used to set various binary parameters. +- `use_quic`: Whether the QUIC transport is used instead of RLDP2. Set to **True** in mainnet. +- `slots_per_leader_window`: Number of consecutive slots assigned to one leader. Set to **4** in mainnet. - `max_block_size = 4 MiB` - `max_collated_data_size = 4 MiB` +- `noncritical_params`: A `HashmapE 8 uint32` map from parameter IDs to raw 32-bit values. -The two size limits are not stored in `ConfigParam 30`; they are copied from `ConfigParam 29` when -the runtime builds `ton::NewConsensusConfig`. - -### Compatibility and migration notes +The `noncritical_params` dictionary contains tunable timing and DoS-protection parameters that might differ between validators: -- `simplex_config#21` is the legacy fixed-layout format. -- `simplex_config_v2#22` is the current extensible format. -- `simplex_config_v2#22` should be preferred for new config work because it supports sparse, per-ID extension without changing the outer layout. +- The key is an 8-bit parameter ID. +- The value is always a raw 32-bit word. +- Unknown IDs are ignored by the current implementation. +- Missing IDs use default values. +- Duration-like parameters store milliseconds directly. +- Floating-point parameters store `float32` bits according to the [IEEE-754](https://en.wikipedia.org/wiki/IEEE_754) standard in a `uint32` value. The loader then reinterprets these bits as a floating-point numeric value. + +IDs from `0` through `14` are recognized and supported. On the mainnet, only IDs `0`, `1`, and `13` are explicitly set. All other IDs are normally absent and use defaults. + +| ID | Name | Stored as | Default | Meaning | +| ---- | -------------------------------------- | -------------------------- | ---------------------- | ---------------------------------------------------------------------------------------------------------- | +| `0` | `target_rate` | `uint32` milliseconds | `2400 ms` | Target slot/block interval; used for leader pacing, block production timing, and skip scheduling. | +| `1` | `first_block_timeout` | `uint32` milliseconds | `1000 ms` | Base timeout before skip voting starts for the first missing block in a leader window. | +| `2` | `first_block_timeout_multiplier` | `float32` bits in `uint32` | `1.2` | Multiplier applied to `first_block_timeout` after a window that had skips. | +| `3` | `first_block_timeout_cap` | `uint32` milliseconds | `100000 ms` | Cap for the adaptive `first_block_timeout` growth. | +| `4` | `candidate_resolve_timeout` | `uint32` milliseconds | `1000 ms` | Initial timeout for candidate / notarization resolution requests. | +| `5` | `candidate_resolve_timeout_multiplier` | `float32` bits in `uint32` | `1.2` | Backoff multiplier for candidate resolution retries. | +| `6` | `candidate_resolve_timeout_cap` | `uint32` milliseconds | `10000 ms` | Cap for candidate resolution timeout growth. | +| `7` | `candidate_resolve_cooldown` | `uint32` milliseconds | `10 ms` | Cooldown between candidate resolution attempts. | +| `8` | `standstill_timeout` | `uint32` milliseconds | `10000 ms` | No-progress timeout before standstill recovery or rebroadcast logic triggers. | +| `9` | `standstill_max_egress_bytes_per_s` | `uint32` number | `6553600` (`50 << 17`) | Egress rate cap used during standstill rebroadcast. | +| `10` | `max_leader_window_desync` | `uint32` number | `250` | Maximum tolerated future leader-window distance for inbound Simplex traffic. | +| `11` | `bad_signature_ban_duration` | `uint32` milliseconds | `5000 ms` | Temporary ban duration after receiving bad signatures from a peer. | +| `12` | `candidate_resolve_rate_limit` | `uint32` number | `10` | Per-peer rate limit for candidate resolution requests. | +| `13` | `min_block_interval` | `uint32` milliseconds | `0 ms` | Minimum interval between parent block time and the next locally generated block. | +| `14` | `no_empty_blocks_on_error_timeout` | `uint32` milliseconds | `15000 ms` | How long empty-block fallback is allowed after the last finalized block when collation fails or times out. | ## Param 31: fee-exempt contracts From 694a47cbc53252beecb57b2301a70237b0cf175c Mon Sep 17 00:00:00 2001 From: Novus Nota <68142933+novusnota@users.noreply.github.com> Date: Tue, 14 Apr 2026 21:22:08 +0200 Subject: [PATCH 6/7] whoopsie --- foundations/config.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/foundations/config.mdx b/foundations/config.mdx index f825b6588..8f72e14a7 100644 --- a/foundations/config.mdx +++ b/foundations/config.mdx @@ -549,9 +549,9 @@ IDs from `0` through `14` are recognized and supported. On the mainnet, only IDs | `7` | `candidate_resolve_cooldown` | `uint32` milliseconds | `10 ms` | Cooldown between candidate resolution attempts. | | `8` | `standstill_timeout` | `uint32` milliseconds | `10000 ms` | No-progress timeout before standstill recovery or rebroadcast logic triggers. | | `9` | `standstill_max_egress_bytes_per_s` | `uint32` number | `6553600` (`50 << 17`) | Egress rate cap used during standstill rebroadcast. | -| `10` | `max_leader_window_desync` | `uint32` number | `250` | Maximum tolerated future leader-window distance for inbound Simplex traffic. | +| `10` | `max_leader_window_desync` | `uint32` number | `250` | Maximum tolerated future leader-window distance for inbound Simplex traffic. | | `11` | `bad_signature_ban_duration` | `uint32` milliseconds | `5000 ms` | Temporary ban duration after receiving bad signatures from a peer. | -| `12` | `candidate_resolve_rate_limit` | `uint32` number | `10` | Per-peer rate limit for candidate resolution requests. | +| `12` | `candidate_resolve_rate_limit` | `uint32` number | `10` | Per-peer rate limit for candidate resolution requests. | | `13` | `min_block_interval` | `uint32` milliseconds | `0 ms` | Minimum interval between parent block time and the next locally generated block. | | `14` | `no_empty_blocks_on_error_timeout` | `uint32` milliseconds | `15000 ms` | How long empty-block fallback is allowed after the last finalized block when collation fails or times out. | From 88efab921f7dbe6daff7d88a57942e2930bdc3d1 Mon Sep 17 00:00:00 2001 From: Novus Nota <68142933+novusnota@users.noreply.github.com> Date: Tue, 14 Apr 2026 21:23:43 +0200 Subject: [PATCH 7/7] no slashes --- foundations/config.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/foundations/config.mdx b/foundations/config.mdx index 8f72e14a7..f9b412fe8 100644 --- a/foundations/config.mdx +++ b/foundations/config.mdx @@ -539,11 +539,11 @@ IDs from `0` through `14` are recognized and supported. On the mainnet, only IDs | ID | Name | Stored as | Default | Meaning | | ---- | -------------------------------------- | -------------------------- | ---------------------- | ---------------------------------------------------------------------------------------------------------- | -| `0` | `target_rate` | `uint32` milliseconds | `2400 ms` | Target slot/block interval; used for leader pacing, block production timing, and skip scheduling. | +| `0` | `target_rate` | `uint32` milliseconds | `2400 ms` | Target slot or block interval; used for leader pacing, block production timing, and skip scheduling. | | `1` | `first_block_timeout` | `uint32` milliseconds | `1000 ms` | Base timeout before skip voting starts for the first missing block in a leader window. | | `2` | `first_block_timeout_multiplier` | `float32` bits in `uint32` | `1.2` | Multiplier applied to `first_block_timeout` after a window that had skips. | | `3` | `first_block_timeout_cap` | `uint32` milliseconds | `100000 ms` | Cap for the adaptive `first_block_timeout` growth. | -| `4` | `candidate_resolve_timeout` | `uint32` milliseconds | `1000 ms` | Initial timeout for candidate / notarization resolution requests. | +| `4` | `candidate_resolve_timeout` | `uint32` milliseconds | `1000 ms` | Initial timeout for candidate or notarization resolution requests. | | `5` | `candidate_resolve_timeout_multiplier` | `float32` bits in `uint32` | `1.2` | Backoff multiplier for candidate resolution retries. | | `6` | `candidate_resolve_timeout_cap` | `uint32` milliseconds | `10000 ms` | Cap for candidate resolution timeout growth. | | `7` | `candidate_resolve_cooldown` | `uint32` milliseconds | `10 ms` | Cooldown between candidate resolution attempts. |