async def verify_proof(self, proof_req: dict, proof: dict) -> str:
LOGGER.debug('<STR_LIT>', proof_req, proof)<EOL>s_id2schema = {}<EOL>cd_id2cred_def = {}<EOL>rr_id2rr_def = {}<EOL>rr_id2rr = {}<EOL>proof_ids = proof['<STR_LIT>']<EOL>for proof_id in proof_ids:<EOL><INDENT>s_id = proof_id['<STR_LIT>']<EOL>if s_id not in s_id2schema:<EOL><INDENT>schema = json.loads(await self.get_schema(s_id))  <EOL>if not schema:<EOL><INDENT>LOGGER.debug(<EOL>'<STR_LIT>',<EOL>s_id)<EOL>raise AbsentSchema(<EOL>'<STR_LIT>'.format(s_id))<EOL><DEDENT>s_id2schema[s_id] = schema<EOL><DEDENT>cd_id = proof_id['<STR_LIT>']<EOL>if cd_id not in cd_id2cred_def:<EOL><INDENT>cred_def = json.loads(await self.get_cred_def(cd_id))  <EOL>cd_id2cred_def[cd_id] = cred_def<EOL><DEDENT>rr_id = proof_id['<STR_LIT>']<EOL>if not rr_id:<EOL><INDENT>continue<EOL><DEDENT>rr_def_json = await self._get_rev_reg_def(rr_id)<EOL>rr_id2rr_def[rr_id] = json.loads(rr_def_json)<EOL>timestamp = proof_id['<STR_LIT>']<EOL>with REVO_CACHE.lock:<EOL><INDENT>revo_cache_entry = REVO_CACHE.get(rr_id, None)<EOL>(rr_json, _) = await revo_cache_entry.get_state_json(self._build_rr_state_json, timestamp, timestamp)<EOL>if rr_id not in rr_id2rr:<EOL><INDENT>rr_id2rr[rr_id] = {}<EOL><DEDENT>rr_id2rr[rr_id][timestamp] = json.loads(rr_json)<EOL><DEDENT><DEDENT>rv = json.dumps(await anoncreds.verifier_verify_proof(<EOL>json.dumps(proof_req),<EOL>json.dumps(proof),<EOL>json.dumps(s_id2schema),<EOL>json.dumps(cd_id2cred_def),<EOL>json.dumps(rr_id2rr_def),<EOL>json.dumps(rr_id2rr)))<EOL>LOGGER.debug('<STR_LIT>', rv)<EOL>return rv<EOL>
Verify proof as Verifier. Raise AbsentRevReg if a proof cites a revocation registry
that does not exist on the distributed ledger.

:param proof_req: proof request as Verifier creates, as per proof_req_json above
:param proof: proof as HolderProver creates
:return: json encoded True if proof is valid; False if not