code: def on_view_change_start(self):
          
          self.view_changer.start_view_change_ts = self.utc_epoch()
  
          for replica in self.replicas.values():
              replica.on_view_change_start()
          logger.info("{} resetting monitor stats at view change start".format(self))
          self.monitor.reset()
          self.processStashedMsgsForView(self.viewNo)
  
          self.backup_instance_faulty_processor.restore_replicas()
          self.drop_primaries()
  
          pop_keys(self.msgsForFutureViews, lambda x: x <= self.viewNo)
          self.logNodeInfo()
          # Keep on doing catchup until >(n-f) nodes LedgerStatus same on have a
          # prepared certificate the first PRE-PREPARE of the new view
          logger.info('{}{} changed to view {}, will start catchup now'.
                      format(VIEW_CHANGE_PREFIX, self, self.viewNo))
  
          self._cancel(self._check_view_change_completed)
          self._schedule(action=self._check_view_change_completed,
                         seconds=self._view_change_timeout)
  
          # Set to 0 even when set to 0 in `on_view_change_complete` since
          # catchup might be started due to several reasons.
          self.catchup_rounds_without_txns = 0
          self.last_sent_pp_store_helper.erase_last_sent_pp_seq_no()
docs: Notifies node about the fact that view changed to let it
          prepare for election