From 9408463decaffef48eb3118344064e67b2dcb7d4 Mon Sep 17 00:00:00 2001 From: Kieran Prasch Date: Wed, 7 Aug 2019 16:20:43 -0700 Subject: [PATCH] Refactor from_seed_and_stake_info to accept a checksum_address inclusive in the URI. --- nucypher/characters/lawful.py | 18 ++++++------------ nucypher/cli/actions.py | 2 +- nucypher/network/protocols.py | 2 ++ tests/learning/test_domains.py | 3 ++- 4 files changed, 11 insertions(+), 14 deletions(-) diff --git a/nucypher/characters/lawful.py b/nucypher/characters/lawful.py index 04c59e6c5..5fe59eab5 100644 --- a/nucypher/characters/lawful.py +++ b/nucypher/characters/lawful.py @@ -1058,19 +1058,15 @@ class Ursula(Teacher, Character, Worker): return stranger_ursula_from_public_keys @classmethod - def from_seednode_metadata(cls, - seednode_metadata, - *args, - **kwargs): + def from_seednode_metadata(cls, seednode_metadata, *args, **kwargs): """ Essentially another deserialization method, but this one doesn't reconstruct a complete node from bytes; instead it's just enough to connect to and verify a node. - """ - return cls.from_seed_and_stake_info(checksum_address=seednode_metadata.checksum_address, - seed_uri='{}:{}'.format(seednode_metadata.rest_host, - seednode_metadata.rest_port), - *args, **kwargs) + NOTE: This is a federated only method. + """ + seed_uri = f'{seednode_metadata.checksum_address}@{seednode_metadata.rest_host}:{seednode_metadata.rest_port}' + return cls.from_seed_and_stake_info(seed_uri=seed_uri, *args, **kwargs) @classmethod def from_teacher_uri(cls, @@ -1086,9 +1082,8 @@ class Ursula(Teacher, Character, Worker): raise ConnectionRefusedError("Host {} Refused Connection".format(teacher_uri)) try: - teacher = cls.from_seed_and_stake_info(seed_uri='{host}:{port}'.format(host=hostname, port=port), + teacher = cls.from_seed_and_stake_info(seed_uri=teacher_uri, federated_only=federated_only, - checksum_address=checksum_address, minimum_stake=min_stake, network_middleware=network_middleware, blockchain=blockchain) @@ -1104,7 +1099,6 @@ class Ursula(Teacher, Character, Worker): return __attempt() @classmethod - @validate_checksum_address def from_seed_and_stake_info(cls, seed_uri: str, federated_only: bool, diff --git a/nucypher/cli/actions.py b/nucypher/cli/actions.py index 853788aa8..962a60e4c 100644 --- a/nucypher/cli/actions.py +++ b/nucypher/cli/actions.py @@ -127,7 +127,7 @@ def load_seednodes(emitter, emitter.message(f"No default teacher nodes exist for the specified network: {domain}") else: # Prefer the injected teacher URI, then use the hardcoded seednodes. - teacher_uris.append(seednode_uris) + teacher_uris.extend(seednode_uris) for uri in teacher_uris: teacher_node = Ursula.from_teacher_uri(teacher_uri=uri, diff --git a/nucypher/network/protocols.py b/nucypher/network/protocols.py index 1f61ad487..d47a658be 100644 --- a/nucypher/network/protocols.py +++ b/nucypher/network/protocols.py @@ -32,6 +32,8 @@ def parse_node_uri(uri: str): if '@' in uri: checksum_address, uri = uri.split("@") + if checksum_address is None: + raise ValueError(f"{uri} is not a valid Teacher URI.") if not is_checksum_address(checksum_address): raise ValueError("{} is not a valid checksum address.".format(checksum_address)) else: diff --git a/tests/learning/test_domains.py b/tests/learning/test_domains.py index 8622cd8fc..9ce999f74 100644 --- a/tests/learning/test_domains.py +++ b/tests/learning/test_domains.py @@ -1,7 +1,8 @@ from functools import partial -from nucypher.utilities.sandbox.ursula import make_federated_ursulas +import pytest +from nucypher.utilities.sandbox.ursula import make_federated_ursulas def test_learner_learns_about_domains_separately(ursula_federated_test_config, caplog): lonely_ursula_maker = partial(make_federated_ursulas,