【问题标题】:Deserialization of a protobuf object in CordaCorda 中 protobuf 对象的反序列化
【发布时间】:2021-06-22 13:27:29
【问题描述】:

我正在尝试在 Corda 流中实例化和签署 protobuf 消息;原始交易由 JavaScript 客户端创建,编码为 base64,并提交给 Corda。 Corda 节点解码、签名并转发到公共网络。

交易、签名和批准工作正常(它实际上在公共网络中执行),但在返回结果时失败并显示附加错误。

是否有任何机制可以在不破坏 [FiberDeserializationChecker] 的情况下反序列化 protobuf 事务?

提前谢谢你!

Thu Mar 25 16:43:10 UTC 2021>>> on: java.io.InvalidObjectException: Deserialization via serialization delegate
Serialization trace:
validStart (com.hedera.hashgraph.sdk.TransactionId)
transactionIds (com.hedera.hashgraph.sdk.TokenAssociateTransaction)
associateTxn (net.aochain.corda.nodes.hederaTxn.AssociateTokenFlow)
logic (net.corda.node.services.statemachine.FlowStateMachineImpl)
        at com.esotericsoftware.kryo.serializers.ObjectField.read(ObjectField.java:144)
        at com.esotericsoftware.kryo.serializers.CompatibleFieldSerializer.read(CompatibleFieldSerializer.java:145)
        at com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:813)
        at co.paralleluniverse.io.serialization.kryo.ReplaceableObjectKryo.readClassAndObject(ReplaceableObjectKryo.java:112)
        at com.esotericsoftware.kryo.serializers.CollectionSerializer.read(CollectionSerializer.java:134)
        at com.esotericsoftware.kryo.serializers.CollectionSerializer.read(CollectionSerializer.java:40)
        at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:731)
        at co.paralleluniverse.io.serialization.kryo.ReplaceableObjectKryo.readObject(ReplaceableObjectKryo.java:92)
        at com.esotericsoftware.kryo.serializers.ObjectField.read(ObjectField.java:125)
        at com.esotericsoftware.kryo.serializers.CompatibleFieldSerializer.read(CompatibleFieldSerializer.java:145)
        at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:731)
        at co.paralleluniverse.io.serialization.kryo.ReplaceableObjectKryo.readObject(ReplaceableObjectKryo.java:92)
        at com.esotericsoftware.kryo.serializers.ObjectField.read(ObjectField.java:125)
        at com.esotericsoftware.kryo.serializers.CompatibleFieldSerializer.read(CompatibleFieldSerializer.java:145)
        at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:731)
        at co.paralleluniverse.io.serialization.kryo.ReplaceableObjectKryo.readObject(ReplaceableObjectKryo.java:92)
        at com.esotericsoftware.kryo.serializers.ObjectField.read(ObjectField.java:125)
        at com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:543)
        at co.paralleluniverse.fibers.Fiber$FiberSerializer.read(Fiber.java:2156)
        at co.paralleluniverse.fibers.Fiber$FiberSerializer.read(Fiber.java:2086)
        at com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:813)
        at co.paralleluniverse.io.serialization.kryo.ReplaceableObjectKryo.readClassAndObject(ReplaceableObjectKryo.java:112)
        at net.corda.nodeapi.internal.serialization.kryo.KryoCheckpointSerializer$deserialize$1$1.invoke(KryoCheckpointSerializer.kt:92)
        at net.corda.nodeapi.internal.serialization.kryo.KryoCheckpointSerializer$deserialize$1$1.invoke(KryoCheckpointSerializer.kt:42)
        at net.corda.nodeapi.internal.serialization.kryo.KryoStreams.kryoInput(KryoStreams.kt:20)
        at net.corda.nodeapi.internal.serialization.kryo.KryoCheckpointSerializer$deserialize$1.invoke(KryoCheckpointSerializer.kt:81)
        at net.corda.nodeapi.internal.serialization.kryo.KryoCheckpointSerializer$deserialize$1.invoke(KryoCheckpointSerializer.kt:42)
        at net.corda.nodeapi.internal.serialization.kryo.KryoCheckpointSerializer$kryo$1.execute(KryoCheckpointSerializer.kt:70)
        at com.esotericsoftware.kryo.pool.KryoPoolQueueImpl.run(KryoPoolQueueImpl.java:58)
        at net.corda.nodeapi.internal.serialization.kryo.KryoCheckpointSerializer.kryo(KryoCheckpointSerializer.kt:66)
        at net.corda.nodeapi.internal.serialization.kryo.KryoCheckpointSerializer.deserialize(KryoCheckpointSerializer.kt:80)
        at net.corda.node.services.statemachine.interceptors.FiberDeserializationChecker$start$2.invoke(FiberDeserializationCheckingInterceptor.kt:103)
        at net.corda.node.services.statemachine.interceptors.FiberDeserializationChecker$start$2.invoke(FiberDeserializationCheckingInterceptor.kt:53)
        at kotlin.concurrent.ThreadsKt$thread$thread$1.run(Thread.kt:30)
Caused by: java.lang.RuntimeException: java.io.InvalidObjectException: Deserialization via serialization delegate
        at co.paralleluniverse.io.serialization.kryo.ReplaceableObjectKryo.getReplacement(ReplaceableObjectKryo.java:129)
        at co.paralleluniverse.io.serialization.kryo.ReplaceableObjectKryo.readReplace(ReplaceableObjectKryo.java:118)
        at co.paralleluniverse.io.serialization.kryo.ReplaceableObjectKryo.readObjectOrNull(ReplaceableObjectKryo.java:107)
        at com.esotericsoftware.kryo.serializers.ObjectField.read(ObjectField.java:132)
        ... 33 more
Caused by: java.io.InvalidObjectException: Deserialization via serialization delegate
        at org.threeten.bp.Instant.readResolve(Instant.java:1176)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at co.paralleluniverse.io.serialization.kryo.ReplaceableObjectKryo.getReplacement(ReplaceableObjectKryo.java:125)

【问题讨论】:

  • 我已将此转发给 R3 的一些朋友,希望他们能提供帮助。

标签: java corda hedera-hashgraph


【解决方案1】:

来自 Matt Nesbit @R3:

他们的流检查点包括不可 kryo (de)serialisable 的对象。很可能他们需要将所有静态/原生方法隐藏在可能由 CordaService 持有的 SingletonSerialiseAsToken 派生对象后面。

这可能包括他们的 protobuf 序列化器,但从这个小信息可以看出任何东西,因为他们似乎也包括 Hedera Hashgraph

如果您可以在 slack.corda.net 上分享更多信息或向我发送消息,我可以帮助您获得更多信息

【讨论】:

  • 谢谢。现在开始 Slack!
【解决方案2】:

马特和大卫的回复让我走上正确的道路。

您必须按照here 的描述创建一个新类。在我们的例子中,反序列化事件被包含在一个 API 中,当(反)序列化发生时,它会阻止从 Kyro 读取。

谢谢你们!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多