diff --git a/core/application/chain_spec.hpp b/core/application/chain_spec.hpp index 05781c5762..ff801359b3 100644 --- a/core/application/chain_spec.hpp +++ b/core/application/chain_spec.hpp @@ -74,6 +74,26 @@ namespace kagome::application { */ virtual const ChildrenDefaultRawData &getGenesisChildrenDefaultSection() const = 0; + + bool idStartsWith(std::string_view prefix) const { + return id().rfind(prefix, 0) == 0; + } + + bool isKusama() const { + return idStartsWith("kusama") || idStartsWith("ksm"); + } + + bool isRococo() const { + return idStartsWith("rococo") || idStartsWith("rco"); + } + + bool isWococo() const { + return idStartsWith("wococo") || idStartsWith("wco"); + } + + bool isVersi() const { + return idStartsWith("versi") || idStartsWith("vrs"); + } }; } // namespace kagome::application diff --git a/core/consensus/babe/impl/babe_impl.cpp b/core/consensus/babe/impl/babe_impl.cpp index 81bdd842d7..862cad5ba6 100644 --- a/core/consensus/babe/impl/babe_impl.cpp +++ b/core/consensus/babe/impl/babe_impl.cpp @@ -306,7 +306,8 @@ namespace kagome::consensus::babe { if (current_state_ == Babe::State::HEADERS_LOADING) { current_state_ = Babe::State::HEADERS_LOADED; startStateSyncing(peer_id); - } else if (current_state_ == Babe::State::CATCHING_UP) { + } else if (current_state_ == Babe::State::CATCHING_UP + or current_state_ == Babe::State::WAIT_REMOTE_STATUS) { onSynchronized(); } return; diff --git a/core/consensus/grandpa/impl/grandpa_impl.cpp b/core/consensus/grandpa/impl/grandpa_impl.cpp index f3f8e249db..e8f9521ea9 100644 --- a/core/consensus/grandpa/impl/grandpa_impl.cpp +++ b/core/consensus/grandpa/impl/grandpa_impl.cpp @@ -23,19 +23,31 @@ namespace kagome::consensus::grandpa { using authority::IsBlockFinalized; + namespace { + Clock::Duration getGossipDuration(const application::ChainSpec &chain) { + // https://github.com/paritytech/polkadot/pull/5448 + auto slow = chain.isVersi() || chain.isWococo() || chain.isRococo() + || chain.isKusama(); + return std::chrono::duration_cast( + std::chrono::milliseconds{slow ? 2000 : 1000}); + } + } // namespace + GrandpaImpl::GrandpaImpl( std::shared_ptr app_state_manager, std::shared_ptr environment, std::shared_ptr crypto_provider, std::shared_ptr grandpa_api, const std::shared_ptr &keypair, + const application::ChainSpec &chain_spec, std::shared_ptr clock, std::shared_ptr scheduler, std::shared_ptr authority_manager, std::shared_ptr synchronizer, std::shared_ptr peer_manager, std::shared_ptr block_tree) - : environment_{std::move(environment)}, + : round_time_factor_{getGossipDuration(chain_spec)}, + environment_{std::move(environment)}, crypto_provider_{std::move(crypto_provider)}, grandpa_api_{std::move(grandpa_api)}, keypair_{keypair}, diff --git a/core/consensus/grandpa/impl/grandpa_impl.hpp b/core/consensus/grandpa/impl/grandpa_impl.hpp index d3923fdbc3..c0b40887ef 100644 --- a/core/consensus/grandpa/impl/grandpa_impl.hpp +++ b/core/consensus/grandpa/impl/grandpa_impl.hpp @@ -12,6 +12,7 @@ #include #include "application/app_state_manager.hpp" +#include "application/chain_spec.hpp" #include "blockchain/block_tree.hpp" #include "consensus/authority/authority_manager.hpp" #include "consensus/grandpa/environment.hpp" @@ -70,6 +71,7 @@ namespace kagome::consensus::grandpa { std::shared_ptr crypto_provider, std::shared_ptr grandpa_api, const std::shared_ptr &keypair, + const application::ChainSpec &chain_spec, std::shared_ptr clock, std::shared_ptr scheduler, std::shared_ptr authority_manager, @@ -251,10 +253,7 @@ namespace kagome::consensus::grandpa { */ void loadMissingBlocks(); - // Note: Duration value was gotten from substrate - // https://github.com/paritytech/substrate/blob/efbac7be80c6e8988a25339061078d3e300f132d/bin/node-template/node/src/service.rs#L166 - // Perhaps, 333ms is not enough for normal communication during the round - const Clock::Duration round_time_factor_ = std::chrono::milliseconds(333); + const Clock::Duration round_time_factor_; std::shared_ptr current_round_; diff --git a/core/consensus/grandpa/impl/voting_round_impl.cpp b/core/consensus/grandpa/impl/voting_round_impl.cpp index bc9ca498b4..65fa05d22b 100644 --- a/core/consensus/grandpa/impl/voting_round_impl.cpp +++ b/core/consensus/grandpa/impl/voting_round_impl.cpp @@ -280,7 +280,7 @@ namespace kagome::consensus::grandpa { endPrevoteStage(); } }, - toMilliseconds(duration_ * 2 - (start_time_ - scheduler_->now()))); + toMilliseconds(duration_ * 2 - (scheduler_->now() - start_time_))); on_complete_handler_ = [this] { if (stage_ == Stage::PREVOTE_RUNS) { @@ -345,7 +345,7 @@ namespace kagome::consensus::grandpa { endPrecommitStage(); } }, - toMilliseconds(duration_ * 4 - (start_time_ - scheduler_->now()))); + toMilliseconds(duration_ * 4 - (scheduler_->now() - start_time_))); on_complete_handler_ = [this] { if (stage_ == Stage::PRECOMMIT_RUNS) { diff --git a/core/injector/application_injector.cpp b/core/injector/application_injector.cpp index 30c7e90bcc..2c54c57d38 100644 --- a/core/injector/application_injector.cpp +++ b/core/injector/application_injector.cpp @@ -1446,6 +1446,7 @@ namespace { injector.template create>(), injector.template create>(), session_keys->getGranKeyPair(), + injector.template create(), injector.template create>(), injector.template create>(), injector.template create>(),