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)
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
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
Exemplo n.º 4
0
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
Exemplo n.º 5
0
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
Exemplo n.º 6
0
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