Example #1
0
def test_authenticate_xfer_invalid_signature_format(node, user2_token_wallet,
                                                    user2_address,
                                                    user1_address):
    token_authnr = TokenAuthNr(node[0].states[DOMAIN_LEDGER_ID])
    inputs = [[user2_token_wallet, user2_address, 1]]
    outputs = [[user1_address, 10], [user2_address, 10]]
    request = xfer_request(inputs, outputs)
    req_data = request.as_dict
    req_data[OPERATION]["signatures"][0] = 'INVALID_SIGNATURE'
    with pytest.raises(InvalidSignatureFormat):
        token_authnr.authenticate_xfer(req_data, AddressSigVerifier)
Example #2
0
def test_serializeForSig_XFER_PUBLIC_path(node, user2_token_wallet,
                                          user2_address, SF_token_wallet,
                                          SF_address, user1_address):
    token_authnr = TokenAuthNr(node[0].states[DOMAIN_LEDGER_ID])
    inputs = [[user2_token_wallet, user2_address, 1],
              [SF_token_wallet, SF_address, 2]]
    outputs = [[user1_address, 10], [user1_address, 10]]
    request = xfer_request(inputs, outputs)
    msg = request.as_dict
    serialize_for_sig_called = token_authnr.serializeForSig(
        msg, VALID_IDENTIFIER, None)
    assert serialize_for_sig_called == True
Example #3
0
def test_authenticate_xfer_invalid_signature_format(node, user2_token_wallet,
                                                    user2_address,
                                                    user1_address):
    token_authnr = TokenAuthNr(ACCEPTABLE_WRITE_TYPES, ACCEPTABLE_QUERY_TYPES,
                               ACCEPTABLE_ACTION_TYPES,
                               node[0].db_manager.idr_cache)
    inputs = [[user2_token_wallet, user2_address, 1]]
    outputs = [[user1_address, 10], [user2_address, 10]]
    request = xfer_request(inputs, outputs)
    req_data = request.as_dict
    req_data[OPERATION]["signatures"][0] = 'INVALID_SIGNATURE'
    with pytest.raises(InvalidSignatureFormat):
        token_authnr.authenticate_xfer(req_data, AddressSigVerifier)
Example #4
0
def test_serializeForSig_XFER_PUBLIC_path(node, user2_token_wallet,
                                          user2_address, SF_token_wallet,
                                          SF_address, user1_address):
    token_authnr = TokenAuthNr(ACCEPTABLE_WRITE_TYPES, ACCEPTABLE_QUERY_TYPES,
                               ACCEPTABLE_ACTION_TYPES,
                               node[0].db_manager.idr_cache)
    inputs = [[user2_token_wallet, user2_address, 1],
              [SF_token_wallet, SF_address, 2]]
    outputs = [[user1_address, 10], [user1_address, 10]]
    request = xfer_request(inputs, outputs)
    msg = request.as_dict
    serialize_for_sig_called = token_authnr.serializeForSig(
        msg, VALID_IDENTIFIER, None)
    assert serialize_for_sig_called == True
Example #5
0
def test_authenticate_xfer_insufficient_correct_signatures(
        node, user2_token_wallet, user2_address, user1_address, SF_address,
        SF_token_wallet):
    token_authnr = TokenAuthNr(node[0].states[DOMAIN_LEDGER_ID])
    inputs = [[user2_token_wallet, user2_address, 1],
              [SF_token_wallet, SF_address, 2]]
    outputs = [[user1_address, 10], [user2_address, 10]]
    request = xfer_request(inputs, outputs)
    req_data = request.as_dict

    # creating invalid signature in index 0
    req_data[OPERATION]["signatures"][0] = req_data[OPERATION]["signatures"][1]
    with pytest.raises(InsufficientCorrectSignatures):
        token_authnr.authenticate_xfer(req_data, AddressSigVerifier)
Example #6
0
def test_get_xfer_ser_data_success(node, user2_token_wallet, user2_address,
                                   SF_token_wallet, SF_address, user1_address):
    token_authnr = TokenAuthNr(node[0].states[DOMAIN_LEDGER_ID])
    inputs = [[user2_token_wallet, user2_address, 1],
              [SF_token_wallet, SF_address, 2]]
    outputs = [[user1_address, 10], [user1_address, 10]]
    request = xfer_request(inputs, outputs)
    msg = request.as_dict
    # This test is marked as skip because the next line does not compile.  _get_xfer_ser_data was removed from
    # TokenAuthNr or its base class without explanation or update to this test.  See TOK-317
    ser_data = token_authnr._get_xfer_ser_data(msg, VALID_IDENTIFIER)
    assert ser_data[OPERATION][INPUTS] == []
    assert ser_data[OPERATION][OUTPUTS] == msg[OPERATION][OUTPUTS]
    assert ser_data[OPERATION][EXTRA] == msg[OPERATION][EXTRA]
    assert ser_data[f.REQ_ID.nm] == msg[f.REQ_ID.nm]
Example #7
0
def test_authenticate_xfer_success(node, user2_token_wallet, user2_address,
                                   user1_address):
    token_authnr = TokenAuthNr(node[0].states[DOMAIN_LEDGER_ID])
    inputs = [[user2_token_wallet, user2_address, 1]]
    outputs = [{
        "address": user1_address,
        "amount": 10
    }, {
        "address": user2_address,
        "amount": 10
    }]
    request = xfer_request(inputs, outputs)
    req_data = request.as_dict
    correct_sigs = token_authnr.authenticate_xfer(req_data, AddressSigVerifier)
    assert len(correct_sigs) == 1
Example #8
0
def test_authenticate_xfer_insufficient_correct_signatures(
        node, user2_token_wallet, user2_address, user1_address, SF_address,
        SF_token_wallet):
    token_authnr = TokenAuthNr(ACCEPTABLE_WRITE_TYPES, ACCEPTABLE_QUERY_TYPES,
                               ACCEPTABLE_ACTION_TYPES,
                               node[0].db_manager.idr_cache)
    inputs = [[user2_token_wallet, user2_address, 1],
              [SF_token_wallet, SF_address, 2]]
    outputs = [[user1_address, 10], [user2_address, 10]]
    request = xfer_request(inputs, outputs)
    req_data = request.as_dict

    # creating invalid signature in index 0
    req_data[OPERATION]["signatures"][0] = req_data[OPERATION]["signatures"][1]
    with pytest.raises(InsufficientCorrectSignatures):
        token_authnr.authenticate_xfer(req_data, AddressSigVerifier)
Example #9
0
def test_authenticate_xfer_success(node, user2_token_wallet, user2_address,
                                   user1_address):
    token_authnr = TokenAuthNr(ACCEPTABLE_WRITE_TYPES, ACCEPTABLE_QUERY_TYPES,
                               ACCEPTABLE_ACTION_TYPES,
                               node[0].db_manager.idr_cache)
    inputs = [[user2_token_wallet, user2_address, 1]]
    outputs = [{
        "address": user1_address,
        "amount": 10
    }, {
        "address": user2_address,
        "amount": 10
    }]
    request = xfer_request(inputs, outputs)
    req_data = request.as_dict
    correct_sigs = token_authnr.authenticate_xfer(req_data, AddressSigVerifier)
    assert len(correct_sigs) == 1
def test_seller_xfer_double_spend_attempt(looper, sdk_pool_handle,  # noqa
    nodeSetWithIntegratedTokenPlugin, public_minting, sdk_wallet_client,
    seller_address, seller_token_wallet, user1_address, user2_address):
    """
    An address tries to send to send to transactions using the same UTXO,
    one of the txn gets rejected even though the amount held by the UTXO is
    greater than the sum of outputs in both txns, since one UTXO can be used
    only once
    """

    # =============
    # Declaration of helper functions.
    # =============

    def succeeded(req_resp):
        try:
            sdk_check_reply(req_resp)
            return True
        except Exception:
            return False

    def check_output_val(address, amount):
        return check_output_val_on_all_nodes(
            nodeSetWithIntegratedTokenPlugin,
            address,
            amount
        )

    def check_no_output_val(address, amount):
        with pytest.raises(AssertionError):
            check_output_val(address, amount)

    def get_seq_no_first_utxo(address):
        get_utxo_resp = send_get_utxo(
            looper,
            address,
            sdk_wallet_client,
            sdk_pool_handle
        )

        return get_utxo_resp[OUTPUTS][0]["seqNo"]

    # =============
    # Form the two xfer requests. Each request will try to spend the same UTXO.
    # =============

    user1_gets = 3
    user2_gets = 5
    seq_no = get_seq_no_first_utxo(seller_address)
    inputs = [[seller_token_wallet, seller_address, seq_no]]
    outputs1 = [
        {"address": user1_address, "amount": user1_gets},
        {"address": seller_address, "amount": seller_gets - user1_gets}
    ]
    outputs2 = [
        {"address": user2_address, "amount": user2_gets},
        {"address": seller_address, "amount": seller_gets - user2_gets}
    ]
    r1 = xfer_request(inputs, outputs1)
    r2 = xfer_request(inputs, outputs2)
    requests = [json.dumps(r.as_dict) for r in [r1, r2]]

    # =============
    # Send the two requests and wait for replies. Only one request
    # should succeed.
    # =============

    req_resp = sdk_send_signed_requests(sdk_pool_handle, requests)
    req_resp = sdk_get_replies(looper, req_resp)

    success1 = succeeded(req_resp[0])
    success2 = succeeded(req_resp[1])

    assert lxor(success1, success2)

    # =============
    # Check that the seller, user1, and user2, have the output or not.
    # =============

    if success1:
        check_output_val(seller_address, seller_gets - user1_gets)
        check_output_val(user1_address, user1_gets)
        check_no_output_val(user2_address, 0)
    else:
        check_output_val(seller_address, seller_gets - user2_gets)
        check_output_val(user2_address, user2_gets)
        check_no_output_val(user1_address, 0)