Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Require 2 conditions to confirm election #1157

Merged
merged 9 commits into from
Sep 22, 2018
5 changes: 3 additions & 2 deletions rai/core_test/node.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1603,12 +1603,13 @@ TEST (node, confirm_quorum)
rai::genesis genesis;
system.wallet (0)->insert_adhoc (rai::test_genesis_key.prv);
// Put greater than online_weight_minimum in pending so quorum can't be reached
auto send1 (std::make_shared<rai::state_block> (rai::test_genesis_key.pub, genesis.hash (), rai::test_genesis_key.pub, rai::Gxrb_ratio, rai::test_genesis_key.pub, rai::test_genesis_key.prv, rai::test_genesis_key.pub, system.nodes[0]->work_generate_blocking (genesis.hash ())));
rai::uint128_union new_balance (system.nodes[0]->config.online_weight_minimum.number () - rai::Gxrb_ratio);
auto send1 (std::make_shared<rai::state_block> (rai::test_genesis_key.pub, genesis.hash (), rai::test_genesis_key.pub, new_balance, rai::test_genesis_key.pub, rai::test_genesis_key.prv, rai::test_genesis_key.pub, system.nodes[0]->work_generate_blocking (genesis.hash ())));
{
auto transaction (system.nodes[0]->store.tx_begin (true));
ASSERT_EQ (rai::process_result::progress, system.nodes[0]->ledger.process (transaction, *send1).code);
}
system.wallet (0)->send_action (rai::test_genesis_key.pub, rai::test_genesis_key.pub, rai::Gxrb_ratio);
system.wallet (0)->send_action (rai::test_genesis_key.pub, rai::test_genesis_key.pub, new_balance.number ());
system.deadline_set (10s);
while (system.nodes[0]->active.roots.empty ())
{
Expand Down
24 changes: 14 additions & 10 deletions rai/node/node.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3558,14 +3558,18 @@ void rai::election::abort ()
aborted = true;
}

bool rai::election::have_quorum (rai::tally_t const & tally_a)
{
auto i (tally_a.begin ());
auto first (i->first);
++i;
auto second (i != tally_a.end () ? i->first : 0);
auto delta_l (node.delta ());
auto result (tally_a.begin ()->first > (second + delta_l));
bool rai::election::have_quorum (rai::tally_t const & tally_a, rai::uint128_t tally_sum)
{
bool result = false;
if (tally_sum >= node.config.online_weight_minimum.number ())
{
auto i (tally_a.begin ());
auto first (i->first);
++i;
auto second (i != tally_a.end () ? i->first : 0);
auto delta_l (node.delta ());
result = tally_a.begin ()->first > (second + delta_l);
}
return result;
}

Expand Down Expand Up @@ -3601,13 +3605,13 @@ void rai::election::confirm_if_quorum (rai::transaction const & transaction_a)
{
sum += i.first;
}
if (sum >= node.config.online_weight_minimum.number () && !(*block_l == *status.winner))
if (sum >= node.config.online_weight_minimum.number () && block_l->hash () != status.winner->hash ())
rkeene marked this conversation as resolved.
Show resolved Hide resolved
{
auto node_l (node.shared ());
node_l->block_processor.force (block_l);
status.winner = block_l;
}
if (have_quorum (tally_l))
if (have_quorum (tally_l, sum))
{
if (node.config.logging.vote_logging () || blocks.size () > 1)
{
Expand Down
2 changes: 1 addition & 1 deletion rai/node/node.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ class election : public std::enable_shared_from_this<rai::election>
rai::election_vote_result vote (rai::account, uint64_t, rai::block_hash);
rai::tally_t tally (rai::transaction const &);
// Check if we have vote quorum
bool have_quorum (rai::tally_t const &);
bool have_quorum (rai::tally_t const &, rai::uint128_t);
// Change our winner to agree with the network
void compute_rep_votes (rai::transaction const &);
// Confirm this block if quorum is met
Expand Down