-
Notifications
You must be signed in to change notification settings - Fork 580
Description
🐞 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
⸻