code: def host_run(ctx, df: DataFrame, curve_type, **kwargs):
      curve = Curve25519()
      match_id = df.match_id.block_table
  
      encrypt_func = functools.partial(_encrypt_bytes, curve=curve)
      host_first_sign_match_id = match_id.mapValues(encrypt_func)
      ctx.guest.put(HOST_FIRST_SIGN, host_first_sign_match_id)
  
      dh_func = functools.partial(_diffie_hellman, curve=curve)
      guest_first_sign_match_id = ctx.guest.get(GUEST_FIRST_SIGN)
      guest_second_sign_match_id = guest_first_sign_match_id.mapValues(
          dh_func
      )
  
      guest_second_sign_match_id = (
          _flat_block_with_possible_duplicate_keys(
              guest_second_sign_match_id, duplicate_allow=True
          )
      )
      ctx.guest.put(GUEST_SECOND_SIGN, guest_second_sign_match_id)
  
      """
      host_indexer: key=(block_id, offset), value=(sample_id, (bid, offset))
      """
      host_indexer = ctx.guest.get(HOST_INDEXER)
  
      host_df = df.loc_with_sample_id_replacement(host_indexer)
  
      ctx.metrics.log_metrics(
          {"intersect_count": host_df.shape[0]},
          name="intersect_id_count",
          type="custom",
      )
  
      """
      the following just for debug, need to be delete 
      """
      # ids = [v[0] for k, v in sorted(host_df.block_table.collect())]
      # logger.debug(f"intersect ids is: {ids}")
  
      return host_df
  
file_path: FATE/python/fate/arch/protocol/psi/ecdh/_run.py
imports: import functools
  import logging
  from fate.arch.dataframe import DataFrame
  from fate_utils.psi import Curve25519
label_desc: Use image node_id 7 for calling a global function with example usage: host_run(ctx, df, curve_type) and returns: host_df