如何在Solana区块链生成keyphrase、mnemonic、seed、私钥与公钥
Solana官方规范密钥生成方案(兼容Mainnet/Testnet/Devnet)
注:Solana三类网络采用完全一致的密钥算法体系,同一套合法密钥可直接在三个网络下使用,不存在网络专属的密钥格式,网络差异仅体现在链上状态、RPC接入点、代币规则层面,密钥本身无网络区分。
核心概念定义
- keyphrase:即密钥短语,属于BIP39规范中的可选加盐字段,非必填项,用于为助记词派生增加额外安全因子,用户可自定义设置
- mnemonic:即助记词,由固定数量通用单词组成的人类可读字符串,是密钥备份的核心载体,遵循BIP39标准
- seed:即种子,是助记词(搭配可选keyphrase)通过固定算法派生的定长二进制串,是所有密钥对派生的根输入
- private key:即私钥,Solana体系下为32字节Ed25519签名私钥,常见展示形式包括64字符十六进制串、64字节(32字节私钥+32字节公钥拼接)Base58编码串(主流钱包通用导出格式)
- public key:即公钥,也常被称为钱包地址,是私钥通过Ed25519曲线运算生成的32字节公开标识,常见展示形式为Base58编码字符串,长度在32-44字符区间
标准生成流程
1. 生成合规mnemonic(助记词)
- 熵源要求:必须使用密码学安全随机数生成器(CSPRNG)生成128位(对应12词助记词)或256位(对应24词助记词)随机熵,禁止使用普通伪随机源
- 校验位计算:对生成的熵做SHA256哈希,取哈希值前(熵长度/32)位作为校验位,拼接在原始熵末尾
- 单词映射:将带校验位的比特串按每11位为一组拆分,每组映射到BIP39标准英文词表(Solana官方默认使用英文词表,其他语言词表兼容性差不推荐)中的对应单词,按顺序拼接得到完整助记词
- 有效性校验方法:
- 检查助记词单词数是否为12/15/18/21/24的合法长度
- 检查所有单词均存在于对应语言的BIP39官方词表中
- 反向将助记词拆解为比特串后,校验末尾校验位与重新计算的SHA256结果完全匹配
2. 结合keyphrase生成seed(种子)
- 输入参数:上一步生成的mnemonic字符串、自定义keyphrase(无设置则传空字符串)
- 派生规则:使用PBKDF2-HMAC-SHA512算法,迭代次数固定为2048次,派生输出长度固定64字节;算法盐值固定为字符串
mnemonic拼接用户输入的keyphrase - 输出结果:得到64字节长度的二进制seed
- 有效性校验方法:相同mnemonic和keyphrase输入,多次派生必须得到完全一致的64字节seed,过程无随机因子
3. 派生Solana标准路径private key(私钥)
- 派生路径:遵循SLIP-0010 Ed25519派生规范,Solana官方标准派生路径为
m/44'/501'/0'/0',其中501为SLIP-0044规范分配给Solana的币种编号,非标准路径生成的私钥无法被主流钱包识别 - 派生逻辑:以64字节seed为根输入,沿指定派生路径做SLIP-0010子密钥派生,最终得到32字节Ed25519私钥
- 有效性校验方法:
- 私钥原始长度必须为32字节
- 私钥不能为全0字节,不能落在Ed25519曲线定义的弱私钥取值范围内
4. 计算public key(公钥/地址)
- 计算逻辑:将32字节私钥输入Ed25519曲线点乘运算,得到对应的32字节公钥点,序列化后即为原始公钥
- 编码规则:原始32字节公钥使用Bitcoin风格Base58字母表(剔除0、O、I、l等易混淆字符)编码,得到用户可见的地址字符串
- 有效性校验方法:
- 公钥原始长度必须为32字节,Base58解码后长度校验通过
- 公钥对应的Ed25519曲线点必须在合法曲线上,不属于小阶子群等非法点范围
- 使用私钥对任意随机消息签名后,该公钥可正常通过签名验签逻辑
跨网络使用说明
- 符合上述规范生成的密钥对,无需任何格式修改即可直接在Mainnet、Testnet、Devnet三个网络下使用
- 同一公钥在不同网络下的余额、资产、交易记录完全独立,由对应网络的节点单独维护,与密钥本身无关
- Testnet、Devnet的水龙头测试代币仅在对应网络有效,无法跨网络流通到主网
官方CLI校验操作
可使用Solana官方命令行工具做密钥有效性、网络可用性验证:
# 本地生成符合官方规范的全新密钥对 solana-keygen new --outfile ~/.config/solana/id.json # 校验指定私钥文件合法性,输出对应公钥地址 solana-keygen pubkey ~/.config/solana/id.json # 通过助记词恢复密钥对,验证助记词有效性 solana-keygen recover 'prompt:?key=0/0' --outfile recover_key.json # 切换网络环境 solana config set --url mainnet-beta # 切主网 solana config set --url testnet # 切测试网 solana config set --url devnet # 切开发网 # 查询当前网络下公钥余额,能正常返回结果即代表密钥在该网络可用 solana balance <你的公钥地址>
内容的提问来源于stack exchange,提问作者Obot Ernest
相关产品推荐
相关产品推荐

