def decrypt_and_prove(self, sk, discrete_logs=None):
    
    # who's keeping track of discrete logs?
    if not discrete_logs:
      discrete_logs = self.discrete_logs
      
    # for all choices of all questions (double list comprehension)
    decrypted_tally = []
    decryption_proof = []
    
    for question_num in range(len(self.questions)):
      question = self.questions[question_num]
      answers = question['answers']
      question_tally = []
      question_proof = []

      for answer_num in range(len(answers)):
        # do decryption and proof of it
        plaintext, proof = sk.prove_decryption(self.tally[question_num][answer_num])

        # look up appropriate discrete log
        question_tally.append(discrete_logs[plaintext])
        question_proof.append(proof)
        
      decrypted_tally.append(question_tally)
      decryption_proof.append(question_proof)
    
    return decrypted_tally, decryption_proof
Returns the DiffOpcodeGenerator class used for generating opcodes.
dataset/ETHPy150Open benadida/helios-server/helios/workflows/homomorphic.py/Tally.decrypt_and_prove--crossover with--dataset/ETHPy150Open reviewboard/reviewboard/reviewboard/diffviewer/opcode_generator.py/get_diff_opcode_generator_class