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

能否将现有Hedera ECDSA账户升级为3/3多签账户?代码报错求助

错误原因分析

  • 核心问题:privateKey1/privateKey2/privateKey3初始化异常,导致(await privateKeyX).publicKey中的publicKey为undefined,触发toBytesRaw()调用失败。
  • 次要问题:原代码签名逻辑错误——账户更新交易仅需原账户密钥(editKey)签名,新的多签密钥尚未生效,无需参与签名。

修复步骤

1. 确保私钥正确初始化

如果是从DER编码字符串加载私钥,使用Hedera SDK的PrivateKey.fromDer()方法同步加载,或异步加载时确保正确await:

// 同步加载DER编码私钥示例
const privateKey1 = PrivateKey.fromDer("你的DER编码私钥字符串1");
const privateKey2 = PrivateKey.fromDer("你的DER编码私钥字符串2");
const privateKey3 = PrivateKey.fromDer("你的DER编码私钥字符串3");

// 若从文件异步加载,需确保await后再使用
// const privateKey1 = await PrivateKey.fromDerAsync(fs.readFileSync("key1.der"));

构建公钥列表时,直接从已初始化的私钥获取公钥即可:

const multisigPublicKeys = [privateKey1.publicKey, privateKey2.publicKey, privateKey3.publicKey];
const multisigKeyList = new KeyList(multisigPublicKeys, 3);

2. 修正交易签名与执行逻辑

仅用原账户私钥签名即可提交交易,新多签密钥无需参与:

// 创建账户更新交易
const transaction = await new AccountUpdateTransaction()
    .setAccountId(AccountId.fromString(editAccount)) // 确保账户ID是有效对象
    .setKey(multisigKeyList)
    .freezeWith(client);

// 仅用原账户私钥签名
const signedTransaction = await transaction.sign(editKey);

// 提交交易并等待确认
const txResponse = await signedTransaction.execute(client);
const receipt = await txResponse.getReceipt(client);
console.log("账户多签升级状态:", receipt.status.toString());

3. 额外验证点

  • 确认editAccount已转换为AccountId对象,而非纯字符串。
  • 升级Hedera SDK到最新版本,避免旧版本的KeyList兼容性问题:
npm install @hashgraph/sdk@latest

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 12:50:10