def process_block_queue(): """ Process block queue - this is for primary validators only """ with cache.lock(BLOCK_QUEUE_CACHE_LOCK_KEY): block_queue = cache.get(BLOCK_QUEUE) if block_queue: cache.set(BLOCK_QUEUE, [], None) for block in block_queue: is_valid, sender_account_balance = is_block_valid(block=block) if not is_valid: continue existing_accounts, new_accounts = get_updated_accounts( sender_account_balance=sender_account_balance, validated_block=block) update_accounts_cache(existing_accounts=existing_accounts, new_accounts=new_accounts) update_accounts_table(existing_accounts=existing_accounts, new_accounts=new_accounts) confirmation_block, head_block_hash = sign_block_to_confirm_and_update_head_block_hash( block=block, existing_accounts=existing_accounts, new_accounts=new_accounts) add_valid_confirmation_block(confirmation_block=confirmation_block) send_confirmation_block_to_all_confirmation_validators.delay( confirmation_block=confirmation_block)
def process_confirmation_block_queue(): """ Process confirmation block queue - this is for confirmation validators only Ran after: - initial sync with primary validator - receiving confirmation block from the primary validator """ self_configuration = get_self_configuration(exception_class=RuntimeError) head_block_hash = cache.get(HEAD_BLOCK_HASH) confirmation_block = get_queued_confirmation_block(block_identifier=head_block_hash) while confirmation_block: block = confirmation_block['block'] is_valid, sender_account_balance = is_block_valid(block=block) if not is_valid: send_invalid_block_to_banks(confirmation_block=confirmation_block) return existing_accounts, new_accounts = get_updated_accounts( sender_account_balance=sender_account_balance, validated_block=block ) if not updated_balances_match( confirmation_block['updated_balances'], format_updated_balances(existing_accounts, new_accounts) ): send_invalid_block_to_banks(confirmation_block=confirmation_block) return update_accounts_cache( existing_accounts=existing_accounts, new_accounts=new_accounts ) update_accounts_table( existing_accounts=existing_accounts, new_accounts=new_accounts ) confirmation_block, head_block_hash = sign_block_to_confirm_and_update_head_block_hash( block=block, existing_accounts=existing_accounts, new_accounts=new_accounts ) delete_queued_confirmation_block(block_identifier=confirmation_block['message']['block_identifier']) add_valid_confirmation_block(confirmation_block=confirmation_block) if self_configuration.daily_confirmation_rate: handle_bank_confirmation_services.delay( block=block, self_account_number=self_configuration.account_number ) send_confirmation_block_to_banks(confirmation_block=confirmation_block) confirmation_block = get_queued_confirmation_block(block_identifier=head_block_hash)
def test_confirmation_block_history_post( client, confirmation_block_data, signed_confirmation_block_history_request): add_valid_confirmation_block(confirmation_block=confirmation_block_data) response = client.post_json( reverse('confirmation_block_history-list'), signed_confirmation_block_history_request, expected=HTTP_200_OK, ) assert response == signed_confirmation_block_history_request
def test_block_chain_view(client, confirmation_validator_configuration, confirmation_block_data): add_valid_confirmation_block(confirmation_block=confirmation_block_data) response = client.get_json( reverse('meta/block_chain'), expected=HTTP_200_OK, ) assert response['block_chain']['0'] == confirmation_block_data
def test_valid_confirmation_blocks_view(client, block_identifier, confirmation_block_data): add_valid_confirmation_block(confirmation_block=confirmation_block_data) response = client.get_json( reverse('meta/valid_confirmation_blocks'), expected=HTTP_200_OK, ) assert response['valid_confirmation_blocks'][ f'{VALID_CONFIRMATION_BLOCK}:{block_identifier}'] == confirmation_block_data
def test_confirmation_block_valid_200(client, confirmation_block_data, block_identifier): add_valid_confirmation_block(confirmation_block=confirmation_block_data) result = client.get_json( reverse( 'confirmation_blocks-valid', args=[block_identifier], ), expected=HTTP_200_OK, ) assert result == confirmation_block_data