Corda 和 Corda Enterprise 节点交互时出现序列化方案错误

问题描述 投票:0回答:1

我有一个包含两个节点的网络:

  • NodeA
    运行 Corda Enterprise 3
  • NodeB
    运行 Corda(开源)3

NodeA
使用 Corda Finance CorDapp 将现金转移到
NodeB
时,我会收到
Serialization scheme not supported.
形式的例外情况。

如果 Finance CorDapp 是针对 Corda Enterprise 3.2 编译的,我会得到以下堆栈跟踪:

java.lang.UnsupportedOperationException: Serialization scheme ([636F7264610000], RPCClient) not supported.
    at net.corda.serialization.internal.SerializationFactoryImpl$schemeFor$1.apply(SerializationScheme.kt:128)
    at net.corda.serialization.internal.SerializationFactoryImpl$schemeFor$1.apply(SerializationScheme.kt:103)
    at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
    at net.corda.serialization.internal.SerializationFactoryImpl.schemeFor(SerializationScheme.kt:124)
    at net.corda.serialization.internal.SerializationFactoryImpl.access$schemeFor(SerializationScheme.kt:103)
    at net.corda.serialization.internal.SerializationFactoryImpl$deserialize$1$1.invoke(SerializationScheme.kt:134)
    at net.corda.core.serialization.SerializationFactory.withCurrentContext(SerializationAPI.kt:71)
    at net.corda.serialization.internal.SerializationFactoryImpl$deserialize$1.invoke(SerializationScheme.kt:134)
    at net.corda.serialization.internal.SerializationFactoryImpl$deserialize$1.invoke(SerializationScheme.kt:103)
    at net.corda.core.serialization.SerializationFactory.asCurrent(SerializationAPI.kt:85)
    at net.corda.serialization.internal.SerializationFactoryImpl.deserialize(SerializationScheme.kt:134)
    at net.corda.nodeapi.RPCApi$ServerToClient$Companion.fromClientMessage(RPCApi.kt:373)
    at net.corda.client.rpc.internal.RPCClientProxyHandler.artemisMessageHandler(RPCClientProxyHandler.kt:301)
    at net.corda.client.rpc.internal.RPCClientProxyHandler.access$artemisMessageHandler(RPCClientProxyHandler.kt:75)
    at net.corda.client.rpc.internal.RPCClientProxyHandler$initSessions$1.invoke(RPCClientProxyHandler.kt:509)
    at net.corda.client.rpc.internal.RPCClientProxyHandler$initSessions$1.invoke(RPCClientProxyHandler.kt:75)
    at net.corda.client.rpc.internal.RPCClientProxyHandlerKt$sam$org_apache_activemq_artemis_api_core_client_MessageHandler$0.onMessage(RPCClientProxyHandler.kt)
    at org.apache.activemq.artemis.core.client.impl.ClientConsumerImpl.callOnMessage(ClientConsumerImpl.java:1002)
    at org.apache.activemq.artemis.core.client.impl.ClientConsumerImpl.access$400(ClientConsumerImpl.java:50)
    at org.apache.activemq.artemis.core.client.impl.ClientConsumerImpl$Runner.run(ClientConsumerImpl.java:1125)
    at org.apache.activemq.artemis.utils.actors.OrderedExecutor.doTask(OrderedExecutor.java:42)
    at org.apache.activemq.artemis.utils.actors.OrderedExecutor.doTask(OrderedExecutor.java:31)
    at org.apache.activemq.artemis.utils.actors.ProcessorBase.executePendingTasks(ProcessorBase.java:66)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.activemq.artemis.utils.ActiveMQThreadFactory$1.run(ActiveMQThreadFactory.java:118)
    at ✽.And node PartyB vault contains total cash of 100 GBP(compatibility/resources/features/interoperability.feature:15)

如果 Finance CorDapp 是针对 Corda(开源)3.3 编译的,我会得到以下堆栈跟踪:

[WARN ] 2018-10-02T11:06:54,096Z [Thread-1 (ActiveMQ-client-global-threads)] messaging.RPCServer.clientArtemisMessageHandler - Inbound RPC failed {actor_id=corda, actor_owningIdentity=O=PartyB, L=London, C=GB, actor_store_id=NODE_CONFIG, invocation_id=ae1b8b8d-682a-4181-acba-45c061188531, invocation_timestamp=2018-10-02T11:06:54.094Z, session_id=85154c4f-cdfa-4f76-b888-51d8f862c3b1, session_timestamp=2018-10-02T11:06:54.050Z}
java.lang.UnsupportedOperationException: Serialization scheme not supported.
        at net.corda.nodeapi.internal.serialization.NotSupportedSerializationScheme.doThrow(SerializationScheme.kt:19) ~[corda-node-api-3.2-corda.jar:?]
        at net.corda.nodeapi.internal.serialization.NotSupportedSerializationScheme.deserialize(SerializationScheme.kt:23) ~[corda-node-api-3.2-corda.jar:?]
        at net.corda.nodeapi.internal.serialization.SerializationFactoryImpl$deserialize$1$1.invoke(SerializationScheme.kt:111) ~[corda-node-api-3.2-corda.jar:?]
        at net.corda.core.serialization.SerializationFactory.withCurrentContext(SerializationAPI.kt:66) ~[corda-core-3.2-corda.jar:?]
        at net.corda.nodeapi.internal.serialization.SerializationFactoryImpl$deserialize$1.invoke(SerializationScheme.kt:111) ~[corda-node-api-3.2-corda.jar:?]
        at net.corda.nodeapi.internal.serialization.SerializationFactoryImpl$deserialize$1.invoke(SerializationScheme.kt:86) ~[corda-node-api-3.2-corda.jar:?]
        at net.corda.core.serialization.SerializationFactory.asCurrent(SerializationAPI.kt:80) ~[corda-core-3.2-corda.jar:?]
        at net.corda.nodeapi.internal.serialization.SerializationFactoryImpl.deserialize(SerializationScheme.kt:111) ~[corda-node-api-3.2-corda.jar:?]
        at net.corda.node.services.messaging.RPCServer.clientArtemisMessageHandler(RPCServer.kt:571) [corda-node-3.2-corda.jar:?]
        at net.corda.node.services.messaging.RPCServer.access$clientArtemisMessageHandler(RPCServer.kt:79) [corda-node-3.2-corda.jar:?]
        at net.corda.node.services.messaging.RPCServer$createRpcConsumer$1.invoke(RPCServer.kt:196) [corda-node-3.2-corda.jar:?]
        at net.corda.node.services.messaging.RPCServer$createRpcConsumer$1.invoke(RPCServer.kt:79) [corda-node-3.2-corda.jar:?]
        at net.corda.node.services.messaging.RPCServerKt$sam$MessageHandler$5b9bfc45.onMessage(RPCServer.kt) [corda-node-3.2-corda.jar:?]
        at org.apache.activemq.artemis.core.client.impl.ClientConsumerImpl.callOnMessage(ClientConsumerImpl.java:997) [artemis-core-client-2.2.0.jar:2.2.0]
        at org.apache.activemq.artemis.core.client.impl.ClientConsumerImpl.access$400(ClientConsumerImpl.java:49) [artemis-core-client-2.2.0.jar:2.2.0]
        at org.apache.activemq.artemis.core.client.impl.ClientConsumerImpl$Runner.run(ClientConsumerImpl.java:1120) [artemis-core-client-2.2.0.jar:2.2.0]
        at org.apache.activemq.artemis.utils.actors.OrderedExecutor.doTask(OrderedExecutor.java:42) [artemis-commons-2.2.0.jar:2.2.0]
        at org.apache.activemq.artemis.utils.actors.OrderedExecutor.doTask(OrderedExecutor.java:31) [artemis-commons-2.2.0.jar:2.2.0]
        at org.apache.activemq.artemis.utils.actors.ProcessorBase$ExecutorTask.run(ProcessorBase.java:53) [artemis-commons-2.2.0.jar:2.2.0]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_171]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_171]
        at java.lang.Thread.run(Thread.java:748) [?:1.8.0_171]
[WARN ] 2018-10-02T11:06:54,162Z [Thread-0 (ActiveMQ-client-global-threads)] messaging.RPCServer.bindingRemovalArtemisMessageHandler - Detected RPC client disconnect on address rpc.client.corda.4301680594427178011, scheduling for reaping {}

如何解决这个问题?

corda
1个回答
1
投票

这是 Corda 3 中的一个错误,其中:

  • 针对 Corda Enterprise 3 编译的 CorDapp 无法在 Corda 3 节点上运行
  • 针对 Corda 3 编译的 CorDapp 无法在 Corda Enterprise 3 节点上运行

这是因为 Corda 3 使用 Kryo 进行 RPC,而 Corda Enterprise 3 使用 AMQP 进行 RPC。

有两种解决方法:

  • 编译 CorDapp 两次 - 一次用于 Corda 3 节点,一次用于 Corda Enterprise 3 节点
  • 升级到 Corda 4
© www.soinside.com 2019 - 2024. All rights reserved.