diff --git a/validator-engine/validator-engine.cpp b/validator-engine/validator-engine.cpp index 23bb8f77..16f71d5d 100644 --- a/validator-engine/validator-engine.cpp +++ b/validator-engine/validator-engine.cpp @@ -1324,6 +1324,9 @@ td::Status ValidatorEngine::load_global_config() { for (auto seq : unsafe_catchains_) { validator_options_.write().add_unsafe_resync_catchain(seq); } + for (auto rot : unsafe_catchain_rotations_) { + validator_options_.write().add_unsafe_catchain_rotate(rot.first, rot.second.first, rot.second.second); + } if (truncate_seqno_ > 0) { validator_options_.write().truncate_db(truncate_seqno_); } @@ -3364,6 +3367,18 @@ int main(int argc, char *argv[]) { acts.push_back([&x, seq]() { td::actor::send_closure(x, &ValidatorEngine::add_unsafe_catchain, seq); }); return td::Status::OK(); }); + p.add_checked_option( + 'F', "unsafe-catchain-rotate", "use forceful and DANGEROUS catchain rotation", [&](td::Slice params) { + auto pos1 = params.find(':'); + TRY_RESULT(b_seq, td::to_integer_safe(params.substr(0, pos1))); + params = params.substr(++pos1, params.size()); + auto pos2 = params.find(':'); + TRY_RESULT(cc_seq, td::to_integer_safe(params.substr(0, pos2))); + params = params.substr(++pos2, params.size()); + auto h = std::stoi(params.substr(0, params.size()).str()); + acts.push_back([&x, b_seq, cc_seq, h]() { td::actor::send_closure(x, &ValidatorEngine::add_unsafe_catchain_rotation, b_seq, cc_seq, h); }); + return td::Status::OK(); + }); td::uint32 threads = 7; p.add_checked_option( 't', "threads", PSTRING() << "number of threads (default=" << threads << ")", [&](td::Slice fname) { diff --git a/validator-engine/validator-engine.hpp b/validator-engine/validator-engine.hpp index e9634dd3..8ce56ab4 100644 --- a/validator-engine/validator-engine.hpp +++ b/validator-engine/validator-engine.hpp @@ -201,6 +201,7 @@ class ValidatorEngine : public td::actor::Actor { ton::BlockSeqno truncate_seqno_{0}; std::set unsafe_catchains_; + std::map> unsafe_catchain_rotations_; public: static constexpr td::uint8 max_cat() { @@ -210,6 +211,9 @@ class ValidatorEngine : public td::actor::Actor { void add_unsafe_catchain(ton::CatchainSeqno seq) { unsafe_catchains_.insert(seq); } + void add_unsafe_catchain_rotation(ton::BlockSeqno b_seqno, ton::CatchainSeqno cc_seqno, td::uint32 value) { + unsafe_catchain_rotations_.insert({b_seqno, {cc_seqno, value}}); + } void set_local_config(std::string str); void set_global_config(std::string str); void set_fift_dir(std::string str) {