Skip to content
Draft
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
124 changes: 124 additions & 0 deletions foundations/config.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -462,6 +462,130 @@

[Parameter #29 on mainnet](https://tonviewer.com/config#29)

## Param 30: consensus extension

<Aside>
Introduced with [TON v2026.04](https://github.com/ton-blockchain/ton/releases/tag/v2026.04) update.
</Aside>
Comment thread
novusnota marked this conversation as resolved.
Outdated

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`.
Comment thread
novusnota marked this conversation as resolved.
Outdated

#### 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`
<Aside caution>
`simplex_config#21` unused, scheduled for removal
</Aside>
- `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 |

Check warning on line 529 in foundations/config.mdx

View workflow job for this annotation

GitHub Actions / Spelling

Forbidden word (id) Suggestions: (ID*)
Comment thread
novusnota marked this conversation as resolved.
Outdated

`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.

Check warning on line 533 in foundations/config.mdx

View workflow job for this annotation

GitHub Actions / Spelling

Forbidden word (id) Suggestions: (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 |

Check warning on line 551 in foundations/config.mdx

View workflow job for this annotation

GitHub Actions / Spelling

Forbidden word (Id) Suggestions: (ID*)
| --- | --- | --- | --- | --- |
| `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`
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

According to the simplex_config_v2#22 TL-B above, the constructor only has flags, use_quic, slots_per_leader_window, and noncritical_paramsmax_block_size and max_collated_data_size are not fields of this structure. The opening paragraph already says the node keeps reading those two from ConfigParam 29, so listing them under ### Configuration parameters of simplex_config_v2 reads as if they were part of the v2 constructor. Could we move these two bullets out of this list (or put them under a separate Inherited from Param 29 sub-bullet) so the list matches the TL-B?

- `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.

Check warning on line 586 in foundations/config.mdx

View workflow job for this annotation

GitHub Actions / Spelling

Forbidden word (id) Suggestions: (ID*)


## 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.
Expand Down
Loading