<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 async def verify(self, proofRequest: ProofRequest, proof: FullProof):
 """ Verifies a proof from the prover. :param proofRequest: description of a proof to be presented (revealed attributes, predicates, timestamps for non-revocation) :param proof: a proof :return: True if verified successfully and false otherwise. """


        if proofRequest.verifiableAttributes.keys() != proof.requestedProof.revealed_attrs.keys():
            raise ValueError('Received attributes ={} do not correspond to requested={}'.format(
                proof.requestedProof.revealed_attrs.keys(), proofRequest.verifiableAttributes.keys()))

        if proofRequest.predicates.keys() != proof.requestedProof.predicates.keys():
            raise ValueError('Received predicates ={} do not correspond to requested={}'.format(
                proof.requestedProof.predicates.keys(), proofRequest.predicates.keys()))

        TauList = []
        for (uuid, proofItem) in proof.proofs.items():
            if proofItem.proof.nonRevocProof:
                TauList += await self._nonRevocVerifier.verifyNonRevocation(
                    proofRequest, proofItem.schema_seq_no, proof.aggregatedProof.cHash,
                    proofItem.proof.nonRevocProof)
            if proofItem.proof.primaryProof:
                TauList += await self._primaryVerifier.verify(proofItem.schema_seq_no,
                                                              proof.aggregatedProof.cHash,
                                                              proofItem.proof.primaryProof)

        CHver = self._get_hash(proof.aggregatedProof.CList, self._prepare_collection(TauList),
                               cmod.integer(proofRequest.nonce))

        return CHver == proof.aggregatedProof.cHash