Сравнение

Сравнение TL-B-схем в TON и Tycho

Tycho сохраняет совместимость с экосистемой TON на уровне ячеек и TVM, но вносит небольшие изменения в формат блока и в параметры конфигурации сети. Эти изменения нужны, чтобы консенсус и коллатор могли работать эффективнее, в том числе за счёт более точных временных меток и дополнительных данных о прогрессе обработки очередей сообщений.

Практическое следствие такое: парсер, который ожидает ровно схемы TON из block.tlb, не сможет корректно разобрать блок Tycho, потому что в Tycho меняются конструкторы и появляются новые поля. Для Tycho нужно использовать TL-B-схемы Tycho и код, который умеет их парсить.

Отличия TL-B-схем

Отличия в BlockInfo

В BlockInfo добавляется gen_utime_ms:uint16:

-block_info#9bc7a987 ... shard:ShardIdent gen_utime:uint32 start_lt:uint64 end_lt:uint64 ... = BlockInfo;
+block_info_tycho#9bc7a988 ... shard:ShardIdent gen_utime:uint32 gen_utime_ms:uint16 start_lt:uint64 end_lt:uint64 ... = BlockInfo;

Отличия в Block

В Tycho меняется конструктор Block и добавляется отдельная структура OutMsgQueueUpdates, которая лежит рядом с state_update:

-block#11ef55aa global_id:int32
+block_tycho#11ef55bb global_id:int32
   info:^BlockInfo value_flow:^ValueFlow
+  ^[
   state_update:^(MERKLE_UPDATE ShardState)
+  out_msg_queue_updates:OutMsgQueueUpdates
+  ]
   extra:^BlockExtra = Block;

+out_msg_queue_updates#1 diff_hash:bits256 tail_len:uint32 = OutMsgQueueUpdates;

Отличия в ShardDescr

В Tycho меняется конструктор ShardDescr и набор полей, связанных с прогрессом обработки.

-shard_descr#b seq_no:uint32 reg_mc_seqno:uint32
+shard_descr_tycho#a seq_no:uint32 reg_mc_seqno:uint32
   start_lt:uint64 end_lt:uint64
   root_hash:bits256 file_hash:bits256
   before_split:Bool before_merge:Bool
   want_split:Bool want_merge:Bool
-  nx_cc_updated:Bool flags:(## 3) { flags = 0 }
-  next_catchain_seqno:uint32 next_validator_shard:uint64
+  nx_cc_updated:Bool top_sc_block_updated:Bool flags:(## 2) { flags = 0 }
+  next_catchain_seqno:uint32 ext_processed_to_anchor_id:uint32
   min_ref_mc_seqno:uint32 gen_utime:uint32
   ...
   = ShardDescr;

Отличия в ShardState

В Tycho меняется конструктор ShardStateUnsplit и добавляется миллисекундная часть времени генерации: Вместо OutMsgQueueInfo появляется ProcessedUptoInfo с раздельными данными для внешних и внутренних сообщений.

-shard_state#9023afe2 global_id:int32
+shard_state_tycho#9023aeee global_id:int32
   shard_id:ShardIdent
   seq_no:uint32 vert_seq_no:#
-  gen_utime:uint32 gen_lt:uint64
+  gen_utime:uint32 gen_utime_ms:uint16 gen_lt:uint64
   min_ref_mc_seqno:uint32
-  out_msg_queue_info:^OutMsgQueueInfo
+  processed_upto:^ProcessedUptoInfo
   ...
   = ShardStateUnsplit;

+processed_upto_info#00
+  partitions:(HashmapE 16 ProcessedUptoPartition)
+  msgs_exec_params:(Maybe ^MsgsExecutionParams)
+  = ProcessedUptoInfo;
+
+processedUptoPartition#00
+  externals:ExternalsProcessedUpto
+  internals:InternalsProcessedUpto
+  = ProcessedUptoPartition;
+
+externalsProcessedUpto#00
+  processed_to_anchor_id:uint32
+  processed_to_msgs_offset:uint64
+  ranges:(HashmapE 32 ExternalsRange)
+  = ExternalsProcessedUpto;
+
+externalsRange#00
+  from_anchor_id:uint32
+  from_msgs_offset:uint64
+  to_anchor_id:uint32
+  to_msgs_offset:uint64
+  chain_time:uint64
+  skip_offset:uint32
+  processed_offset:uint32
+  = ExternalsRange;
+
+internalsProcessedUpto#00
+  processed_to:(HashmapE 96 ProcessedUpto)
+  ranges:(HashmapE 32 InternalsRange)
+  = InternalsProcessedUpto;
+
+internalsRange#00
+  skip_offset:uint32
+  processed_offset:uint32
+  shards:(HashmapE 96 ShardRange)
+  = InternalsRange;
+
+shardRange#00 from:uint64 to:uint64 = ShardRange;

Отличия в McStateExtra и данных консенсуса

В masterchain_state_extra расширяется диапазон flags и появляется опциональное поле consensus_info:

 masterchain_state_extra#cc26
   shard_hashes:ShardHashes
   config:ConfigParams
-  ^[ flags:(## 16) { flags <= 1 }
+  ^[ flags:(## 16) { flags <= 4 }
      validator_info:ValidatorInfo
      prev_blocks:OldMcBlocksInfo
      after_key_block:Bool
      last_key_block:(Maybe ExtBlkRef)
-     block_create_stats:(flags . 0)?BlockCreateStats ]
+     block_create_stats:(flags . 0)?BlockCreateStats
+     consensus_info:(flags . 2)?ConsensusInfo ]
   global_balance:CurrencyCollection
 = McStateExtra;

+consensus_info#_
+  vset_switch_round:uint32
+  prev_vset_switch_round:uint32
+  genesis_info:GenesisInfo
+  prev_shuffle_mc_validators:Bool
+  = ConsensusInfo;
+
+genesis_info#_
+  start_round:uint32
+  genesis_millis:uint64
+  = GenesisInfo;

Отличия в CatchainConfig

В Tycho меняется содержимое ConfigParam 28. Вместо CatchainConfig вводится CollationConfig со схемами collation_config_tycho и collation_config_tycho_v2.

-_ CatchainConfig = ConfigParam 28;
+_ CollationConfig = ConfigParam 28;

+collation_config_tycho#a6
+  shuffle_mc_validators:Bool
+  mc_block_min_interval_ms:uint32
+  empty_sc_block_interval_ms:uint32
+  max_uncommitted_chain_length:uint8
+  wu_used_to_import_next_anchor:uint64
+  msgs_exec_params:MsgsExecutionParams
+  work_units_params:WorkUnitsParams
+  = CollationConfig;
+
+collation_config_tycho_v2#a7
+  shuffle_mc_validators:Bool
+  mc_block_min_interval_ms:uint32
+  mc_block_max_interval_ms:uint32
+  empty_sc_block_interval_ms:uint32
+  max_uncommitted_chain_length:uint8
+  wu_used_to_import_next_anchor:uint64
+  msgs_exec_params:MsgsExecutionParams
+  work_units_params:WorkUnitsParams
+  = CollationConfig;
+
+msgs_execution_params_tycho#00
+  buffer_limit:uint32
+  group_limit:uint16
+  group_vert_size:uint16
+  externals_expire_timeout:uint16
+  open_ranges_limit:uint16
+  par_0_int_msgs_count_limit:uint32
+  par_0_ext_msgs_count_limit:uint32
+  group_slots_fractions:(HashmapE 16 uint8)
+  = MsgsExecutionParams;
+
+msgs_execution_params_tycho_v2#01
+  buffer_limit:uint32
+  group_limit:uint16
+  group_vert_size:uint16
+  externals_expire_timeout:uint16
+  open_ranges_limit:uint16
+  par_0_int_msgs_count_limit:uint32
+  par_0_ext_msgs_count_limit:uint32
+  group_slots_fractions:(HashmapE 16 uint8)
+  range_messages_limit:uint32
+  = MsgsExecutionParams;
+
+work_units_params_tycho#00
+  prepare:WorkUnitParamsPrepare
+  execute:WorkUnitParamsExecute
+  finalize:WorkUnitParamsFinalize
+  = WorkUnitsParams;
+
+work_units_params_prepare_tycho#00
+  fixed:uint32
+  msgs_stats:uint16
+  remaning_msgs_stats:uint16
+  read_ext_msgs:uint16
+  read_int_msgs:uint16
+  read_new_msgs:uint16
+  add_to_msg_groups:uint16
+  = WorkUnitsParamsPrepare;
+
+work_units_params_execute_tycho#00
+  prepare:uint32
+  execute:uint16
+  execute_err:uint16
+  execute_delimiter:uint32
+  serialize_enqueue:uint16
+  serialize_dequeue:uint16
+  insert_new_msgs:uint16
+  subgroup_size:uint16
+  = WorkUnitsParamsExecute;
+
+work_units_params_finalize_tycho#00
+  build_transactions:uint16
+  build_accounts:uint16
+  build_in_msg:uint16
+  build_out_msg:uint16
+  serialize_min:uint32
+  serialize_accounts:uint16
+  serialize_msg:uint16
+  state_update_min:uint32
+  state_update_accounts:uint16
+  state_update_msg:uint16
+  create_diff:uint16
+  serialize_diff:uint16
+  apply_diff:uint16
+  diff_tail_len:uint16
+  = WorkUnitsParamsFinalize;

Отличия в ConsensusConfig

В Tycho меняется содержимое ConfigParam 29. Для ConsensusConfig используется схема consensus_config_tycho.

+consensus_config_tycho#d8
+  clock_skew_millis:uint16 { clock_skew_millis != 0 }
+  payload_batch_bytes:uint32 { payload_batch_bytes != 0 }
+  commit_history_rounds:uint8 { commit_history_rounds != 0 }
+  deduplicate_rounds:uint16
+  max_consensus_lag_rounds:uint16 { max_consensus_lag_rounds != 0 }
+  payload_buffer_bytes:uint32 { payload_buffer_bytes != 0 }
+  broadcast_retry_millis:uint8 { broadcast_retry_millis != 0 }
+  download_retry_millis:uint8 { download_retry_millis != 0 }
+  download_peers:uint8 { download_peers != 0 }
+  min_sign_attempts:uint8 { min_sign_attempts != 0 }
+  download_peer_queries:uint8 { download_peer_queries != 0 }
+  sync_support_rounds:uint16 { sync_support_rounds != 0 }
+  = ConsensusConfig;

 _ ConsensusConfig = ConfigParam 29;

-consensus_config#d6 round_candidates:# { round_candidates >= 1 }
-  next_candidate_delay_ms:uint32 consensus_timeout_ms:uint32
-  fast_attempts:uint32 attempt_duration:uint32 catchain_max_deps:uint32
-  max_block_bytes:uint32 max_collated_bytes:uint32 = ConsensusConfig;
-
-consensus_config_new#d7 flags:(## 7) { flags = 0 } new_catchain_ids:Bool
-  round_candidates:(## 8) { round_candidates >= 1 }
-  next_candidate_delay_ms:uint32 consensus_timeout_ms:uint32
-  fast_attempts:uint32 attempt_duration:uint32 catchain_max_deps:uint32
-  max_block_bytes:uint32 max_collated_bytes:uint32 = ConsensusConfig;
-
-consensus_config_v3#d8 flags:(## 7) { flags = 0 } new_catchain_ids:Bool
-  round_candidates:(## 8) { round_candidates >= 1 }
-  next_candidate_delay_ms:uint32 consensus_timeout_ms:uint32
-  fast_attempts:uint32 attempt_duration:uint32 catchain_max_deps:uint32
-  max_block_bytes:uint32 max_collated_bytes:uint32
-  proto_version:uint16 = ConsensusConfig;
-
-consensus_config_v4#d9 flags:(## 7) { flags = 0 } new_catchain_ids:Bool
-  round_candidates:(## 8) { round_candidates >= 1 }
-  next_candidate_delay_ms:uint32 consensus_timeout_ms:uint32
-  fast_attempts:uint32 attempt_duration:uint32 catchain_max_deps:uint32
-  max_block_bytes:uint32 max_collated_bytes:uint32
-  proto_version:uint16 catchain_max_blocks_coeff:uint32 = ConsensusConfig;

Full diff block.tlb

diff block.tlb (TON - Tycho)
 master_info$_ master:ExtBlkRef = BlkMasterInfo;

-shard_state#9023afe2 global_id:int32
+shard_state_tycho#9023aeee global_id:int32
   shard_id:ShardIdent
   seq_no:uint32 vert_seq_no:#
-  gen_utime:uint32 gen_lt:uint64
+  gen_utime:uint32 gen_utime_ms:uint16 gen_lt:uint64
   min_ref_mc_seqno:uint32
-  out_msg_queue_info:^OutMsgQueueInfo
+  processed_upto:^ProcessedUptoInfo
   before_split:(## 1)
   accounts:^ShardAccounts
   ^[ overload_history:uint64 underload_history:uint64
@@ -442,10 +442,49 @@ shard_state#9023afe2 global_id:int32
 _ ShardStateUnsplit = ShardState;
 split_state#5f327da5 left:^ShardStateUnsplit right:^ShardStateUnsplit = ShardState;

+processed_upto_info#00
+  partitions:(HashmapE 16 ProcessedUptoPartition)
+  msgs_exec_params:(Maybe ^MsgsExecutionParams)
+  = ProcessedUptoInfo;
+
+processedUptoPartition#00
+  externals:ExternalsProcessedUpto
+  internals:InternalsProcessedUpto
+  = ProcessedUptoPartition;
+
+externalsProcessedUpto#00
+  processed_to_anchor_id:uint32
+  processed_to_msgs_offset:uint64
+  ranges:(HashmapE 32 ExternalsRange)
+  = ExternalsProcessedUpto;
+
+externalsRange#00
+  from_anchor_id:uint32
+  from_msgs_offset:uint64
+  to_anchor_id:uint32
+  to_msgs_offset:uint64
+  chain_time:uint64
+  skip_offset:uint32
+  processed_offset:uint32
+  = ExternalsRange;
+
+internalsProcessedUpto#00
+  processed_to:(HashmapE 96 ProcessedUpto)
+  ranges:(HashmapE 32 InternalsRange)
+  = InternalsProcessedUpto;
+
+internalsRange#00
+  skip_offset:uint32
+  processed_offset:uint32
+  shards:(HashmapE 96 ShardRange)
+  = InternalsRange;
+
+shardRange#00 from:uint64 to:uint64 = ShardRange;
+
 shared_lib_descr$00 lib:^Cell publishers:(Hashmap 256 True)
   = LibDescr;

-block_info#9bc7a987 version:uint32
+block_info_tycho#9bc7a988 version:uint32
   not_master:(## 1)
   after_merge:(## 1) before_split:(## 1)
   after_split:(## 1)
@@ -455,6 +494,7 @@ block_info#9bc7a987 version:uint32
   seq_no:# vert_seq_no:# { vert_seq_no >= vert_seqno_incr }
   { prev_seq_no:# } { ~prev_seq_no + 1 = seq_no }
   shard:ShardIdent gen_utime:uint32
+  gen_utime_ms:uint16
   start_lt:uint64 end_lt:uint64
   gen_validator_list_hash_short:uint32
   gen_catchain_seqno:uint32
@@ -469,12 +509,17 @@ block_info#9bc7a987 version:uint32
 prev_blk_info$_ prev:ExtBlkRef = BlkPrevInfo 0;
 prev_blks_info$_ prev1:^ExtBlkRef prev2:^ExtBlkRef = BlkPrevInfo 1;

-block#11ef55aa global_id:int32
+block_tycho#11ef55bb global_id:int32
   info:^BlockInfo value_flow:^ValueFlow
+  ^[
   state_update:^(MERKLE_UPDATE ShardState)
+  out_msg_queue_updates:OutMsgQueueUpdates
+  ]
   extra:^BlockExtra = Block;

-block_extra in_msg_descr:^InMsgDescr
+out_msg_queue_updates#1 diff_hash:bits256 tail_len:uint32 = OutMsgQueueUpdates;
+
+block_extra_tycho#4a33f6fc in_msg_descr:^InMsgDescr
   out_msg_descr:^OutMsgDescr
   account_blocks:^ShardAccountBlocks
   rand_seed:bits256
@@ -516,25 +561,13 @@ fsm_none$0 = FutureSplitMerge;
 fsm_split$10 split_utime:uint32 interval:uint32 = FutureSplitMerge;
 fsm_merge$11 merge_utime:uint32 interval:uint32 = FutureSplitMerge;

-shard_descr#b seq_no:uint32 reg_mc_seqno:uint32
+shard_descr_tycho#a seq_no:uint32 reg_mc_seqno:uint32
   start_lt:uint64 end_lt:uint64
   root_hash:bits256 file_hash:bits256
   before_split:Bool before_merge:Bool
   want_split:Bool want_merge:Bool
-  nx_cc_updated:Bool flags:(## 3) { flags = 0 }
-  next_catchain_seqno:uint32 next_validator_shard:uint64
-  min_ref_mc_seqno:uint32 gen_utime:uint32
-  split_merge_at:FutureSplitMerge
-  fees_collected:CurrencyCollection
-  funds_created:CurrencyCollection = ShardDescr;
-
-shard_descr_new#a seq_no:uint32 reg_mc_seqno:uint32
-  start_lt:uint64 end_lt:uint64
-  root_hash:bits256 file_hash:bits256
-  before_split:Bool before_merge:Bool
-  want_split:Bool want_merge:Bool
-  nx_cc_updated:Bool flags:(## 3) { flags = 0 }
-  next_catchain_seqno:uint32 next_validator_shard:uint64
+  nx_cc_updated:Bool top_sc_block_updated:Bool flags:(## 2) { flags = 0 }
+  next_catchain_seqno:uint32 ext_processed_to_anchor_id:uint32
   min_ref_mc_seqno:uint32 gen_utime:uint32
   split_merge_at:FutureSplitMerge
   ^[ fees_collected:CurrencyCollection
@@ -577,15 +610,28 @@ block_create_stats_ext#34 counters:(HashmapAugE 256 CreatorStats uint32) = Block
 masterchain_state_extra#cc26
   shard_hashes:ShardHashes
   config:ConfigParams
-  ^[ flags:(## 16) { flags <= 1 }
+  ^[ flags:(## 16) { flags <= 4 }
      validator_info:ValidatorInfo
      prev_blocks:OldMcBlocksInfo
      after_key_block:Bool
      last_key_block:(Maybe ExtBlkRef)
-     block_create_stats:(flags . 0)?BlockCreateStats ]
+     block_create_stats:(flags . 0)?BlockCreateStats
+     consensus_info:(flags . 2)?ConsensusInfo ]
   global_balance:CurrencyCollection
 = McStateExtra;

+consensus_info#_
+  vset_switch_round:uint32
+  prev_vset_switch_round:uint32
+  genesis_info:GenesisInfo
+  prev_shuffle_mc_validators:Bool
+  = ConsensusInfo;
+
+genesis_info#_
+  start_round:uint32
+  genesis_millis:uint64
+  = GenesisInfo;
+
 ed25519_pubkey#8e81278a pubkey:bits256 = SigPubKey;  // 288 bits
 ed25519_signature#5 R:bits256 s:bits256 = CryptoSignatureSimple;  // 516 bits
 _ CryptoSignatureSimple = CryptoSignature;
@@ -747,39 +793,110 @@ config_mc_fwd_prices#_ MsgForwardPrices = ConfigParam 24;
 // used for all other messages
 config_fwd_prices#_ MsgForwardPrices = ConfigParam 25;

-consensus_config#d6 round_candidates:# { round_candidates >= 1 }
-  next_candidate_delay_ms:uint32 consensus_timeout_ms:uint32
-  fast_attempts:uint32 attempt_duration:uint32 catchain_max_deps:uint32
-  max_block_bytes:uint32 max_collated_bytes:uint32 = ConsensusConfig;
-
-consensus_config_new#d7 flags:(## 7) { flags = 0 } new_catchain_ids:Bool
-  round_candidates:(## 8) { round_candidates >= 1 }
-  next_candidate_delay_ms:uint32 consensus_timeout_ms:uint32
-  fast_attempts:uint32 attempt_duration:uint32 catchain_max_deps:uint32
-  max_block_bytes:uint32 max_collated_bytes:uint32 = ConsensusConfig;
-
-consensus_config_v3#d8 flags:(## 7) { flags = 0 } new_catchain_ids:Bool
-  round_candidates:(## 8) { round_candidates >= 1 }
-  next_candidate_delay_ms:uint32 consensus_timeout_ms:uint32
-  fast_attempts:uint32 attempt_duration:uint32 catchain_max_deps:uint32
-  max_block_bytes:uint32 max_collated_bytes:uint32
-  proto_version:uint16 = ConsensusConfig;
-
-consensus_config_v4#d9 flags:(## 7) { flags = 0 } new_catchain_ids:Bool
-  round_candidates:(## 8) { round_candidates >= 1 }
-  next_candidate_delay_ms:uint32 consensus_timeout_ms:uint32
-  fast_attempts:uint32 attempt_duration:uint32 catchain_max_deps:uint32
-  max_block_bytes:uint32 max_collated_bytes:uint32
-  proto_version:uint16 catchain_max_blocks_coeff:uint32 = ConsensusConfig;
-
-_ CatchainConfig = ConfigParam 28;
+collation_config_tycho#a6
+  shuffle_mc_validators:Bool
+  mc_block_min_interval_ms:uint32
+  empty_sc_block_interval_ms:uint32
+  max_uncommitted_chain_length:uint8
+  wu_used_to_import_next_anchor:uint64
+  msgs_exec_params:MsgsExecutionParams
+  work_units_params:WorkUnitsParams
+  = CollationConfig;
+
+collation_config_tycho_v2#a7
+  shuffle_mc_validators:Bool
+  mc_block_min_interval_ms:uint32
+  mc_block_max_interval_ms:uint32
+  empty_sc_block_interval_ms:uint32
+  max_uncommitted_chain_length:uint8
+  wu_used_to_import_next_anchor:uint64
+  msgs_exec_params:MsgsExecutionParams
+  work_units_params:WorkUnitsParams
+  = CollationConfig;
+
+msgs_execution_params_tycho#00
+  buffer_limit:uint32
+  group_limit:uint16
+  group_vert_size:uint16
+  externals_expire_timeout:uint16
+  open_ranges_limit:uint16
+  par_0_int_msgs_count_limit:uint32
+  par_0_ext_msgs_count_limit:uint32
+  group_slots_fractions:(HashmapE 16 uint8)
+  = MsgsExecutionParams;
+
+msgs_execution_params_tycho_v2#01
+  buffer_limit:uint32
+  group_limit:uint16
+  group_vert_size:uint16
+  externals_expire_timeout:uint16
+  open_ranges_limit:uint16
+  par_0_int_msgs_count_limit:uint32
+  par_0_ext_msgs_count_limit:uint32
+  group_slots_fractions:(HashmapE 16 uint8)
+  range_messages_limit:uint32
+  = MsgsExecutionParams;
+
+work_units_params_tycho#00
+  prepare:WorkUnitParamsPrepare
+  execute:WorkUnitParamsExecute
+  finalize:WorkUnitParamsFinalize
+  = WorkUnitsParams;
+
+work_units_params_prepare_tycho#00
+  fixed:uint32
+  msgs_stats:uint16
+  remaning_msgs_stats:uint16
+  read_ext_msgs:uint16
+  read_int_msgs:uint16
+  read_new_msgs:uint16
+  add_to_msg_groups:uint16
+  = WorkUnitsParamsPrepare;
+
+work_units_params_execute_tycho#00
+  prepare:uint32
+  execute:uint16
+  execute_err:uint16
+  execute_delimiter:uint32
+  serialize_enqueue:uint16
+  serialize_dequeue:uint16
+  insert_new_msgs:uint16
+  subgroup_size:uint16
+  = WorkUnitsParamsExecute;
+
+work_units_params_finalize_tycho#00
+  build_transactions:uint16
+  build_accounts:uint16
+  build_in_msg:uint16
+  build_out_msg:uint16
+  serialize_min:uint32
+  serialize_accounts:uint16
+  serialize_msg:uint16
+  state_update_min:uint32
+  state_update_accounts:uint16
+  state_update_msg:uint16
+  create_diff:uint16
+  serialize_diff:uint16
+  apply_diff:uint16
+  diff_tail_len:uint16
+  = WorkUnitsParamsFinalize;
+
+consensus_config_tycho#d8
+  clock_skew_millis:uint16 { clock_skew_millis != 0 }
+  payload_batch_bytes:uint32 { payload_batch_bytes != 0 }
+  commit_history_rounds:uint8 { commit_history_rounds != 0 }
+  deduplicate_rounds:uint16
+  max_consensus_lag_rounds:uint16 { max_consensus_lag_rounds != 0 }
+  payload_buffer_bytes:uint32 { payload_buffer_bytes != 0 }
+  broadcast_retry_millis:uint8 { broadcast_retry_millis != 0 }
+  download_retry_millis:uint8 { download_retry_millis != 0 }
+  download_peers:uint8 { download_peers != 0 }
+  min_sign_attempts:uint8 { min_sign_attempts != 0 }
+  download_peer_queries:uint8 { download_peer_queries != 0 }
+  sync_support_rounds:uint16 { sync_support_rounds != 0 }
+  = ConsensusConfig;
+
+_ CollationConfig = ConfigParam 28;
 _ ConsensusConfig = ConfigParam 29;

 _ fundamental_smc_addr:(HashmapE 256 True) = ConfigParam 31;