From cb8836fe64be20168cb1bbdbb6f2c1a2639fc6ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Wo=CC=81jcik?= <3044353+fikumikudev@users.noreply.github.com> Date: Thu, 21 Jul 2022 16:23:20 +0200 Subject: [PATCH 1/3] Make header a bit more readable --- nano/node/election.hpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/nano/node/election.hpp b/nano/node/election.hpp index 47d63681f..fbd1fc71a 100644 --- a/nano/node/election.hpp +++ b/nano/node/election.hpp @@ -101,9 +101,14 @@ public: // Status nano::election_status status; public: // Interface - election (nano::node &, std::shared_ptr const &, std::function const &)> const &, std::function const &, nano::election_behavior); + election (nano::node &, std::shared_ptr const & block, std::function const &)> const & confirmation_action, std::function const & vote_action, nano::election_behavior behavior); + std::shared_ptr find (nano::block_hash const &) const; - nano::election_vote_result vote (nano::account const &, uint64_t, nano::block_hash const &); + /* + * Process vote. Internally uses cooldown to throttle non-final votes + * If the election reaches consensus, it will be confirmed + */ + nano::election_vote_result vote (nano::account const & representative, uint64_t timestamp, nano::block_hash const & block_hash); bool publish (std::shared_ptr const & block_a); std::size_t insert_inactive_votes_cache (nano::inactive_cache_information const &); // Confirm this block if quorum is met From eae7b35e1bed35471e98fdaed407d1f1f44ff133 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Wo=CC=81jcik?= <3044353+fikumikudev@users.noreply.github.com> Date: Thu, 21 Jul 2022 16:24:05 +0200 Subject: [PATCH 2/3] Remove not needed `node::minimum_principal_weight` override --- nano/node/node.cpp | 7 +------ nano/node/node.hpp | 1 - 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/nano/node/node.cpp b/nano/node/node.cpp index 8df5e833a..96d898460 100644 --- a/nano/node/node.cpp +++ b/nano/node/node.cpp @@ -809,12 +809,7 @@ nano::block_hash nano::node::rep_block (nano::account const & account_a) nano::uint128_t nano::node::minimum_principal_weight () { - return minimum_principal_weight (online_reps.trended ()); -} - -nano::uint128_t nano::node::minimum_principal_weight (nano::uint128_t const & online_stake) -{ - return online_stake / network_params.network.principal_weight_factor; + return online_reps.trended () / network_params.network.principal_weight_factor; } void nano::node::long_inactivity_cleanup () diff --git a/nano/node/node.hpp b/nano/node/node.hpp index 4452685a2..b261767f6 100644 --- a/nano/node/node.hpp +++ b/nano/node/node.hpp @@ -118,7 +118,6 @@ public: nano::uint128_t weight (nano::account const &); nano::block_hash rep_block (nano::account const &); nano::uint128_t minimum_principal_weight (); - nano::uint128_t minimum_principal_weight (nano::uint128_t const &); void ongoing_rep_calculation (); void ongoing_bootstrap (); void ongoing_peer_store (); From 64da5ceceab1b48108f9bdd2a2bb8ce68e3e672e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Wo=CC=81jcik?= <3044353+fikumikudev@users.noreply.github.com> Date: Thu, 21 Jul 2022 16:26:26 +0200 Subject: [PATCH 3/3] Extract `election::cooldown_time` calculation --- nano/node/election.cpp | 42 ++++++++++++++++++++++-------------------- nano/node/election.hpp | 6 +++++- 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/nano/node/election.cpp b/nano/node/election.cpp index d1e9e29d4..7b02e56ba 100644 --- a/nano/node/election.cpp +++ b/nano/node/election.cpp @@ -212,7 +212,7 @@ bool nano::election::transition_time (nano::confirmation_solicitor & solicitor_a return result; } -std::chrono::milliseconds nano::election::time_to_live () +std::chrono::milliseconds nano::election::time_to_live () const { switch (behavior) { @@ -221,7 +221,22 @@ std::chrono::milliseconds nano::election::time_to_live () case election_behavior::hinted: return std::chrono::milliseconds (30 * 1000); } - release_assert (false); + return {}; +} + +std::chrono::seconds nano::election::cooldown_time (nano::uint128_t weight) const +{ + auto online_stake = node.online_reps.trended (); + if (weight > online_stake / 20) // Reps with more than 5% weight + { + return std::chrono::seconds{ 1 }; + } + if (weight > online_stake / 100) // Reps with more than 1% weight + { + return std::chrono::seconds{ 5 }; + } + // The rest of smaller reps + return std::chrono::seconds{ 15 }; } bool nano::election::have_quorum (nano::tally_t const & tally_a) const @@ -351,25 +366,12 @@ std::shared_ptr nano::election::find (nano::block_hash const & hash nano::election_vote_result nano::election::vote (nano::account const & rep, uint64_t timestamp_a, nano::block_hash const & block_hash_a) { - auto replay (false); - auto online_stake (node.online_reps.trended ()); - auto weight (node.ledger.weight (rep)); - auto should_process (false); - if (node.network_params.network.is_dev_network () || weight > node.minimum_principal_weight (online_stake)) + auto replay = false; + auto weight = node.ledger.weight (rep); + auto should_process = false; + if (node.network_params.network.is_dev_network () || weight > node.minimum_principal_weight ()) { - unsigned int cooldown; - if (weight < online_stake / 100) // 0.1% to 1% - { - cooldown = 15; - } - else if (weight < online_stake / 20) // 1% to 5% - { - cooldown = 5; - } - else // 5% or above - { - cooldown = 1; - } + const auto cooldown = cooldown_time (weight); nano::unique_lock lock (mutex); diff --git a/nano/node/election.hpp b/nano/node/election.hpp index fbd1fc71a..22f236c8d 100644 --- a/nano/node/election.hpp +++ b/nano/node/election.hpp @@ -131,7 +131,11 @@ private: void remove_votes (nano::block_hash const &); void remove_block (nano::block_hash const &); bool replace_by_weight (nano::unique_lock & lock_a, nano::block_hash const &); - std::chrono::milliseconds time_to_live (); + std::chrono::milliseconds time_to_live () const; + /* + * Calculates minimum time delay between subsequent votes when processing non-final votes + */ + std::chrono::seconds cooldown_time (nano::uint128_t weight) const; private: std::unordered_map> last_blocks;