moved get_validators and get_recipients to planetmint

Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com>
This commit is contained in:
Lorenz Herzberger 2022-09-29 15:42:00 +02:00
parent b397cc98b6
commit c3c9f405b0
No known key found for this signature in database
GPG Key ID: FA5EE906EB55316A
11 changed files with 42 additions and 45 deletions

View File

@ -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:

View File

@ -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"))

View File

@ -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

View File

@ -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 = {}

View File

@ -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])

View File

@ -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

View File

@ -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)

View File

@ -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])

View File

@ -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])

View File

@ -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

View File

@ -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 = [