Skip to content

HD 钱包创建与还原地址不一致 #188

@alijiujiu123

Description

@alijiujiu123

🐞 Issue:HD 钱包创建与还原地址不一致的问题

描述:
在使用 ethers.js v6 创建 HD 钱包时,通过 fromPhrase() 创建的主钱包与之后通过 encrypt() → fromEncryptedJson() 恢复的钱包地址不一致,导致还原的钱包与原始钱包不匹配。

🔍 复现步骤:
1. 使用以下代码创建钱包:

const mnemonic = ethers.Mnemonic.entropyToPhrase(ethers.randomBytes(32));
const basePath = "m/44'/60'/0'/0";
const baseWallet = ethers.HDNodeWallet.fromPhrase(mnemonic, null, basePath);

2.	派生出子钱包地址,输出正常。
3.	使用 HDNodeWallet.fromPhrase() → wallet.encrypt() 生成 JSON。
4.	用 ethers.Wallet.fromEncryptedJson() 还原钱包,发现还原后地址发生变化。

🧪 实际结果:
• 初始主钱包地址为:

0x91E5c2894063b5424881Fdd3469a8df2DB5AD556

•	通过加密 JSON 再还原后地址变成了:

0x1bcb34cE43C9163453a713bce9EF2faee0daC0a7

这说明使用 ethers.Wallet.fromPhrase() 和 ethers.HDNodeWallet.fromPhrase() 的行为不一致,加密和还原过程中丢失了自定义的 HD 路径设置。

✅ 期望结果:
• 使用助记词 + 路径生成的钱包应该能够完整恢复,包括 HD 路径。
• 加密和解密过程中保留原始路径 "m/44'/60'/0'/0",确保还原地址一致。
• 推荐在整个流程中统一使用 HDNodeWallet 而非 Wallet,避免路径缺失。

✅ 已解决方案:

已通过以下方法修复:

// 使用 HDNodeWallet 加密,确保路径信息写入 JSON
const wallet = ethers.HDNodeWallet.fromPhrase(mnemonic, null, basePath);
const json = await wallet.encrypt(password);

// 使用 fromEncryptedJson 恢复 HDNodeWallet
const wallet2 = await ethers.Wallet.fromEncryptedJson(json, password);
// → 返回 HDNodeWallet 实例,地址与加密前一致 ✅

📎 附录:
• 助记词(示例):

hip never boy unaware derive split abstract alley broken crisp tower medal ...

•	地址对比:
•	原地址:0x91E5c2894063b5424881Fdd3469a8df2DB5AD556
•	加密还原后地址:0x1bcb34cE43C9163453a713bce9EF2faee0daC0a7

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions