generalize election status

This commit is contained in:
ryan 2016-04-29 10:50:27 +02:00
parent cea2f6f554
commit eb444c0771
3 changed files with 19 additions and 9 deletions

View File

@ -476,16 +476,22 @@ class Bigchain(object):
return unvoted 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']) n_voters = len(block['block']['voters'])
vote_list = [vote['vote']['is_block_valid'] for vote in block['block']['votes']] vote_list = [vote['vote']['is_block_valid'] for vote in block['block']['votes']]
# validate votes here
n_invalid_votes = vote_list.count(False) n_invalid_votes = vote_list.count(False)
n_valid_votes = vote_list.count(True)
if n_invalid_votes >= int(n_voters/2): if n_invalid_votes >= int(n_voters/2):
return True return 'invalid'
elif n_valid_votes > int(n_voters/2):
return 'valid'
else: else:
return False return 'undecided'

View File

@ -218,7 +218,7 @@ class Election(object):
logger.info('clean exit') logger.info('clean exit')
return return
if b.block_voted_invalid(next_block): if b.block_election_status(next_block) == 'invalid':
self.q_invalid_blocks.put(next_block) self.q_invalid_blocks.put(next_block)
def requeue_transactions(self): def requeue_transactions(self):

View File

@ -314,15 +314,19 @@ class TestBlockElection(object):
# test unanimously valid block # test unanimously valid block
test_block['block']['votes'] = [valid_vote, valid_vote, valid_vote, valid_vote] 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 with minority invalid vote
test_block['block']['votes'] = [invalid_vote, valid_vote, valid_vote, valid_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] 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): def test_tx_rewritten_after_invalid(self, b, user_public_key):
q_block_new_vote = mp.Queue() q_block_new_vote = mp.Queue()