java xrpl 4j-如何保存私钥

cbwuti44  于 2023-06-28  发布在  Java
关注(0)|答案(1)|浏览(166)

我正在查看xrpl4j的java编码示例。
他们都创建新的帐户,以演示传输,帐户信息检索等.
这是通过首先生成随机种子然后导出密钥对来完成的,例如:

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

然后,您可以使用coldWalletKeyPair.privateKey()获取私钥
我试图在后端持久化生成的私钥以备将来的交易,但没有看到任何方法可以做到这一点。
在服务器(生成私钥的服务器)上持久化生成的私钥的正确方法是什么?
我已经尝试序列化私钥,但得到一个不可序列化的错误,并且在控制台中打印私钥(当然)显示它是编辑的。我还查看了xrpl 4j代码,以了解在试图提取私钥的过程中发生了什么,但没有找到方法。
下面是我正在做的尝试序列化私钥(我省略了异常处理代码):

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)

更新:
看看xrpl 4j. crypto. keys,除了@PeterMmm使用Kryo的解决方案外,我还找到了另一种方法:

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(byteArr));
dsf9zpds

dsf9zpds1#

也许使用kyro(我不测试读取的私钥是否可用)

Seed sd = Seed.ed25519Seed();
KeyPair coldWalletKeyPair = sd.deriveKeyPair();
System.err.println(coldWalletKeyPair.privateKey());

Kryo kryo = new Kryo();
kryo.setInstantiatorStrategy(new DefaultInstantiatorStrategy(new StdInstantiatorStrategy()));
kryo.register(PrivateKey.class);
kryo.register(UnsignedByteArray.class);
kryo.register(UnsignedByte.class);
kryo.register(ArrayList.class);

Output output = new Output(new FileOutputStream("file.bin"));
kryo.writeObject(output, coldWalletKeyPair.privateKey());
output.close();

Input input = new Input(new FileInputStream("file.bin"));
PrivateKey privateKey = kryo.readObject(input, PrivateKey.class);
input.close();

System.err.println(privateKey.equals(coldWalletKeyPair.privateKey()));

相关问题