diff --git a/bigchaindb/core.py b/bigchaindb/core.py index 2e4823e0..39575bbc 100644 --- a/bigchaindb/core.py +++ b/bigchaindb/core.py @@ -476,16 +476,22 @@ class Bigchain(object): return unvoted - def block_voted_invalid(self, block): + def block_election_status(self, block): """ - Checks if block has enough invalid votes to make a decision + Tallies the votes on a block, and returns the status: valid, invalid, or undecided """ n_voters = len(block['block']['voters']) vote_list = [vote['vote']['is_block_valid'] for vote in block['block']['votes']] + # validate votes here + n_invalid_votes = vote_list.count(False) + n_valid_votes = vote_list.count(True) + if n_invalid_votes >= int(n_voters/2): - return True + return 'invalid' + elif n_valid_votes > int(n_voters/2): + return 'valid' else: - return False + return 'undecided' diff --git a/bigchaindb/voter.py b/bigchaindb/voter.py index 1fba5622..a5d2671f 100644 --- a/bigchaindb/voter.py +++ b/bigchaindb/voter.py @@ -218,7 +218,7 @@ class Election(object): logger.info('clean exit') return - if b.block_voted_invalid(next_block): + if b.block_election_status(next_block) == 'invalid': self.q_invalid_blocks.put(next_block) def requeue_transactions(self): diff --git a/tests/db/test_voter.py b/tests/db/test_voter.py index fd9c5716..8180c133 100644 --- a/tests/db/test_voter.py +++ b/tests/db/test_voter.py @@ -314,15 +314,19 @@ class TestBlockElection(object): # test unanimously valid block test_block['block']['votes'] = [valid_vote, valid_vote, valid_vote, valid_vote] - assert not b.block_voted_invalid(test_block) + assert b.block_election_status(test_block) == 'valid' # test block with minority invalid vote test_block['block']['votes'] = [invalid_vote, valid_vote, valid_vote, valid_vote] - assert not b.block_voted_invalid(test_block) + assert b.block_election_status(test_block) == 'valid' - # test split vote -- block_voted_invalid should return True + # test split vote test_block['block']['votes'] = [invalid_vote, invalid_vote, valid_vote, valid_vote] - assert b.block_voted_invalid(test_block) + assert b.block_election_status(test_block) == 'invalid' + + # test undecided + test_block['block']['votes'] = [valid_vote, valid_vote] + assert b.block_election_status(test_block) == 'undecided' def test_tx_rewritten_after_invalid(self, b, user_public_key): q_block_new_vote = mp.Queue()