code: def add_multi_sign_transaction(self, m: int, pub_keys: List[bytes] or List[str], signer: Account):
          
          for index, pk in enumerate(pub_keys):
              if isinstance(pk, str):
                  pub_keys[index] = pk.encode('ascii')
          pub_keys = ProgramBuilder.sort_public_keys(pub_keys)
          tx_hash = self.hash256()
          sig_data = signer.generate_signature(tx_hash)
          if self.sig_list is None or len(self.sig_list) == 0:
              self.sig_list = []
          elif len(self.sig_list) >= TX_MAX_SIG_SIZE:
              raise SDKException(ErrorCode.param_err('the number of transaction signatures should not be over 16'))
          else:
              for i in range(len(self.sig_list)):
                  if self.sig_list[i].public_keys == pub_keys:
                      if len(self.sig_list[i].sig_data) + 1 > len(pub_keys):
                          raise SDKException(ErrorCode.param_err('too more sigData'))
                      if self.sig_list[i].m != m:
                          raise SDKException(ErrorCode.param_err('M error'))
                      self.sig_list[i].sig_data.append(sig_data)
                      return
          sig = Sig(pub_keys, m, [sig_data])
          self.sig_list.append(sig)
docs: This interface is used to generate an Transaction object which has multi signature.
  
          :param tx: a Transaction object which will be signed.
          :param m: the amount of signer.
          :param pub_keys: a list of public keys.
          :param signer: an Account object which will sign the transaction.
          :return: a Transaction object which has been signed.