def sync_from_primary_validators_initial_block(*, primary_validator): """ Sync from the primary validators initial block (seed_block_identifier or root_account_file_hash) Invoked when self (confirmation validator): - is first being initialized - has a blockchain that is out of sync with the PV """ try: self_configuration = get_self_configuration(exception_class=RuntimeError) download_root_account_file(url=primary_validator.root_account_file) self_configuration.root_account_file = get_root_account_file_url() self_configuration.root_account_file_hash = get_file_hash(settings.ROOT_ACCOUNT_FILE_PATH) self_configuration.seed_block_identifier = primary_validator.seed_block_identifier self_configuration.save() sync_accounts_table_to_root_account_file() except Exception as e: logger.exception(e) raise RuntimeError(e) rebuild_cache(head_block_hash=get_initial_block_identifier()) send_confirmation_block_history_request()
def test_sync_with_primary_validator(confirmation_validator_configuration): self_configuration = confirmation_validator_configuration primary_validator = self_configuration.primary_validator sync_from_primary_validators_initial_block( primary_validator=primary_validator, ) self_configuration.refresh_from_db() assert self_configuration.root_account_file == get_root_account_file_url()
def get_root_account_file(self, value=None): """ Get root account file from user """ valid = False while not valid: if self.unattended: root_account_file = value else: root_account_file = input( 'Enter root account file URL (required): ') if not root_account_file: self._error('root_account_file required') continue try: url_validator = URLValidator(schemes=['http', 'https']) url_validator(root_account_file) except ValidationError: self._error('Invalid URL') continue if Path(root_account_file).suffix != '.json': self._error('JSON file required') continue try: download_root_account_file(url=root_account_file) except Exception as e: capture_exception(e) logger.exception(e) self.stdout.write( self.style.ERROR(f'Error downloading {root_account_file}')) self.stdout.write(self.style.ERROR(e)) continue file_hash = get_file_hash(settings.ROOT_ACCOUNT_FILE_PATH) if not self.required_input['head_block_hash']: self.required_input['head_block_hash'] = file_hash self_address = format_address( ip_address=self.required_input.get('ip_address'), port=self.required_input.get('port'), protocol=self.required_input.get('protocol'), ) root_account_file = get_root_account_file_url(address=self_address) self.required_input.update({ 'root_account_file': root_account_file, 'root_account_file_hash': file_hash }) valid = True