Corda 4.0:如何检索旧 CorDapp 执行的交易?

时间:2021-05-09 03:42:49

标签: spring-boot corda

我们正在使用 Corda 4.0 和 Springboot Web 服务器构建 POC。

以下是用于构建 POC 的 Corda 平台、Springboot 服务器和其他基本依赖项的版本-

cordaReleaseGroup=net.corda
cordaVersion=4.0
gradlePluginsVersion=4.0.45
kotlinVersion=1.2.71
junitVersion=4.12
quasarVersion=0.7.10
spring_version = '4.3.11.RELEASE'
spring_boot_version = '2.0.2.RELEASE'
spring_boot_gradle_plugin_version = '2.1.1.RELEASE'
jvmTarget = "1.8"
log4jVersion =2.11.2
platformVersion=4
slf4jVersion=1.7.25
nettyVersion=4.1.22.Final

为POC开发的CorDapp有四个节点-

Notary Node
Provider Company Node
Consumer Company 1 Node
Consumer Company 1 Sub Contact Node

在节点数据库中,上述节点之间有 10 个交易流。

后来由于新的需求,新的字段被添加到事务架构中,Cordapp 被重新创建并分发到节点。

当 Web 应用程序运行时,我无法查看 10 个事务。

节点抛出以下错误:

Sun May 09 07:32:28 IST 2021>>> [ERROR] 07:50:17+0530 [Node thread-1] proxies.ExceptionSerialisingRpcOpsProxy.log - Error during RPC invocation [errorCode=1dl0tb4, moreInformationAt=https://errors.corda.net/OS/4.0/1dl0tb4] {actor_id=user1, actor_owning_identity=OU=Company, O=MyComp, L=Houston, C=US, actor_store_id=NODE_CONFIG, fiber-id=10000001, flow-id=3a590f6a-9920-4381-ab53-1e4b5465b1c8, invocation_id=f309aad5-487a-4b04-be6d-f90f83c7def7, invocation_timestamp=2021-05-09T02:20:16.497Z, origin=user1, session_id=909b6b61-f9fc-4a0f-b521-a0c2eed39516, session_timestamp=2021-05-09T02:11:19.347Z, thread-id=197}

[ERROR] 07:50:17+0530 [Node thread-1] proxies.ExceptionSerialisingRpcOpsProxy.log - Error during RPC invocation [errorCode=1uso5y8, moreInformationAt=https://errors.corda.net/OS/4.0/1uso5y8] {actor_id=user1, actor_owning_identity=OU=Company, O=MyComp, L=Houston, C=US, actor_store_id=NODE_CONFIG, fiber-id=10000001, flow-id=3a590f6a-9920-4381-ab53-1e4b5465b1c8, invocation_id=f309aad5-487a-4b04-be6d-f90f83c7def7, invocation_timestamp=2021-05-09T02:20:16.497Z, origin=user1, session_id=909b6b61-f9fc-4a0f-b521-a0c2eed39516, session_timestamp=2021-05-09T02:11:19.347Z, thread-id=197}
[ERROR] 07:50:17+0530 [Node thread-1] proxies.ExceptionSerialisingRpcOpsProxy.log - Error during RPC invocation [errorCode=1uso5y8, moreInformationAt=https://errors.corda.net/OS/4.0/1uso5y8] {actor_id=user1, actor_owning_identity=OU=Company, O=MyComp, L=Houston, C=US, actor_store_id=NODE_CONFIG, fiber-id=10000001, flow-id=3a590f6a-9920-4381-ab53-1e4b5465b1c8, invocation_id=f309aad5-487a-4b04-be6d-f90f83c7def7, invocation_timestamp=2021-05-09T02:20:16.497Z, origin=user1, session_id=909b6b61-f9fc-4a0f-b521-a0c2eed39516, session_timestamp=2021-05-09T02:11:19.347Z, thread-id=197}
[ERROR] 07:50:17+0530 [Node thread-1] proxies.ExceptionSerialisingRpcOpsProxy.log - Error during RPC invocation [errorCode=1uso5y8, moreInformationAt=https://errors.corda.net/OS/4.0/1uso5y8] {actor_id=user1, actor_owning_identity=OU=Company, O=MyComp, L=Houston, C=US, actor_store_id=NODE_CONFIG, fiber-id=10000001, flow-id=3a590f6a-9920-4381-ab53-1e4b5465b1c8, invocation_id=f309aad5-487a-4b04-be6d-f90f83c7def7, invocation_timestamp=2021-05-09T02:20:16.497Z, origin=user1, session_id=909b6b61-f9fc-4a0f-b521-a0c2eed39516, session_timestamp=2021-05-09T02:11:19.347Z, thread-id=197}

节点日志显示以下错误:

          Mandatory property bndArea of local type is not present in remote type - did someone remove a property from the schema without considering old clients?
W 07:50:19 119 ThrowableSerializer.fromProxy - Unexpected exception de-serializing throwable: net.corda.core.node.services.VaultQueryException. Converting to CordaRuntimeException.
java.lang.reflect.InvocationTargetException: null
        at sun.reflect.GeneratedConstructorAccessor63.newInstance(Unknown Source) ~[?:?]
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.8.0_271]
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[?:1.8.0_271]
        at net.corda.serialization.internal.amqp.custom.ThrowableSerializer.fromProxy(ThrowableSerializer.kt:71) ~[corda-serialization-4.0.jar:?]
        at net.corda.serialization.internal.amqp.custom.ThrowableSerializer.fromProxy(ThrowableSerializer.kt:14) ~[corda-serialization-4.0.jar:?]
        at net.corda.serialization.internal.amqp.CustomSerializer$Proxy.readObject(CustomSerializer.kt:179) ~[corda-serialization-4.0.jar:?]
        at net.corda.serialization.internal.amqp.DeserializationInput.readObject$serialization(DeserializationInput.kt:182) ~[corda-serialization-4.0.jar:?]
        at net.corda.serialization.internal.amqp.DeserializationInput.readObjectOrNull$serialization(DeserializationInput.kt:147) ~[corda-serialization-4.0.jar:?]
        at net.corda.serialization.internal.amqp.DescribedTypeReadStrategy.readProperty(ComposableTypePropertySerializer.kt:202) ~[corda-serialization-4.0.jar:?]
        at net.corda.serialization.internal.amqp.ComposableTypePropertySerializer.readProperty(ComposableTypePropertySerializer.kt) ~[corda-serialization-4.0.jar:?]
        at net.corda.serialization.internal.amqp.ComposableObjectReader$readObject$$inlined$ifThrowsAppend$lambda$1.invoke(ObjectSerializer.kt:140) ~[corda-serialization-4.0.jar:?]
        at net.corda.serialization.internal.amqp.ComposableObjectReader$readObject$$inlined$ifThrowsAppend$lambda$1.invoke(ObjectSerializer.kt:122) ~[corda-serialization-4.0.jar:?]
        at kotlin.sequences.TransformingSequence$iterator$1.next(Sequences.kt:149) ~[kotlin-stdlib-1.2.71.jar:1.2.71-release-64 (1.2.71)]
        at net.corda.serialization.internal.amqp.ComposableObjectReader.readObject(ObjectSerializer.kt:219) ~[corda-serialization-4.0.jar:?]
        at net.corda.serialization.internal.amqp.ComposableObjectSerializer.readObject(ObjectSerializer.kt:91) ~[corda-serialization-4.0.jar:?]
        at net.corda.serialization.internal.amqp.CustomSerializer$Proxy.readObject(CustomSerializer.kt:178) ~[corda-serialization-4.0.jar:?]
        at net.corda.serialization.internal.amqp.DeserializationInput.readObject$serialization(DeserializationInput.kt:182) ~[corda-serialization-4.0.jar:?]
        at net.corda.serialization.internal.amqp.DeserializationInput.readObjectOrNull$serialization(DeserializationInput.kt:147) ~[corda-serialization-4.0.jar:?]
        at net.corda.serialization.internal.amqp.DeserializationInput$deserialize$1.invoke(DeserializationInput.kt:124) ~[corda-serialization-4.0.jar:?]
        at net.corda.serialization.internal.amqp.DeserializationInput.des(DeserializationInput.kt:99) ~[corda-serialization-4.0.jar:?]
        at net.corda.serialization.internal.amqp.DeserializationInput.deserialize(DeserializationInput.kt:119) ~[corda-serialization-4.0.jar:?]
        at net.corda.serialization.internal.amqp.AbstractAMQPSerializationScheme.deserialize(AMQPSerializationScheme.kt:225) ~[corda-serialization-4.0.jar:?]
        at net.corda.serialization.internal.SerializationFactoryImpl$deserialize$1$1.invoke(SerializationScheme.kt:102) ~[corda-serialization-4.0.jar:?]
        at net.corda.core.serialization.SerializationFactory.withCurrentContext(SerializationAPI.kt:72) ~[corda-core-4.0.jar:?]
        at net.corda.serialization.internal.SerializationFactoryImpl$deserialize$1.invoke(SerializationScheme.kt:102) ~[corda-serialization-4.0.jar:?]
        at net.corda.serialization.internal.SerializationFactoryImpl$deserialize$1.invoke(SerializationScheme.kt:70) ~[corda-serialization-4.0.jar:?]
        at net.corda.core.serialization.SerializationFactory.asCurrent(SerializationAPI.kt:86) ~[corda-core-4.0.jar:?]
        at net.corda.serialization.internal.SerializationFactoryImpl.deserialize(SerializationScheme.kt:102) ~[corda-serialization-4.0.jar:?]
        at net.corda.nodeapi.RPCApi$ServerToClient$Companion.fromClientMessage(RPCApi.kt:378) ~[corda-node-api-4.0.jar:?]
        at net.corda.client.rpc.internal.RPCClientProxyHandler.artemisMessageHandler(RPCClientProxyHandler.kt:309) ~[corda-rpc-4.0.jar:?]
        at net.corda.client.rpc.internal.RPCClientProxyHandler.access$artemisMessageHandler(RPCClientProxyHandler.kt:75) ~[corda-rpc-4.0.jar:?]
        at net.corda.client.rpc.internal.RPCClientProxyHandler$initSessions$1.invoke(RPCClientProxyHandler.kt:519) ~[corda-rpc-4.0.jar:?]
<============-> 93% EXECUTING [28m 52s]
> :server:compComp
        at net.corda.client.rpc.internal.RPCClientProxyHandlerKt$sam$org_apache_activemq_artemis_api_core_client_MessageHandler$0.onMessage(RPCClientProxyHandler.kt) ~[corda-rpc-4.0.jar:?]
        at org.apache.activemq.artemis.core.client.impl.ClientConsumerImpl.callOnMessage(ClientConsumerImpl.java:1002) ~[artemis-core-client-2.6.2.jar:2.6.2]
        at org.apache.activemq.artemis.core.client.impl.ClientConsumerImpl.access$400(ClientConsumerImpl.java:50) ~[artemis-core-client-2.6.2.jar:2.6.2]
        at org.apache.activemq.artemis.core.client.impl.ClientConsumerImpl$Runner.run(ClientConsumerImpl.java:1125) ~[artemis-core-client-2.6.2.jar:2.6.2]
        at org.apache.activemq.artemis.utils.actors.OrderedExecutor.doTask(OrderedExecutor.java:42) ~[artemis-commons-2.6.2.jar:2.6.2]
        at org.apache.activemq.artemis.utils.actors.OrderedExecutor.doTask(OrderedExecutor.java:31) ~[artemis-commons-2.6.2.jar:2.6.2]
        at org.apache.activemq.artemis.utils.actors.ProcessorBase.executePendingTasks(ProcessorBase.java:66) ~[artemis-commons-2.6.2.jar:2.6.2]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[?:1.8.0_271]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[?:1.8.0_271]
        at org.apache.activemq.artemis.utils.ActiveMQThreadFactory$1.run(ActiveMQThreadFactory.java:118) ~[artemis-commons-2.6.2.jar:2.6.2]
Caused by: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method net.corda.core.node.services.VaultQueryException.<init>, parameter description
        at net.corda.core.node.services.VaultQueryException.<init>(VaultService.kt) ~[corda-core-4.0.jar:?]
        ... 43 more
E 08:07:59 74 [dispatcherServlet].log - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is net.corda.core.CordaRuntimeException] with root cause
net.corda.core.CordaRuntimeException: null

问题: 是否可以检索具有旧架构的事务?请指导

更新

我正在使用以下代码从保管库中检索记录:

val vaultStatesAndRefs = services.proxy.vaultQueryBy<State>().states
val vaultStates = vaultStatesAndRefs.map { it.state.data }
resultset = vaultStates.map { it.toJson() }.toString()

1 个答案:

答案 0 :(得分:0)

一些建议:

您如何运行架构查询?我好像没有在这里看到。

如果您仍在构建 Corda 4,请注意 Corda 5 将于今年晚些时候发布,而我们目前使用的是 4.8,因此可能值得尝试升级。

如果您正在寻找有关构建应用程序和更新依赖项的指南,请查看 cordapp 模板:https://github.com/corda/cordapp-template-kotlin

现在就如何查询而言,您可能想在流中查询您的架构,看看它是否以您期望的方式存储?

你应该能够在你的流程中加入这样的东西(假设它是一个线性状态)

            List<UUID> listOfLinearIds = Arrays.asList(stateLinearId.getId());
            QueryCriteria queryCriteria = new QueryCriteria.LinearStateQueryCriteria(null, listOfLinearIds);
            Vault.Page results = getServiceHub().getVaultService().queryBy(IOUState.class, queryCriteria);
            StateAndRef inputStateAndRefToSettle = (StateAndRef) results.getStates().get(0);
            IOUState inputStateToSettle = (IOUState) ((StateAndRef) results.getStates().get(0)).getState().getData();

一些资源:

相关问题