Skip to content
Draft
Changes from 4 commits
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
118 changes: 118 additions & 0 deletions foundations/config.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -462,6 +462,124 @@ 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

<Aside type="note">
Introduced with [TON v2026.04](https://github.com/ton-blockchain/ton/releases/tag/v2026.04) update.
</Aside>

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` — 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`) |
| `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.
Expand Down
Loading