-
Notifications
You must be signed in to change notification settings - Fork 64
feat(foundations): update config for [04.2026] release #2083
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 1 commit
88e9d67
4b1d3f4
58cf126
cda2bd9
22c529f
694a47c
88efab9
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -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> | ||
|
|
||
| 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`. | ||
|
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 | | ||
|
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. | ||
| - 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` | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. According to the |
||
| - `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. | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.