mirror of
https://github.com/bigchaindb/bigchaindb.git
synced 2024-10-13 13:34:05 +00:00
Problem: Event stream cannot handle election txn
Solution: generalize implemenation to handle election txn type
This commit is contained in:
parent
dbcc7e538f
commit
df6af78a69
@ -16,7 +16,9 @@ import sys
|
|||||||
from bigchaindb.utils import load_node_key
|
from bigchaindb.utils import load_node_key
|
||||||
from bigchaindb.common.exceptions import (DatabaseAlreadyExists,
|
from bigchaindb.common.exceptions import (DatabaseAlreadyExists,
|
||||||
DatabaseDoesNotExist,
|
DatabaseDoesNotExist,
|
||||||
OperationError, KeypairMismatchException)
|
ValidationError,
|
||||||
|
OperationError,
|
||||||
|
KeypairMismatchException)
|
||||||
import bigchaindb
|
import bigchaindb
|
||||||
from bigchaindb import (backend, ValidatorElection,
|
from bigchaindb import (backend, ValidatorElection,
|
||||||
BigchainDB, ValidatorElectionVote)
|
BigchainDB, ValidatorElectionVote)
|
||||||
@ -129,16 +131,23 @@ def run_upsert_validator_new(args, bigchain):
|
|||||||
'node_id': args.node_id
|
'node_id': args.node_id
|
||||||
}
|
}
|
||||||
|
|
||||||
key = load_node_key(args.sk)
|
try:
|
||||||
|
key = load_node_key(args.sk)
|
||||||
|
voters = ValidatorElection.recipients(bigchain)
|
||||||
|
election = ValidatorElection.generate([key.public_key],
|
||||||
|
voters,
|
||||||
|
new_validator, None).sign([key.private_key])
|
||||||
|
election.validate(bigchain)
|
||||||
|
except ValidationError as e:
|
||||||
|
logger.error(e)
|
||||||
|
return False
|
||||||
|
except FileNotFoundError as fd_404:
|
||||||
|
logger.error(fd_404)
|
||||||
|
return False
|
||||||
|
|
||||||
voters = ValidatorElection.recipients(bigchain)
|
|
||||||
|
|
||||||
election = ValidatorElection.generate([key.public_key],
|
|
||||||
voters,
|
|
||||||
new_validator, None).sign([key.private_key])
|
|
||||||
election.validate(bigchain)
|
|
||||||
resp = bigchain.write_transaction(election, 'broadcast_tx_commit')
|
resp = bigchain.write_transaction(election, 'broadcast_tx_commit')
|
||||||
if resp == (202, ''):
|
if resp == (202, ''):
|
||||||
|
print('[SUCCESS] Submitted proposal with id:', election.id)
|
||||||
return election.id
|
return election.id
|
||||||
else:
|
else:
|
||||||
raise OperationError('Failed to commit election')
|
raise OperationError('Failed to commit election')
|
||||||
|
|||||||
@ -220,6 +220,7 @@ class ValidatorElection(Transaction):
|
|||||||
updated_validator_set = new_validator_set(curr_validator_set,
|
updated_validator_set = new_validator_set(curr_validator_set,
|
||||||
new_height, validator_updates)
|
new_height, validator_updates)
|
||||||
|
|
||||||
|
updated_validator_set = [v for v in updated_validator_set if v['voting_power'] > 0]
|
||||||
bigchain.store_validator_set(new_height+1, updated_validator_set)
|
bigchain.store_validator_set(new_height+1, updated_validator_set)
|
||||||
return [encode_validator(election.asset['data'])]
|
return [encode_validator(election.asset['data'])]
|
||||||
return []
|
return []
|
||||||
|
|||||||
@ -102,7 +102,8 @@ class Dispatcher:
|
|||||||
block = event.data
|
block = event.data
|
||||||
|
|
||||||
for tx in block['transactions']:
|
for tx in block['transactions']:
|
||||||
asset_id = tx['id'] if tx['operation'] == 'CREATE' else tx['asset']['id']
|
asset_id = tx['asset'].get('id', None)
|
||||||
|
asset_id = tx['id'] if asset_id is None else asset_id
|
||||||
data = {'height': block['height'],
|
data = {'height': block['height'],
|
||||||
'asset_id': asset_id,
|
'asset_id': asset_id,
|
||||||
'transaction_id': tx['id']}
|
'transaction_id': tx['id']}
|
||||||
|
|||||||
@ -310,11 +310,37 @@ def test_get_validator_update(b, node_keys, node_key, ed25519_node_keys):
|
|||||||
b.store_bulk_transactions([tx_vote0, tx_vote1])
|
b.store_bulk_transactions([tx_vote0, tx_vote1])
|
||||||
|
|
||||||
update = ValidatorElection.get_validator_update(b, 4, [tx_vote2])
|
update = ValidatorElection.get_validator_update(b, 4, [tx_vote2])
|
||||||
print('update', update)
|
|
||||||
update_public_key = codecs.encode(update[0].pub_key.data, 'base64').decode().rstrip('\n')
|
update_public_key = codecs.encode(update[0].pub_key.data, 'base64').decode().rstrip('\n')
|
||||||
assert len(update) == 1
|
assert len(update) == 1
|
||||||
assert update_public_key == public_key64
|
assert update_public_key == public_key64
|
||||||
|
|
||||||
|
# remove validator
|
||||||
|
power = 0
|
||||||
|
new_validator = {'public_key': public_key,
|
||||||
|
'node_id': 'some_node_id',
|
||||||
|
'power': power}
|
||||||
|
voters = ValidatorElection.recipients(b)
|
||||||
|
election = ValidatorElection.generate([node_key.public_key],
|
||||||
|
voters,
|
||||||
|
new_validator).sign([node_key.private_key])
|
||||||
|
# store election
|
||||||
|
b.store_bulk_transactions([election])
|
||||||
|
|
||||||
|
tx_vote0 = gen_vote(election, 0, ed25519_node_keys)
|
||||||
|
tx_vote1 = gen_vote(election, 1, ed25519_node_keys)
|
||||||
|
tx_vote2 = gen_vote(election, 2, ed25519_node_keys)
|
||||||
|
|
||||||
|
b.store_bulk_transactions([tx_vote0, tx_vote1])
|
||||||
|
|
||||||
|
update = ValidatorElection.get_validator_update(b, 9, [tx_vote2])
|
||||||
|
update_public_key = codecs.encode(update[0].pub_key.data, 'base64').decode().rstrip('\n')
|
||||||
|
assert len(update) == 1
|
||||||
|
assert update_public_key == public_key64
|
||||||
|
|
||||||
|
# assert that the public key is not a part of the current validator set
|
||||||
|
for v in b.get_validators(10):
|
||||||
|
assert not v['pub_key']['data'] == public_key64
|
||||||
|
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
# Helper functions
|
# Helper functions
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user