Solana 文件系统钱包实战:用 solana-keygen 创建、验证与管理本地密钥对
发布时间:2026/9/14 17:36:18 作者:尧图编辑部 阅读量:1,286

Solana 文件系统钱包实战用 solana-keygen 创建、验证与管理本地密钥对【免费下载链接】solanaWeb-Scale Blockchain for fast, secure, scalable, decentralized apps and marketplaces.项目地址: https://gitcode.com/GitHub_Trending/so/solana文件系统钱包File System Wallet简称 FS wallet是 Solana 命令行工具Solana CLI中最基础、最易上手的密钥管理方式密钥对以未加密的 JSON 文件形式存放在本地文件系统中每个文件即一个钱包地址的完整私钥。本文基于 文件系统钱包官方文档 展开结合 keygen 工具源码 与 SDK 密钥对序列化实现讲清 FS wallet 的创建、公钥查看、地址核验与多地址管理全流程并深入到参数解析与底层序列化格式帮助你既会用命令、也明白命令背后发生了什么。一、什么是文件系统钱包概念与安全模型官方文档对 FS wallet 的定义是它以未加密的密钥对文件形式存在于你电脑的文件系统中。在 钱包类型总览文档 中Solana 将其与纸钱包Paper Wallet、硬件钱包Hardware Wallet并列便利性最高密钥对就是一个简单文件可以随意生成任意多个地址复制文件即可完成备份安全性最低密钥对文件是明文未加密的。文档明确警告——这是存放 SOL 的最不安全方式不建议在其中存放大额资产File system wallets are theleast securemethod of storing SOL tokens. Storing large amounts of tokens in a file system wallet isnot recommended. ——文件系统钱包文档文档还从威胁角度补充了风险分析如果你的电脑运行着恶意软件且联网恶意软件可能上传你的密钥文件并转走全部资产即使没有恶意软件对电脑拥有物理访问权限的高水平攻击者也能直接读取文件。缓解手段包括使用磁盘加密如 macOS 的 FileVault等。适用边界总结FS wallet 适合本机为唯一用户、确认无恶意软件、只存放少量测试或开发资金的场景大额资金应转向 纸钱包 离线签名 或硬件钱包方案。二、前置条件安装 Solana CLI 工具所有操作都依赖 Solana 命令行工具solana、solana-keygen。文档要求先完成 安装 Solana Command Line Tools 一节的操作。安装后可用以下命令确认 keygen 工具可用solana-keygen --version后续所有solana-keygen子命令都来自本仓库的 keygen 程序其支持verify、new、grind、pubkey、recover五个子命令见 子命令定义本文涉及的正是new、pubkey、verify三个与 FS wallet 直接相关的子命令。三、生成文件系统钱包密钥对文档给出的标准操作步骤是mkdir ~/my-solana-wallet solana-keygen new --outfile ~/my-solana-wallet/my-keypair.json--outfile指定密钥对文件的输出路径。生成完成后必须牢记文档中的安全要点该文件包含未加密的密钥对——即使你在生成时设置了密码那个密码也仅用于保护恢复用的种子短语seed phrase而不是保护文件本身。因此绝对不要把这个文件分享给他人任何拿到该文件的人都能访问发送到其公钥的全部代币对外分享时只分享公钥。3.1solana-keygen new的关键参数从 子命令参数定义 可以看到new子命令实际支持的参数比文档示例更丰富参数说明-o, --outfile FILEPATH密钥对文件的输出路径-f, --force输出文件已存在时允许覆盖-s, --silent不显示种子短语便于将输出管道给 gpg 等需要交互输入的程序--derivation-path指定 BIP44 派生路径--word-count种子短语词数12/15/18/21/24--language种子短语词表语言--bip39-passphrase/--no-bip39-passphrase是否交互输入 BIP39 口令--no-outfile不落盘仅打印种子短语与公钥用于纸钱包场景与--outfile、--silent互斥其中覆盖保护由check_for_overwrite强制如果不加--force就指向已存在的文件命令会报Refusing to overwrite 路径 without --force flag测试用例 验证了这一行为。3.2 生成流程的源码解析new子命令的执行逻辑在do_main的(new, matches)分支流程为确定输出路径有--outfile就用它有--no-outfile就不写文件两者都没有时默认写到~/.config/solana/id.json——这正是 Solana CLI 的默认钱包文件后续solana命令未显式指定--keypair时使用的就是它生成 BIP39 种子短语按--word-count选定MnemonicType生成随机Mnemonic再通过Seed::new(mnemonic, passphrase)把短语与口令passphrase混合为 64 字节种子。这就是密码只保护种子短语、不保护文件的原因——密码参与的是种子派生而写盘的是最终密钥对派生 Ed25519 密钥对默认调用keypair_from_seed从种子直接构造密钥对若提供了--derivation-path则改走keypair_from_seed_and_derivation_path进行 BIP32/BIP44 层级派生写文件并打印非--silent时会输出分隔线、公钥pubkey:以及Save this seed phrase... to recover your new keypair的种子短语提醒你抄下种子短语用于恢复。3.3 密钥对文件的真实格式很多人以为.json后缀意味着加密结构实际上格式非常简单。从write_keypair可以看到let keypair_bytes keypair.0.to_bytes(); let serialized serde_json::to_string(keypair_bytes.to_vec())?; writer.write_all(serialized.as_bytes())?;即64 字节 Ed25519 密钥对32 字节私钥 32 字节公钥的字节数组经 serde_json 序列化为一个 JSON 数字数组。所以打开my-keypair.json你会看到形如[3,42,152,144,...,195,231,133,238]没有任何加密包裹这也再次印证了 FS wallet明文私钥的安全定位。读取侧对称使用read_keypair并会通过Keypair::from_bytes校验公钥与私钥是否匹配不匹配即报keypair bytes do not specify same pubkey as derived from their secret key。四、查看公钥确认你的钱包地址生成密钥对文件后用它接收资金需要对外提供公钥wallet address。文档给出的命令solana-keygen pubkey ~/my-solana-wallet/my-keypair.json输出形如ErRr1caKzK8L8nn4xmEWtimYRiTCAZXjBtVphuZ5vMKy这就是~/my-solana-wallet/my-keypair.json中密钥对对应的公钥即你的钱包地址。从源码看pubkey子命令通过get_keypair_from_matches解析密钥来源优先级为命令行位置参数KEYPAIR文件路径、prompt://、ASK等--config配置文件中指定的keypair_path默认路径~/.config/solana/id.json。加载成功后调用try_pubkey()打印公钥若同时给了-o/--outfile则通过write_pubkey_file把公钥单独写到文件见 测试用例。注意pubkey同样支持prompt://等纸钱包输入形式但--outfile写出的只是公钥不会泄露私钥。五、用solana-keygen verify核验地址与密钥对是否匹配当你拿到一个钱包地址、想确认我是否持有它的私钥例如从备份文件恢复密钥对后文档给出的命令是solana-keygen verify PUBKEY ~/my-solana-wallet/my-keypair.json将PUBKEY替换为你的钱包地址。匹配时输出Success不匹配时输出Failed并以错误形式返回。5.1 验证的底层实现verify 子命令实现 的完整逻辑按上述优先级加载密钥对构造一个仅含一条指令的测试消息以默认Pubkey为程序 ID、序列化数字0为数据、以密钥对公钥为签名者账户的Message用密钥对真实签名该消息try_sign_message将命令参数中的 Base58 公钥解码为字节调用signature.verify(pubkey, message)验签验签通过打印Verification for public key: PUBKEY: Success否则返回Verification for public key: PUBKEY: Failed。也就是说verify不是简单地比较字符串而是用私钥现场签名 用给定公钥验签从密码学层面确认两者配对。测试用例test_verify覆盖了成功正确公钥 文件/配置文件两种来源、失败错误公钥、以及命令行密钥对文件优先于--config配置三种场景与文档描述的输出完全一致。六、管理多个文件系统钱包地址文档说明你可以创建任意多个钱包地址——只需重复生成一节的操作并确保--outfile使用新的文件名或路径即可。多个地址的典型用途是把不同用途的资产分账管理例如开发测试与日常转账分开。实践建议结合源码行为为每个地址建立独立文件文件名可直接用公钥命名grind子命令的默认行为即按公钥命名文件见 grind 写盘逻辑天然避免覆盖若误指向已有文件--force才会覆盖正常情况下命令会拒绝覆盖并提示可作为防误删的兜底需要指定某个钱包执行转账等操作时在solana命令上追加--keypair 文件路径即可无需改变全局默认钱包。七、安全小结综合文档与源码使用 FS wallet 时应遵循的基线是文件即私钥密钥对文件是未加密的 64 字节 JSON 数组序列化实现任何能读取该文件的人完全控制对应地址只分享公钥用solana-keygen pubkey 文件获取并分享地址用verify建立信任链恢复备份、导入他人声称的密钥对后先用solana-keygen verify确认与目标地址配对生成时抄下种子短语new会提示你保存 seed phrase打印逻辑日后丢失文件可用solana-keygen recover从短语恢复注意口令只保护短语不保护文件控制暴露面磁盘加密、避免在联网且不可信环境中使用该文件大额资金改用 纸钱包 或硬件钱包并参考 离线签名 流程。至此从生成solana-keygen new --outfile、查看地址solana-keygen pubkey、核验solana-keygen verify到多地址管理FS wallet 的完整生命周期及其在 Solana CLI 工具链中的实现细节都已覆盖可以安全、可控地在本地开发与测试环境中使用文件系统钱包了。【免费下载链接】solanaWeb-Scale Blockchain for fast, secure, scalable, decentralized apps and marketplaces.项目地址: https://gitcode.com/GitHub_Trending/so/solana创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考