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): def create_new_election(sk, planet, election_class, data):
try: try:
key = load_node_key(sk) 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]) election = election_class.generate([key.public_key], voters, data, None).sign([key.private_key])
planet.validate_election(election) planet.validate_election(election)
except ValidationError as e: except ValidationError as e:

View File

@ -720,4 +720,25 @@ class Planetmint(object):
return None return None
return self.get_validator_set(latest_block["height"]) 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")) Block = namedtuple("Block", ("app_hash", "height", "transactions"))

View File

@ -41,7 +41,7 @@ class ChainMigrationElection(Election):
}, },
"power": v, "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)}" output += f"\nvalidators={json.dumps(validators, indent=4)}"
return output return output

View File

@ -34,29 +34,6 @@ class Election(Transaction):
# Vote ratio to approve an election # Vote ratio to approve an election
ELECTION_THRESHOLD = 2 / 3 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 @classmethod
def is_same_topology(cls, current_topology, election_topology): # TODO: move somewhere else def is_same_topology(cls, current_topology, election_topology): # TODO: move somewhere else
voters = {} voters = {}

View File

@ -611,7 +611,7 @@ def call_election(b, new_validator, node_key):
b.write_transaction = mock_write b.write_transaction = mock_write
# our voters is a list of length 1, populated from our mocked validator # 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 # and our voter is the public key from the voter list
voter = node_key.public_key voter = node_key.public_key
valid_election = ValidatorElection.generate([voter], voters, new_validator, None).sign([node_key.private_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 @pytest.fixture
def valid_upsert_validator_election(b_mock, node_key, new_validator): 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]) return ValidatorElection.generate([node_key.public_key], voters, new_validator, None).sign([node_key.private_key])
@pytest.fixture @pytest.fixture
def valid_upsert_validator_election_2(b_mock, node_key, new_validator): 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]) 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 @pytest.fixture
def validator_election_votes(b_mock, ongoing_validator_election, ed25519_node_keys): 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) votes = generate_votes(ongoing_validator_election, voters, ed25519_node_keys)
return votes return votes
@pytest.fixture @pytest.fixture
def validator_election_votes_2(b_mock, ongoing_validator_election_2, ed25519_node_keys): 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) votes = generate_votes(ongoing_validator_election_2, voters, ed25519_node_keys)
return votes 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): 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]) election = ChainMigrationElection.generate([node_key.public_key], voters, {}, None).sign([node_key.private_key])
assert b_mock.validate_election(election) assert b_mock.validate_election(election)

View File

@ -12,14 +12,14 @@ from planetmint.transactions.types.elections.validator_election import Validator
@pytest.fixture @pytest.fixture
def valid_upsert_validator_election_b(b, node_key, new_validator): 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]) return ValidatorElection.generate([node_key.public_key], voters, new_validator, None).sign([node_key.private_key])
@pytest.fixture @pytest.fixture
@patch("planetmint.transactions.types.elections.election.uuid4", lambda: "mock_uuid4") @patch("planetmint.transactions.types.elections.election.uuid4", lambda: "mock_uuid4")
def fixed_seed_election(b_mock, node_key, new_validator): 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]) 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) assert not valid_upsert_validator_election.has_concluded(b_mock)
# validate vote # validate vote
# assert tx_vote0.validate(b_mock)
assert b_mock.validate_transaction(tx_vote0) assert b_mock.validate_transaction(tx_vote0)
assert not valid_upsert_validator_election.has_concluded(b_mock, [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, "power": power,
} }
voters = ValidatorElection.recipients(b) voters = b.get_recipients_list()
election = ValidatorElection.generate([node_key.public_key], voters, new_validator, None).sign( election = ValidatorElection.generate([node_key.public_key], voters, new_validator, None).sign(
[node_key.private_key] [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", "node_id": "some_node_id",
"power": power, "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]) election = ValidatorElection.generate([node_key.public_key], voters, new_validator).sign([node_key.private_key])
# store election # store election
b.store_bulk_transactions([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", "node_id": "some_node_id",
"power": power, "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]) election = ValidatorElection.generate([node_key.public_key], voters, new_validator).sign([node_key.private_key])
# store election # store election
b.store_bulk_transactions([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): 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( election = ValidatorElection.generate([node_key.public_key], voters, new_validator, None).sign(
[node_key.private_key] [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"]: for iv in ["ed25519-base32", "ed25519-base64"]:
new_validator["public_key"]["type"] = iv new_validator["public_key"]["type"] = iv
voters = ValidatorElection.recipients(b_mock) voters = b_mock.get_recipients_list()
with pytest.raises(InvalidPublicKey): with pytest.raises(InvalidPublicKey):
ValidatorElection.generate([node_key.public_key], voters, new_validator, None).sign([node_key.private_key]) 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): 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 new_validator["power"] = 30
election = ValidatorElection.generate([node_key.public_key], voters, new_validator, None).sign( 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 from planetmint.transactions.common.crypto import generate_key_pair
alice = 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]) election = ValidatorElection.generate([alice.public_key], voters, new_validator, None).sign([alice.private_key])
with pytest.raises(InvalidProposer): with pytest.raises(InvalidProposer):
b_mock.validate_election(election) 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 from planetmint.transactions.common.crypto import generate_key_pair
alice = 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( election = ValidatorElection.generate([node_key.public_key, alice.public_key], voters, new_validator, None).sign(
[node_key.private_key, alice.private_key] [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") @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): 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( duplicate_election = ValidatorElection.generate([node_key.public_key], voters, new_validator, None).sign(
[node_key.private_key] [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): with pytest.raises(UnequalValidatorSet):
b_mock.validate_election(invalid_election) b_mock.validate_election(invalid_election)
recipients = ValidatorElection.recipients(b_mock) recipients = b_mock.get_recipients_list()
altered_recipients = [] altered_recipients = []
for r in recipients: for r in recipients:
([r_public_key], voting_power) = r ([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): 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]) election = cls.generate([public_key], voters, asset_data, None).sign([private_key])
votes = [ votes = [