如何在Solana中创建HD钱包及派生子钱包?
Solana 网络 HD 钱包及子钱包派生实现方案
Solana 采用 Ed25519 签名曲线,以太坊生态常用的 hdkey 包仅支持 secp256k1 曲线,无法直接复用,需要搭配支持 Ed25519 曲线的 HD 派生库实现。
前置依赖
需要安装3个npm包,其中@solana/web3.js为你已经在使用的基础库:
npm install @solana/web3.js bip39 ed25519-hd-key
核心实现逻辑
- Solana 遵循 SLIP-0044 规范,分配的币种编号为
501,标准派生路径格式为m/44'/501'/<账户索引>'/<变更索引>'/<地址索引>',和你之前使用的以太坊HD钱包路径结构逻辑完全一致,仅需把以太坊对应的币种编号60替换为501即可。 - 整体流程和以太坊HD钱包逻辑对齐:助记词转主种子 → 按指定路径派生子密钥 → 取32字节私钥种子传入你已掌握的
Keypair.fromSeed()方法,即可得到对应子钱包的密钥对。
基础实现代码
const solanaWeb3 = require('@solana/web3.js'); const bip39 = require('bip39'); const { derivePath } = require('ed25519-hd-key'); // 助记词,和以太坊生态助记词格式完全兼容 const mnemonic = "seed sock milk ..."; // 第一个子钱包对应派生路径,和以太坊m/44'/60'/0'/0/0的逻辑对齐 const path = "m/44'/501'/0'/0'/0'"; async function createSolanaHDWallet() { // 助记词转主种子,和以太坊实现逻辑一致 const seed = await bip39.mnemonicToSeed(mnemonic); // 按指定路径派生Ed25519子密钥 const derivedKey = derivePath(path, seed.toString('hex')).key; // 直接调用你已经掌握的fromSeed方法生成Solana密钥对 const keypair = solanaWeb3.Keypair.fromSeed(derivedKey); console.log('子钱包地址:', keypair.publicKey.toBase58()); return keypair; } createSolanaHDWallet();
批量派生多子钱包方法
如果需要生成同根密钥下的多个子钱包,只需要递增路径最后一位的地址索引即可:
// 批量生成前N个子钱包 async function batchCreateChildWallets(mnemonic, count = 10) { const seed = await bip39.mnemonicToSeed(mnemonic); const walletList = []; for (let i = 0; i < count; i++) { const path = `m/44'/501'/0'/0'/${i}'`; const derivedKey = derivePath(path, seed.toString('hex')).key; const keypair = solanaWeb3.Keypair.fromSeed(derivedKey); walletList.push({ index: i, path, address: keypair.publicKey.toBase58(), keypair }); } return walletList; }
注意事项
- 所有派生路径层级必须使用硬化派生(即路径编号后加
'符号),这是Ed25519 HD派生的规范要求,和以太坊支持非硬化地址层级的写法有区别。 - Phantom、Solflare等主流Solana钱包均默认兼容上述标准派生路径,生成的地址可以直接导入这些钱包使用。
- 如果你已经提前生成了根种子,不需要再走助记词转换步骤,直接把根种子转成hex格式传入
derivePath方法即可完成子密钥派生。
内容的提问来源于stack exchange,提问作者mikemaccana
相关产品推荐
相关产品推荐

