diff --git a/tl/generate/scheme/ton_api.tl b/tl/generate/scheme/ton_api.tl index 3d14ac65..57ed9ddc 100644 --- a/tl/generate/scheme/ton_api.tl +++ b/tl/generate/scheme/ton_api.tl @@ -307,6 +307,8 @@ validatorSession.candidate src:int256 round:int root_hash:int256 data:bytes coll validatorSession.config catchain_idle_timeout:double catchain_max_deps:int round_candidates:int next_candidate_delay:double round_attempt_duration:int max_round_attempts:int max_block_size:int max_collated_data_size:int = validatorSession.Config; +validatorSession.configVersioned catchain_idle_timeout:double catchain_max_deps:int round_candidates:int next_candidate_delay:double round_attempt_duration:int + max_round_attempts:int max_block_size:int max_collated_data_size:int version:int = validatorSession.Config; validatorSession.configNew catchain_idle_timeout:double catchain_max_deps:int round_candidates:int next_candidate_delay:double round_attempt_duration:int max_round_attempts:int max_block_size:int max_collated_data_size:int new_catchain_ids:Bool = validatorSession.Config; diff --git a/tl/generate/scheme/ton_api.tlo b/tl/generate/scheme/ton_api.tlo index 65ec36c5..823219b5 100644 Binary files a/tl/generate/scheme/ton_api.tlo and b/tl/generate/scheme/ton_api.tlo differ diff --git a/validator-session/validator-session-types.h b/validator-session/validator-session-types.h index 6e58813b..812c20b8 100644 --- a/validator-session/validator-session-types.h +++ b/validator-session/validator-session-types.h @@ -53,6 +53,8 @@ struct ValidatorSessionOptions { bool new_catchain_ids = false; + td::uint32 proto_version = 0; + td::Bits256 get_hash() const; }; diff --git a/validator-session/validator-session.cpp b/validator-session/validator-session.cpp index e59b27b6..088d2957 100644 --- a/validator-session/validator-session.cpp +++ b/validator-session/validator-session.cpp @@ -881,19 +881,26 @@ td::actor::ActorOwn ValidatorSession::create( } td::Bits256 ValidatorSessionOptions::get_hash() const { - if (!new_catchain_ids) { - return create_hash_tl_object( - catchain_idle_timeout, catchain_max_deps, round_candidates, next_candidate_delay, round_attempt_duration, - max_round_attempts, max_block_size, max_collated_data_size); + if(!proto_version) { + if (!new_catchain_ids) { + return create_hash_tl_object( + catchain_idle_timeout, catchain_max_deps, round_candidates, next_candidate_delay, round_attempt_duration, + max_round_attempts, max_block_size, max_collated_data_size); + } else { + return create_hash_tl_object( + catchain_idle_timeout, catchain_max_deps, round_candidates, next_candidate_delay, round_attempt_duration, + max_round_attempts, max_block_size, max_collated_data_size, new_catchain_ids); + } } else { - return create_hash_tl_object( - catchain_idle_timeout, catchain_max_deps, round_candidates, next_candidate_delay, round_attempt_duration, - max_round_attempts, max_block_size, max_collated_data_size, new_catchain_ids); - } + return create_hash_tl_object( + catchain_idle_timeout, catchain_max_deps, round_candidates, next_candidate_delay, round_attempt_duration, + max_round_attempts, max_block_size, max_collated_data_size, proto_version); + } + } ValidatorSessionOptions::ValidatorSessionOptions(const ValidatorSessionConfig &conf) { - CHECK(!conf.proto_version); + proto_version = conf.proto_version; catchain_idle_timeout = conf.catchain_idle_timeout; catchain_max_deps = conf.catchain_max_deps; max_block_size = conf.max_block_size; diff --git a/validator/manager.cpp b/validator/manager.cpp index 2fcd182a..2c43a5dd 100644 --- a/validator/manager.cpp +++ b/validator/manager.cpp @@ -1692,6 +1692,12 @@ void ValidatorManagerImpl::update_shards() { auto exp_vec = last_masterchain_state_->get_shards(); auto config = last_masterchain_state_->get_consensus_config(); validatorsession::ValidatorSessionOptions opts{config}; + uint threshold = 9344000; + bool force_group_id_upgrade = last_masterchain_seqno_ == threshold; + auto legacy_opts_hash = opts.get_hash(); + if(last_masterchain_seqno_ >= threshold) { //TODO move to get_consensus_config() + opts.proto_version = 1; + } auto opts_hash = opts.get_hash(); std::map> new_shards; @@ -1766,6 +1772,45 @@ void ValidatorManagerImpl::update_shards() { BlockSeqno key_seqno = last_key_block_handle_->id().seqno(); + if (force_group_id_upgrade) { + for (auto &desc : new_shards) { + auto shard = desc.first; + auto prev = desc.second; + for (auto &p : prev) { + CHECK(p.is_valid()); + } + auto val_set = last_masterchain_state_->get_validator_set(shard); + auto validator_id = get_validator(shard, val_set); + + if (!validator_id.is_zero()) { + auto legacy_val_group_id = get_validator_set_id(shard, val_set, legacy_opts_hash, key_seqno, opts); + auto val_group_id = get_validator_set_id(shard, val_set, opts_hash, key_seqno, opts); + + + auto it = validator_groups_.find(legacy_val_group_id); + if (it != validator_groups_.end()) { + new_validator_groups_.emplace(val_group_id, std::move(it->second)); + } else { + auto it2 = next_validator_groups_.find(legacy_val_group_id); + if (it2 != next_validator_groups_.end()) { + if (!it2->second.empty()) { + td::actor::send_closure(it2->second, &ValidatorGroup::start, prev, last_masterchain_block_id_, + last_masterchain_state_->get_unix_time()); + } + new_validator_groups_.emplace(val_group_id, std::move(it2->second)); + } else { + auto G = create_validator_group(val_group_id, shard, val_set, opts, started_); + if (!G.empty()) { + td::actor::send_closure(G, &ValidatorGroup::start, prev, last_masterchain_block_id_, + last_masterchain_state_->get_unix_time()); + } + new_validator_groups_.emplace(val_group_id, std::move(G)); + } + } + } + } + } + if (allow_validate_) { for (auto &desc : new_shards) { auto shard = desc.first;