docs: def get_consensus_hashes(cls, impl, working_dir, start_block_height=None, end_block_height=None, db_con=None, completeness_check=True):
          """
          Read all consensus hashes into memory.  They're write-once read-many,
          so no need to worry about cache-coherency.
          """
          if (start_block_height is None and end_block_height is not None) or (start_block_height is not None and end_block_height is None):
              raise ValueError("Need either both or neither start/end block height")
  
          we_opened = False
          if db_con is not None:
              con = db_con
  
          else:
              assert impl and working_dir, 'Need impl and working_dir if db_con is not given'
              con = cls.db_open(impl, working_dir)
              we_opened = True
  
          range_query = ''
          range_args = ()
  
          if start_block_height and end_block_height:
              range_query += ' WHERE block_id >= ? AND block_id < ?'
              range_args += (start_block_height,end_block_height)
  
          query = 'SELECT block_id,consensus_hash FROM snapshots' + range_query + ';'
          args = range_args
  
          rows = cls.db_query_execute(con, query, range_args, verbose=False)
          ret = {}
          block_min = None
          block_max = None
  
          for r in rows:
              block_id = int(r['block_id'])
              ret[block_id] = r['consensus_hash']
  
              if block_min is None or block_min > block_id:
                  block_min = block_id
  
              if block_max is None or block_max < block_id:
                  block_max = block_id
  
          if we_opened:
              con.close()
         
          if completeness_check:
              # sanity check
              for i in range(block_min,block_max+1):
                  ch = ret.get(i, None)
  
                  assert ch is not None, 'Missing consensus hash for {}'.format(i)
                  assert isinstance(ret[i], (str,unicode)), 'consensus hash for {} is type {}'.format(i, type(ret[i]))
  
          return ret