From 5aabce5824f1aef855dc6bca8bdda2147e70d868 Mon Sep 17 00:00:00 2001 From: SergiySW Date: Tue, 12 Jun 2018 03:10:02 +0300 Subject: [PATCH] Voting winner patch (by Lee Bousfield) (#916) * Voting winner patch (by Lee Bousfield) * Missed from patch --- rai/core_test/node.cpp | 4 ++-- rai/ledger.cpp | 2 +- rai/node/node.cpp | 17 ++++++++++++----- rai/node/node.hpp | 2 +- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/rai/core_test/node.cpp b/rai/core_test/node.cpp index 9585d7daa8..a4abc9e3a6 100644 --- a/rai/core_test/node.cpp +++ b/rai/core_test/node.cpp @@ -669,7 +669,7 @@ TEST (node, fork_publish) ASSERT_NE (node1.active.roots.end (), existing); auto election (existing->election); rai::transaction transaction (node1.store.environment, nullptr, false); - election->compute_rep_votes (transaction); + election->compute_rep_votes (transaction, election->status.winner); ASSERT_EQ (2, election->votes.rep_votes.size ()); node1.process_active (send2); node1.block_processor.flush (); @@ -1186,7 +1186,7 @@ TEST (node, rep_self_vote) auto existing (active.roots.find (block0->root ())); ASSERT_NE (active.roots.end (), existing); rai::transaction transaction (node0->store.environment, nullptr, false); - existing->election->compute_rep_votes (transaction); + existing->election->compute_rep_votes (transaction, existing->election->status.winner); auto & rep_votes (existing->election->votes.rep_votes); ASSERT_EQ (3, rep_votes.size ()); ASSERT_NE (rep_votes.end (), rep_votes.find (rai::test_genesis_key.pub)); diff --git a/rai/ledger.cpp b/rai/ledger.cpp index e3cc1b028f..6230e31bf1 100644 --- a/rai/ledger.cpp +++ b/rai/ledger.cpp @@ -498,7 +498,7 @@ size_t rai::shared_ptr_block_hash::operator() (std::shared_ptr const bool rai::shared_ptr_block_hash::operator() (std::shared_ptr const & lhs, std::shared_ptr const & rhs) const { - return *lhs == *rhs; + return lhs->hash () == rhs->hash (); } rai::ledger::ledger (rai::block_store & store_a, rai::stat & stat_a) : diff --git a/rai/node/node.cpp b/rai/node/node.cpp index f9461abf74..3cfe6b7ecf 100644 --- a/rai/node/node.cpp +++ b/rai/node/node.cpp @@ -3112,12 +3112,12 @@ confirmed (false) { } -void rai::election::compute_rep_votes (MDB_txn * transaction_a) +void rai::election::compute_rep_votes (MDB_txn * transaction_a, std::shared_ptr block_a) { if (node.config.enable_voting) { - node.wallets.foreach_representative (transaction_a, [this, transaction_a](rai::public_key const & pub_a, rai::raw_key const & prv_a) { - auto vote (this->node.store.vote_generate (transaction_a, pub_a, prv_a, status.winner)); + node.wallets.foreach_representative (transaction_a, [this, transaction_a, block_a](rai::public_key const & pub_a, rai::raw_key const & prv_a) { + auto vote (this->node.store.vote_generate (transaction_a, pub_a, prv_a, block_a)); this->node.vote_processor.vote (vote, this->node.network.endpoint ()); }); } @@ -3126,8 +3126,15 @@ void rai::election::compute_rep_votes (MDB_txn * transaction_a) void rai::election::broadcast_winner () { rai::transaction transaction (node.store.environment, nullptr, false); - compute_rep_votes (transaction); - node.network.republish_block (transaction, status.winner); + auto tally_l (node.ledger.tally (transaction, votes)); + auto winner_l (tally_l.begin ()); + auto block_l (status.winner); + if (winner_l != tally_l.end ()) + { + block_l = winner_l->second; + } + compute_rep_votes (transaction, block_l); + node.network.republish_block (transaction, block_l); } void rai::election::confirm_once (MDB_txn * transaction_a) diff --git a/rai/node/node.hpp b/rai/node/node.hpp index f40611568c..a342b2685d 100644 --- a/rai/node/node.hpp +++ b/rai/node/node.hpp @@ -63,7 +63,7 @@ class election : public std::enable_shared_from_this // Tell the network our view of the winner void broadcast_winner (); // Change our winner to agree with the network - void compute_rep_votes (MDB_txn *); + void compute_rep_votes (MDB_txn *, std::shared_ptr); // Confirm this block if quorum is met void confirm_if_quorum (MDB_txn *); rai::votes votes;