code: def gpg_list_app_keys( blockchain_id, appname, proxy=None, wallet_keys=None, config_dir=None ):
      
  
      raise Exception("BROKEN; depends on list_mutable_data")
  
      assert is_valid_appname(appname)
  
      config_dir = get_config_dir( config_dir )
      client_config_path = os.path.join(config_dir, blockstack_client.CONFIG_FILENAME )
  
      if proxy is None:
          proxy = blockstack_client.get_default_proxy( config_path=client_config_path )
  
      key_info = []
      key_prefix = "gpg.%s." % appname
  
      # immutable data key listing (look for keys that start with 'appname:')
      immutable_listing = list_immutable_data( blockchain_id, proxy=proxy )
      if 'error' in immutable_listing:
          raise Exception("Blockstack error: %s" % immutable_listing['error'])
  
      for immutable in immutable_listing['data']:
          name = immutable['data_id']
          data_hash = immutable['hash']
          if name.startswith( key_prefix ):
              key_info.append( {
                  'keyName': name[len(key_prefix):],
                  'contentUrl': make_immutable_data_url( blockchain_id, name, data_hash )
              })
  
      # mutable data key listing (look for keys that start with 'appname:')
      # TODO: use 'accounts'
      mutable_listing = list_mutable_data( blockchain_id, proxy=proxy, wallet_keys=wallet_keys )
      if 'error' in mutable_listing:
          raise Exception("Blockstack error: %s" % mutable_listing['error'])
  
      for mutable in mutable_listing['data']:
          name = mutable['data_id']
          version = mutable['version']
          if name.startswith( key_prefix ):
              key_info.append( {
                  'keyName': name[len(key_prefix):],
                  'contentUrl': make_mutable_data_url( blockchain_id, name, version )
              })
  
      return key_info
docs: List the set of available GPG keys tagged for a given application.
      Return list of {'keyName': key name, 'contentUrl': URL to key data}
      Raise on error