You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IndySdk导入钱包报WalletAlreadyExistsError问题咨询

Indy SDK 钱包导入报错 WalletAlreadyExistsError 的原因及解决办法

问题原因

  1. API 使用错误:当前调用的IndySdk.importWallet是用于从备份文件创建全新钱包的接口,若指定名称的钱包已存在,必然抛出WalletAlreadyExistsError,这和你“复用已有钱包并追加数据”的需求完全不匹配。
  2. 钱包名称不匹配:代码中生成随机的imported_wallet_${uniqueIdentifier}作为钱包名,但你实际要复用的是sainopal-wallet,导致检查钱包存在性的逻辑完全失效——你检查的是随机钱包的路径,而非目标钱包sainopal-wallet的路径。
  3. 删除逻辑无效:现有代码仅删除自己生成的随机钱包,既没处理目标钱包sainopal-wallet的存在情况,也违背了你要复用该钱包的需求。

解决办法

1. 替换正确的API

要向已有钱包追加备份数据,需使用IndySdk.walletImportRecords接口,而非importWallet。前者用于向已打开的钱包导入记录,后者仅用于从备份创建新钱包。

2. 修改核心代码逻辑

调整钱包名称、存在性检查及导入流程,以下是修改后的核心代码:

const handleImport = async (selectedFile: DocumentPickerResponse | null) => {
  try {
    if (!selectedFile) {
      console.log("No file selected");
      return;
    }

    // 固定目标钱包名称为要复用的`sainopal-wallet`
    const walletName = "sainopal-wallet";
    const localFilePath = `${RNFS.DocumentDirectoryPath}/${selectedFile.name}`;

    await RNFS.moveFile(selectedFile.uri, localFilePath);

    const walletConfig: WalletConfig = config.walletConfig || {};
    const walletCredentials = { key: walletConfig.key || "" };

    // 检查目标钱包是否存在
    const existingWalletPath = `${RNFS.DocumentDirectoryPath}/.indy_client/wallet/${walletName}`;
    const walletExists = await RNFS.exists(existingWalletPath);

    if (walletExists) {
      // 钱包已存在:打开钱包并导入备份数据
      const walletHandle = await IndySdk.openWallet(walletConfig, walletCredentials);
      // 根据备份文件格式调整importFormat,通常为json
      await IndySdk.walletImportRecords(
        walletHandle,
        { path: localFilePath },
        { importFormat: "json" }
      );
      await IndySdk.closeWallet(walletHandle);
      console.log("数据已追加到现有钱包");
      Alert.alert("成功", "数据已成功追加到现有钱包!");
    } else {
      // 钱包不存在:从备份创建新钱包
      await IndySdk.importWallet(walletConfig, walletCredentials, {
        path: localFilePath,
        key: walletName,
      });
      console.log("钱包已从备份创建");
      Alert.alert("成功", "钱包已从备份成功创建!");
    }
  } catch (error) {
    console.error("导入过程出错:", error);
    Alert.alert("错误", "钱包导入/数据追加过程中发生错误。");
  }
};

3. 关键注意事项

  • 确保备份文件格式与walletImportRecords要求一致(默认支持JSON格式,需与导出时的格式匹配)。
  • 钱包配置walletConfig和凭证walletCredentials必须与原钱包完全一致,否则无法打开已有钱包。
  • 操作完成后必须调用closeWallet关闭钱包句柄,避免资源泄漏。

内容的提问来源于stack exchange,提问作者JrealFun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 09:15:21