You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

xrpl4j:后端持久化生成私钥的正确实现方案

XRPL4J私钥持久化问题及解决方案

问题背景

查看xrpl4j的Java示例代码时,发现所有示例均通过生成随机Seed并派生密钥对来创建新账户,以此演示转账、账户信息查询等功能,示例代码如下:

Seed sd = Seed.ed25519Seed();
KeyPair coldWalletKeyPair = sd.deriveKeyPair();

通过coldWalletKeyPair.privateKey()可获取私钥,但后端持久化私钥时遇到以下问题:

  • 使用Java标准序列化会抛出NotSerializableException异常
  • 控制台打印私钥会被脱敏,且源码中无直接提取私钥的直观方法

最初尝试的序列化代码及报错

尝试用Java标准序列化实现私钥持久化,代码如下:

public byte[] serializeKeyPair(PrivateKey key) throws Exception {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutputStream os =  new ObjectOutputStream(bos);
    os.writeObject(key);

    byte[] res = bos.toByteArray();

    os.close();
    bos.close();

    return res;
}


Seed sd = Seed.ed25519Seed();
KeyPair coldWalletKeyPair = sd.deriveKeyPair();

byte barr[];
barr = serializeKeyPair(coldWalletKeyPair.privateKey());

执行后抛出异常:

java.io.NotSerializableException: org.xrpl.xrpl4j.crypto.keys.PrivateKey
    at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1185)
    at java.base/java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:349)

可行解决方案

方案1:通过UnsignedByteArray提取并还原私钥

查看xrpl4j.crypto.keys源码后,找到直接操作私钥字节数组的实现方式:

Seed sd = Seed.ed25519Seed();
KeyPair coldWalletKeyPair = sd.deriveKeyPair();

// 将私钥写入文件
UnsignedByteArray unsignedByteArr = coldWalletKeyPair.privateKey().value();
byte writeByteArr[] = unsignedByteArr.toByteArray();
FileTools.writeBytesToFile(writeByteArr, "file.bin");

// 从文件读取并还原私钥
byte readByteArr[] = FileTools.readFileToBytes("file.bin");
PrivateKey privateKey = PrivateKey.of(UnsignedByteArray.of(readByteArr));

方案2:使用Kryo序列化(由@PeterMmm提供)

借助Kryo序列化框架实现私钥的持久化,规避Java标准序列化的限制。


内容的提问来源于stack exchange,提问作者Dave

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 08:03:21