mirror of
https://github.com/planetmint/planetmint.git
synced 2025-11-24 14:35:45 +00:00
moved get_validators and get_recipients to planetmint
Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com>
This commit is contained in:
parent
b397cc98b6
commit
c3c9f405b0
@ -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:
|
||||||
|
|||||||
@ -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"))
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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 = {}
|
||||||
|
|||||||
@ -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])
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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])
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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])
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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 = [
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user