code: def _request_pre_prepare_for_prepare(self, three_pc_key) -> bool:
          
  
          if three_pc_key in self.prePreparesPendingPrevPP:
              self.logger.debug('{} not requesting a PRE-PREPARE since already found '
                                'stashed for {}'.format(self, three_pc_key))
              return False
  
          if len(
                  self.preparesWaitingForPrePrepare[three_pc_key]) < self.quorums.prepare.value:
              self.logger.debug(
                  '{} not requesting a PRE-PREPARE because does not have'
                  ' sufficient PREPAREs for {}'.format(
                      self, three_pc_key))
              return False
  
          digest, state_root, txn_root, _ = \
              self.get_acceptable_stashed_prepare_state(three_pc_key)
  
          # Choose a better data structure for `prePreparesPendingFinReqs`
          pre_prepares = [pp for pp, _, _ in self.prePreparesPendingFinReqs
                          if (pp.viewNo, pp.ppSeqNo) == three_pc_key]
          if pre_prepares:
              if [pp for pp in pre_prepares if (
                  pp.digest, pp.stateRootHash, pp.txnRootHash) == (
                      digest, state_root, txn_root)]:
                  self.logger.debug('{} not requesting a PRE-PREPARE since already '
                                    'found stashed for {}'.format(self, three_pc_key))
                  return False
  
          self._request_pre_prepare(three_pc_key,
                                    stash_data=(digest, state_root, txn_root))
          return True
docs: Check if has an acceptable PRE_PREPARE already stashed, if not then
          check count of PREPAREs, make sure >f consistent PREPAREs are found,
          store the acceptable PREPARE state (digest, roots) for verification of
          the received PRE-PREPARE