class TestValidateTaskToCompute(object): @pytest.fixture(autouse=True) def setUp(self): (REQUESTOR_ETHEREUM_PRIVATE_KEY, REQUESTOR_ETHERUM_PUBLIC_KEY) = generate_ecc_key_pair() self.task_to_compute = TaskToComputeFactory( requestor_ethereum_public_key=encode_hex( REQUESTOR_ETHERUM_PUBLIC_KEY)) self.task_to_compute.generate_ethsig(REQUESTOR_ETHEREUM_PRIVATE_KEY) self.task_to_compute.sign_all_promissory_notes( deposit_contract_address=settings.GNT_DEPOSIT_CONTRACT_ADDRESS, private_key=REQUESTOR_ETHEREUM_PRIVATE_KEY, ) def test_that_valid_task_to_compute_doesnt_raise_any_exception(self): try: validate_task_to_compute(self.task_to_compute) except Exception as exception: # pylint: disable=broad-except assert False, f"Unexpected exception has been raised: {str(exception)}" def test_that_other_messages_than_task_to_compute_causes_message_validation_error( self): # pylint: disable=no-self-use wrong_message = ComputeTaskDefFactory() with pytest.raises(ConcentValidationError) as exception_wrapper: validate_task_to_compute(wrong_message) assert_that(exception_wrapper.value.error_code).is_equal_to( ErrorCode.MESSAGE_INVALID)
def create_signed_task_to_compute( deadline: int, timestamp: Optional[Union[datetime.datetime, str]] = None, provider_public_key: Optional[bytes] = None, requestor_public_key: Optional[bytes] = None, requestor_ethereum_public_key: Optional[bytes] = None, requestor_ethereum_private_key: Optional[bytes] = None, provider_ethereum_public_key: Optional[bytes] = None, want_to_compute_task: Optional[WantToComputeTask] = None, price: int = 1, size: int = 1, package_hash: str = 'sha1:57786d92d1a6f7eaaba1c984db5e108c68b03f0d', script_src: Optional[str] = None, ) -> TaskToCompute: with freeze_time(timestamp): compute_task_def = ComputeTaskDefFactory( deadline=deadline, extra_data={ 'output_format': 'png', 'scene_file': '/golem/resources/golem-header-light.blend', 'frames': [1], 'script_src': script_src, }) if script_src is not None: compute_task_def['extra_data']['script_src'] = script_src want_to_compute_task = want_to_compute_task if want_to_compute_task is not None else WantToComputeTaskFactory( provider_public_key=encode_hex(provider_public_key) if provider_public_key is not None else _get_provider_hex_public_key(), provider_ethereum_public_key=encode_hex( provider_ethereum_public_key) if provider_ethereum_public_key is not None else encode_hex(PROVIDER_ETHEREUM_PUBLIC_KEY), ) want_to_compute_task = sign_message(want_to_compute_task, PROVIDER_PRIVATE_KEY) task_to_compute = TaskToComputeFactory( requestor_public_key=encode_hex(requestor_public_key) if requestor_public_key is not None else _get_requestor_hex_public_key(), compute_task_def=compute_task_def, want_to_compute_task=want_to_compute_task, requestor_ethereum_public_key=encode_hex( requestor_ethereum_public_key) if requestor_ethereum_public_key is not None else encode_hex(REQUESTOR_ETHEREUM_PUBLIC_KEY), price=price, size=size, package_hash=package_hash, ) task_to_compute.generate_ethsig( requestor_ethereum_private_key if requestor_ethereum_private_key is not None else REQUESTOR_ETHEREUM_PRIVATE_KEY) signed_task_to_compute: TaskToCompute = sign_message( task_to_compute, REQUESTOR_PRIVATE_KEY) return signed_task_to_compute
def create_signed_task_to_compute( deadline: int, timestamp: Optional[Union[datetime.datetime, str]] = None, provider_public_key: Optional[bytes] = None, provider_private_key: Optional[bytes] = None, requestor_public_key: Optional[bytes] = None, requestor_private_key: Optional[bytes] = None, price: int = 1, size: int = 1, package_hash: str = 'sha1:57786d92d1a6f7eaaba1c984db5e108c68b03f0d', render_parameters: Optional[Dict[str, Any]] = None, ) -> TaskToCompute: # Temporary workaround for requestor's and provider's keys until all Concent use cases will have payments # When we will have payments then all keys will be taken from SCIBaseTest class if provider_public_key is None and provider_private_key is None: provider_public_key = PROVIDER_PUBLIC_KEY provider_private_key = PROVIDER_PRIVATE_KEY if requestor_public_key is None and requestor_private_key is None: requestor_public_key = REQUESTOR_PUBLIC_KEY requestor_private_key = REQUESTOR_PRIVATE_KEY with freeze_time(timestamp): compute_task_def = ComputeTaskDefFactory( deadline=deadline, extra_data={ 'output_format': 'png', 'scene_file': '/golem/resources/golem-header-light.blend', 'frames': [1], 'resolution': render_parameters.get('resolution') if render_parameters is not None else [400, 400], 'use_compositing': render_parameters.get('use_compositing') if render_parameters is not None else False, 'samples': render_parameters.get('samples') if render_parameters is not None else 0, 'crops': [{ 'borders_x': render_parameters['borders_x'] if render_parameters is not None else [0.0, 1.0], 'borders_y': render_parameters['borders_y'] if render_parameters is not None else [0.0, 1.0], }] }) task_header: TaskHeader = TaskHeaderFactory( task_id=compute_task_def['task_id'], sign__privkey=requestor_private_key, ) want_to_compute_task = WantToComputeTaskFactory( provider_public_key=encode_hex(provider_public_key), task_header=task_header, sign__privkey=provider_private_key) task_to_compute = TaskToComputeFactory( requestor_public_key=encode_hex(requestor_public_key), compute_task_def=compute_task_def, want_to_compute_task=want_to_compute_task, requestor_ethereum_public_key=encode_hex(requestor_public_key), price=price, size=size, package_hash=package_hash, ) task_to_compute.generate_ethsig(requestor_private_key) task_to_compute.sign_all_promissory_notes( deposit_contract_address=settings.GNT_DEPOSIT_CONTRACT_ADDRESS, private_key=requestor_private_key, ) signed_task_to_compute: TaskToCompute = sign_message( task_to_compute, requestor_private_key) # type: ignore return signed_task_to_compute
class TestAreEthereumAddressesAndKeysUnique(TestCase): def setUp(self): self.task_to_compute_1 = TaskToComputeFactory( requestor_ethereum_public_key=encode_hex(REQUESTOR_PUB_ETH_KEY), requestor_public_key=encode_hex(REQUESTOR_PUBLIC_KEY), want_to_compute_task=WantToComputeTaskFactory( provider_ethereum_public_key=encode_hex(PROVIDER_PUB_ETH_KEY), provider_public_key=encode_hex(PROVIDER_PUBLIC_KEY), ), ) self.task_to_compute_1.generate_ethsig(REQUESTOR_PRIV_ETH_KEY) self.task_to_compute_2 = TaskToComputeFactory( requestor_ethereum_public_key=encode_hex(REQUESTOR_PUB_ETH_KEY), requestor_public_key=encode_hex(REQUESTOR_PUBLIC_KEY), want_to_compute_task=WantToComputeTaskFactory( provider_ethereum_public_key=encode_hex(PROVIDER_PUB_ETH_KEY), provider_public_key=encode_hex(PROVIDER_PUBLIC_KEY), ), ) self.task_to_compute_2.generate_ethsig(REQUESTOR_PRIV_ETH_KEY) def create_subtask_results_accepted_list( # pylint: disable=no-self-use self, task_to_compute_1, task_to_compute_2, subtask_1_signed_by=REQUESTOR_PRIVATE_KEY, subtask_2_signed_by=REQUESTOR_PRIVATE_KEY, ) -> list: subtask_results_accepted_1 = SubtaskResultsAcceptedFactory( payment_ts="2018-02-05 12:00:16", report_computed_task=ReportComputedTaskFactory( task_to_compute=task_to_compute_1 ) ) sign_message(subtask_results_accepted_1, subtask_1_signed_by) subtask_results_accepted_2 = SubtaskResultsAcceptedFactory( payment_ts="2018-02-05 12:00:16", report_computed_task=ReportComputedTaskFactory( task_to_compute=task_to_compute_2 ) ) sign_message(subtask_results_accepted_2, subtask_2_signed_by) subtask_results_accepted_list = [ subtask_results_accepted_1, subtask_results_accepted_2, ] return subtask_results_accepted_list def test_that_if_the_same_values_given_method_should_return_true(self): subtask_results_accepted_list = self.create_subtask_results_accepted_list(self.task_to_compute_1, self.task_to_compute_2) result = are_keys_and_addresses_unique_in_message_subtask_results_accepted(subtask_results_accepted_list) assert_that(result).is_true() def test_that_if_different_requestor_ethereum_public_keys_are_given_method_should_return_false(self): self.task_to_compute_2.requestor_ethereum_public_key = encode_hex(DIFFERENT_REQUESTOR_PUB_ETH_KEY) self.task_to_compute_2.generate_ethsig(DIFFERENT_REQUESTOR_PRIV_ETH_KEY) subtask_results_accepted_list = self.create_subtask_results_accepted_list(self.task_to_compute_1, self.task_to_compute_2) result = are_keys_and_addresses_unique_in_message_subtask_results_accepted(subtask_results_accepted_list) assert_that(result).is_false() def test_that_if_different_requestor_public_keys_are_given_method_should_return_false(self): self.task_to_compute_2.requestor_public_key = encode_hex(DIFFERENT_REQUESTOR_PUBLIC_KEY) self.task_to_compute_2.generate_ethsig(REQUESTOR_PRIV_ETH_KEY) subtask_results_accepted_list = self.create_subtask_results_accepted_list(self.task_to_compute_1, self.task_to_compute_2) result = are_keys_and_addresses_unique_in_message_subtask_results_accepted(subtask_results_accepted_list) assert_that(result).is_false() def test_that_if_different_provider_ethereum_public_keys_are_given_method_should_return_false(self): self.task_to_compute_2.want_to_compute_task.provider_ethereum_public_key = encode_hex(DIFFERENT_PROVIDER_PUB_ETH_KEY) self.task_to_compute_2.generate_ethsig(REQUESTOR_PRIV_ETH_KEY) subtask_results_accepted_list = self.create_subtask_results_accepted_list(self.task_to_compute_1, self.task_to_compute_2) result = are_keys_and_addresses_unique_in_message_subtask_results_accepted(subtask_results_accepted_list) assert_that(result).is_false() def test_that_if_different_provider_public_keys_are_given_method_should_return_false(self): self.task_to_compute_2.want_to_compute_task.provider_public_key = encode_hex(DIFFERENT_PROVIDER_PUBLIC_KEY) self.task_to_compute_2.generate_ethsig(REQUESTOR_PRIV_ETH_KEY) subtask_results_accepted_list = self.create_subtask_results_accepted_list(self.task_to_compute_1, self.task_to_compute_2) result = are_keys_and_addresses_unique_in_message_subtask_results_accepted(subtask_results_accepted_list) assert_that(result).is_false() def test_that_if_messages_are_signed_by_different_requestors_method_should_return_false(self): subtask_results_accepted_list = self.create_subtask_results_accepted_list( self.task_to_compute_1, self.task_to_compute_2, subtask_2_signed_by=DIFFERENT_REQUESTOR_PRIVATE_KEY, ) result = are_subtask_results_accepted_messages_signed_by_the_same_requestor(subtask_results_accepted_list) assert_that(result).is_false()