Solana JS/Node.js 如何从本地密钥对获取账户实现空投
两个报错的根因
- 第一个
Keypair.fromSeed报错原因:fromSeed方法只接收长度为32位的Uint8Array类型的原始种子作为入参,你直接传入了助记词字符串,类型不匹配所以报错。助记词不能直接作为种子传入,需要先通过BIP39协议推导转换为对应字节数组的种子。 - 第二个
requestAirdrop报错原因:该方法第一个入参要求是PublicKey类的实例,你直接传入了base58格式的公钥字符串,方法内部调用toBase58方法时找不到对应实现,所以抛出to.toBase58 is not a function错误。另外你的代码没有捕获异步异常,所以同时触发了未处理Promise拒绝的警告。
正确实现方案
分两种常见场景,按需选择即可:
场景1:你持有钱包的助记词,需要导入生成密钥对
首先需要安装额外的依赖处理助记词推导:
npm install bip39 ed25519-hd-key @solana/web3.js
对应导入代码逻辑:
const web3 = require("@solana/web3.js"); const bip39 = require("bip39"); const { derivePath } = require("ed25519-hd-key"); // 助记词替换成你自己的 const MNEMONIC = "raw present ... 你完整的助记词"; // Solana默认的派生路径,如果你用的是其他钱包的自定义路径需要对应修改 const DERIVATION_PATH = "m/44'/501'/0'/0'"; (async () => { try { // 1. 助记词转种子 const seed = await bip39.mnemonicToSeed(MNEMONIC); // 2. 派生对应路径的密钥 const derivedSeed = derivePath(DERIVATION_PATH, seed.toString('hex')).key; // 3. 生成Keypair实例 const myKeypair = web3.Keypair.fromSeed(derivedSeed); console.log("导入的钱包公钥:", myKeypair.publicKey.toBase58()); // 4. 连接devnet发起空投 const connection = new web3.Connection(web3.clusterApiUrl('devnet'), 'confirmed'); const airdropSignature = await connection.requestAirdrop( myKeypair.publicKey, web3.LAMPORTS_PER_SOL ); await connection.confirmTransaction(airdropSignature); console.log("空投成功,交易哈希:", airdropSignature); } catch (err) { console.error("操作失败:", err); } })();
场景2:你使用solana CLI生成的本地文件系统钱包(默认存储路径为~/.config/solana/id.json)
直接读取钱包文件的字节数组生成Keypair即可,不需要额外依赖:
const web3 = require("@solana/web3.js"); const fs = require("fs"); const path = require("path"); // 替换为你的钱包json文件实际路径 const WALLET_PATH = path.resolve(process.env.HOME, ".config/solana/id.json"); (async () => { try { // 1. 读取钱包文件生成Keypair const walletSecretKey = JSON.parse(fs.readFileSync(WALLET_PATH, "utf-8")); const myKeypair = web3.Keypair.fromSecretKey(Uint8Array.from(walletSecretKey)); console.log("导入的钱包公钥:", myKeypair.publicKey.toBase58()); // 2. 连接devnet发起空投 const connection = new web3.Connection(web3.clusterApiUrl('devnet'), 'confirmed'); const airdropSignature = await connection.requestAirdrop( myKeypair.publicKey, web3.LAMPORTS_PER_SOL ); await connection.confirmTransaction(airdropSignature); console.log("空投成功,交易哈希:", airdropSignature); } catch (err) { console.error("操作失败:", err); } })();
内容的提问来源于stack exchange,提问作者Boommeister
相关产品推荐
相关产品推荐

