用 Java 离线生成 Solana 钱包地址:完整实战与代码示例

·

钱包安全从“离线”开始,一篇教你用 Java 为 Solana 批量创建 HD 钱包(分层确定性钱包) 的落地指南。

目录


为什么离线生成 Solana 地址

关键词:Solana、离线钱包、Java、助记词、私钥、BIP44

预备知识:BIP32/39/44 不需 3 分钟

BIP32(HD Wallet)

一个 seed 产出一颗树,树上挂无数 keypair;移植备份只需抄下 seed 即可。
核心词:种子、层级、私钥派生

BIP39(助记词)

把繁琐的 64 位 hex seed 转成 12/24 个英文单词,例如:

soldier dish answer treat exhibit blade diary glory arrange shoe ocean card

BIP44(路径标准)

给树上每一层赋予含义:

m / purpose' / coin_type' / account' / change / address_index

Solana 的 coin_type' = 501,固定位数写出即可。


工程准备

Maven 单一核心依赖:

<dependency>
    <groupId>com.portto.solana</groupId>
    <artifactId>web3</artifactId>
    <version>0.1.3</version>
</dependency>

常见编译错误“Current compiler ABI version 1.1.15 / File ABI version 1.6.0”


实现细节

1. 助记词 → Seed

String mnemonic = "soldier dish answer treat exhibit blade diary glory arrange shoe ocean card";
byte[] seed = MnemonicUtils.generateSeed(mnemonic, "");

2. 用 BIP44 派生 10 个地址

SolanaBip44 solana = new SolanaBip44();
for (int i = 0; i < 10; i++) {
    HdKeyGenerator gen = new HdKeyGenerator();
    HdAddress m = gen.getAddressFromSeed(seed, new SolanaCoin());
    HdAddress account = gen.getAddress(m,
            solana.getPurpose(),   // 44'
            true);                 // hardened
    // 继续向下展开 change / index,得到第 i 个私钥
    byte[] priv = account.getPrivateKey().getKeyBytes();
    ...
}

3. 私钥 → Solana 地址

Solana 原生使用 Base58 格式:

Account acc = new Account(priv);
String address = acc.getPublicKey().toBase58(); // 2Hyaw6rryApLpffVYZxvT2BTAAARoJzoCBSs6Zy3bVow

完整运行代码(可直接复制)

package demo.solana;

import com.portto.solana.web3.Account;
import com.portto.solana.web3.wallet.*;

import org.web3j.crypto.MnemonicUtils;

public class OfflineSolGen {
    public static void main(String[] args) {
        String mnemonic = "soldier dish answer treat exhibit blade diary glory arrange shoe ocean card";
        byte[] seed = MnemonicUtils.generateSeed(mnemonic, "");

        SolanaBip44 solanaBip44 = new SolanaBip44();
        HdKeyGenerator hd = new HdKeyGenerator();

        for (int i = 0; i < 10; i++) {
            HdAddress root = hd.getAddressFromSeed(seed, solanaBip44.getDefaultCoin());
            HdAddress accHD = hd.derive(root, 44, true)
                                .derive(501, true)       // Solana coin type
                                .derive(0, true)
                                .derive(0, false)
                                .derive(i, false);

            byte[] privKey = accHD.getPrivateKey().getKeyBytes();
            Account acc = new Account(privKey);
            System.out.printf("地址%d:%s%n私钥%d:%s%n", i, acc.getPublicKey(), i, acc.getSecretKey());
        }
    }
}
/*
控制台示例输出
地址0:2Hyaw6rryApLpffVYZxvT2BTAAARoJzoCBSs6Zy3bVow
私钥0:3WWsrp38veGfPJcdfmPDwGwqgaGGFQ7uZrk61rcYCbGyKjFXLYWid6CJgBUXTA8Ls2vSS8gMGhjtFrGSLYuAtZ4D
...
*/

高阶玩法

当你不再需要重复工程环节时,👉 解锁一键脚本生成离线地址大全 轻松提高批量效率。


常见问题 FAQ

1. 助记词能否在多台电脑共用?

可以。任意符合 BIP44 的钱包只要输入同一套 助记词 即可复原所有 地址与私钥。不要在联网设备输入助记词!

2. Maven 还是 Gradle 更稳?

实测 Maven 依赖下载更快。若使用 Gradle,确保仓库中能够解析 com.portto.solana:web3:0.1.3

3. 基址路径 0'/0'/i0'/1'/i 有何区别?

4. Base58 私钥直存安全吗?

Base58 便于抄写,但仍建议:

5. 如何验证地址确实由该私钥而来?

复制“地址”及“私钥”后,可在任意脱机脚本中执行:

assert new Account(privateKeyBase58).getPublicKey().toBase58().equals(address);

比对即可,无需浏览器插件。


关键词回顾:Solana、离线地址、Java、BIP39、BIP44、助记词、Base58、私钥派生、批量生成。祝开发顺利,钱包常冷!