diff --git a/planetmint/commands/planetmint.py b/planetmint/commands/planetmint.py index df9c195..0815061 100644 --- a/planetmint/commands/planetmint.py +++ b/planetmint/commands/planetmint.py @@ -119,7 +119,7 @@ def run_election_new(args, planet): def create_new_election(sk, planet, election_class, data): try: key = load_node_key(sk) - voters = election_class.recipients(planet) + voters = planet.get_recipients_list() election = election_class.generate([key.public_key], voters, data, None).sign([key.private_key]) planet.validate_election(election) except ValidationError as e: diff --git a/planetmint/lib.py b/planetmint/lib.py index 830b1c8..d67a00a 100644 --- a/planetmint/lib.py +++ b/planetmint/lib.py @@ -720,4 +720,25 @@ class Planetmint(object): return None return self.get_validator_set(latest_block["height"]) + def get_validator_dict(self, height=None): + """Return a dictionary of validators with key as `public_key` and + value as the `voting_power` + """ + validators = {} + for validator in self.get_validators(height): + # NOTE: we assume that Tendermint encodes public key in base64 + public_key = public_key_from_ed25519_key(key_from_base64(validator["public_key"]["value"])) + validators[public_key] = validator["voting_power"] + + return validators + + def get_recipients_list(self): + """Convert validator dictionary to a recipient list for `Transaction`""" + + recipients = [] + for public_key, voting_power in self.get_validator_dict().items(): + recipients.append(([public_key], voting_power)) + + return recipients + Block = namedtuple("Block", ("app_hash", "height", "transactions")) diff --git a/planetmint/transactions/types/elections/chain_migration_election.py b/planetmint/transactions/types/elections/chain_migration_election.py index 978cc6c..9d46bfd 100644 --- a/planetmint/transactions/types/elections/chain_migration_election.py +++ b/planetmint/transactions/types/elections/chain_migration_election.py @@ -41,7 +41,7 @@ class ChainMigrationElection(Election): }, "power": v, } - for k, v in self.get_validators(planet).items() + for k, v in planet.get_validator_dict().items() ] output += f"\nvalidators={json.dumps(validators, indent=4)}" return output diff --git a/planetmint/transactions/types/elections/election.py b/planetmint/transactions/types/elections/election.py index 4384a66..5f1bfc7 100644 --- a/planetmint/transactions/types/elections/election.py +++ b/planetmint/transactions/types/elections/election.py @@ -34,29 +34,6 @@ class Election(Transaction): # Vote ratio to approve an election ELECTION_THRESHOLD = 2 / 3 - @classmethod - def get_validators(cls, planet, height=None): # TODO: move somewhere else - """Return a dictionary of validators with key as `public_key` and - value as the `voting_power` - """ - validators = {} - for validator in planet.get_validators(height): - # NOTE: we assume that Tendermint encodes public key in base64 - public_key = public_key_from_ed25519_key(key_from_base64(validator["public_key"]["value"])) - validators[public_key] = validator["voting_power"] - - return validators - - @classmethod - def recipients(cls, planet): # TODO: move somewhere else - """Convert validator dictionary to a recipient list for `Transaction`""" - - recipients = [] - for public_key, voting_power in cls.get_validators(planet).items(): - recipients.append(([public_key], voting_power)) - - return recipients - @classmethod def is_same_topology(cls, current_topology, election_topology): # TODO: move somewhere else voters = {} diff --git a/tests/commands/test_commands.py b/tests/commands/test_commands.py index d77224a..9065cfe 100644 --- a/tests/commands/test_commands.py +++ b/tests/commands/test_commands.py @@ -611,7 +611,7 @@ def call_election(b, new_validator, node_key): b.write_transaction = mock_write # our voters is a list of length 1, populated from our mocked validator - voters = ValidatorElection.recipients(b) + voters = b.get_recipients_list() # and our voter is the public key from the voter list voter = node_key.public_key valid_election = ValidatorElection.generate([voter], voters, new_validator, None).sign([node_key.private_key]) diff --git a/tests/conftest.py b/tests/conftest.py index 0f11542..2755728 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -719,13 +719,13 @@ def new_validator(): @pytest.fixture def valid_upsert_validator_election(b_mock, node_key, new_validator): - voters = ValidatorElection.recipients(b_mock) + voters = b_mock.get_recipients_list() return ValidatorElection.generate([node_key.public_key], voters, new_validator, None).sign([node_key.private_key]) @pytest.fixture def valid_upsert_validator_election_2(b_mock, node_key, new_validator): - voters = ValidatorElection.recipients(b_mock) + voters = b_mock.get_recipients_list() return ValidatorElection.generate([node_key.public_key], voters, new_validator, None).sign([node_key.private_key]) @@ -755,14 +755,14 @@ def ongoing_validator_election_2(b, valid_upsert_validator_election_2, ed25519_n @pytest.fixture def validator_election_votes(b_mock, ongoing_validator_election, ed25519_node_keys): - voters = ValidatorElection.recipients(b_mock) + voters = b_mock.get_recipients_list() votes = generate_votes(ongoing_validator_election, voters, ed25519_node_keys) return votes @pytest.fixture def validator_election_votes_2(b_mock, ongoing_validator_election_2, ed25519_node_keys): - voters = ValidatorElection.recipients(b_mock) + voters = b_mock.get_recipients_list() votes = generate_votes(ongoing_validator_election_2, voters, ed25519_node_keys) return votes diff --git a/tests/migrations/test_migration_election.py b/tests/migrations/test_migration_election.py index 314daad..b83ac0c 100644 --- a/tests/migrations/test_migration_election.py +++ b/tests/migrations/test_migration_election.py @@ -2,6 +2,6 @@ from planetmint.transactions.types.elections.chain_migration_election import Cha def test_valid_migration_election(b_mock, node_key): - voters = ChainMigrationElection.recipients(b_mock) + voters = b_mock.get_recipients_list() election = ChainMigrationElection.generate([node_key.public_key], voters, {}, None).sign([node_key.private_key]) assert b_mock.validate_election(election) diff --git a/tests/upsert_validator/conftest.py b/tests/upsert_validator/conftest.py index 9eb6334..630ce10 100644 --- a/tests/upsert_validator/conftest.py +++ b/tests/upsert_validator/conftest.py @@ -12,14 +12,14 @@ from planetmint.transactions.types.elections.validator_election import Validator @pytest.fixture def valid_upsert_validator_election_b(b, node_key, new_validator): - voters = ValidatorElection.recipients(b) + voters = b.get_recipients_list() return ValidatorElection.generate([node_key.public_key], voters, new_validator, None).sign([node_key.private_key]) @pytest.fixture @patch("planetmint.transactions.types.elections.election.uuid4", lambda: "mock_uuid4") def fixed_seed_election(b_mock, node_key, new_validator): - voters = ValidatorElection.recipients(b_mock) + voters = b_mock.get_recipients_list() return ValidatorElection.generate([node_key.public_key], voters, new_validator, None).sign([node_key.private_key]) diff --git a/tests/upsert_validator/test_upsert_validator_vote.py b/tests/upsert_validator/test_upsert_validator_vote.py index 784ab4f..10f802e 100644 --- a/tests/upsert_validator/test_upsert_validator_vote.py +++ b/tests/upsert_validator/test_upsert_validator_vote.py @@ -175,7 +175,6 @@ def test_valid_election_conclude(b_mock, valid_upsert_validator_election, ed2551 assert not valid_upsert_validator_election.has_concluded(b_mock) # validate vote - # assert tx_vote0.validate(b_mock) assert b_mock.validate_transaction(tx_vote0) assert not valid_upsert_validator_election.has_concluded(b_mock, [tx_vote0]) @@ -243,7 +242,7 @@ def test_upsert_validator(b, node_key, node_keys, ed25519_node_keys): "power": power, } - voters = ValidatorElection.recipients(b) + voters = b.get_recipients_list() election = ValidatorElection.generate([node_key.public_key], voters, new_validator, None).sign( [node_key.private_key] ) @@ -282,7 +281,7 @@ def test_get_validator_update(b, node_keys, node_key, ed25519_node_keys): "node_id": "some_node_id", "power": power, } - voters = ValidatorElection.recipients(b) + voters = b.get_recipients_list() election = ValidatorElection.generate([node_key.public_key], voters, new_validator).sign([node_key.private_key]) # store election b.store_bulk_transactions([election]) @@ -310,7 +309,7 @@ def test_get_validator_update(b, node_keys, node_key, ed25519_node_keys): "node_id": "some_node_id", "power": power, } - voters = ValidatorElection.recipients(b) + voters = b.get_recipients_list() election = ValidatorElection.generate([node_key.public_key], voters, new_validator).sign([node_key.private_key]) # store election b.store_bulk_transactions([election]) diff --git a/tests/upsert_validator/test_validator_election.py b/tests/upsert_validator/test_validator_election.py index 51068c6..6996f0c 100644 --- a/tests/upsert_validator/test_validator_election.py +++ b/tests/upsert_validator/test_validator_election.py @@ -21,7 +21,7 @@ pytestmark = pytest.mark.bdb def test_upsert_validator_valid_election(b_mock, new_validator, node_key): - voters = ValidatorElection.recipients(b_mock) + voters = b_mock.get_recipients_list() election = ValidatorElection.generate([node_key.public_key], voters, new_validator, None).sign( [node_key.private_key] ) @@ -33,14 +33,14 @@ def test_upsert_validator_invalid_election_public_key(b_mock, new_validator, nod for iv in ["ed25519-base32", "ed25519-base64"]: new_validator["public_key"]["type"] = iv - voters = ValidatorElection.recipients(b_mock) + voters = b_mock.get_recipients_list() with pytest.raises(InvalidPublicKey): ValidatorElection.generate([node_key.public_key], voters, new_validator, None).sign([node_key.private_key]) def test_upsert_validator_invalid_power_election(b_mock, new_validator, node_key): - voters = ValidatorElection.recipients(b_mock) + voters = b_mock.get_recipients_list() new_validator["power"] = 30 election = ValidatorElection.generate([node_key.public_key], voters, new_validator, None).sign( @@ -54,7 +54,7 @@ def test_upsert_validator_invalid_proposed_election(b_mock, new_validator, node_ from planetmint.transactions.common.crypto import generate_key_pair alice = generate_key_pair() - voters = ValidatorElection.recipients(b_mock) + voters = b_mock.get_recipients_list() election = ValidatorElection.generate([alice.public_key], voters, new_validator, None).sign([alice.private_key]) with pytest.raises(InvalidProposer): b_mock.validate_election(election) @@ -64,7 +64,7 @@ def test_upsert_validator_invalid_inputs_election(b_mock, new_validator, node_ke from planetmint.transactions.common.crypto import generate_key_pair alice = generate_key_pair() - voters = ValidatorElection.recipients(b_mock) + voters = b_mock.get_recipients_list() election = ValidatorElection.generate([node_key.public_key, alice.public_key], voters, new_validator, None).sign( [node_key.private_key, alice.private_key] ) @@ -74,7 +74,7 @@ def test_upsert_validator_invalid_inputs_election(b_mock, new_validator, node_ke @patch("planetmint.transactions.types.elections.election.uuid4", lambda: "mock_uuid4") def test_upsert_validator_invalid_election(b_mock, new_validator, node_key, fixed_seed_election): - voters = ValidatorElection.recipients(b_mock) + voters = b_mock.get_recipients_list() duplicate_election = ValidatorElection.generate([node_key.public_key], voters, new_validator, None).sign( [node_key.private_key] ) @@ -95,7 +95,7 @@ def test_upsert_validator_invalid_election(b_mock, new_validator, node_key, fixe with pytest.raises(UnequalValidatorSet): b_mock.validate_election(invalid_election) - recipients = ValidatorElection.recipients(b_mock) + recipients = b_mock.get_recipients_list() altered_recipients = [] for r in recipients: ([r_public_key], voting_power) = r diff --git a/tests/utils.py b/tests/utils.py index b418db8..ef70906 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -119,7 +119,7 @@ def generate_validators(powers): def generate_election(b, cls, public_key, private_key, asset_data, voter_keys): - voters = cls.recipients(b) + voters = b.get_recipients_list() election = cls.generate([public_key], voters, asset_data, None).sign([private_key]) votes = [