Corda 指向新合同版本的州仍然试图反序列化旧合同?

Corda 指向新合同版本的州仍然试图反序列化旧合同?,corda,Corda,我有一个场景,我已经将我的义务从V1升级到V2,并成功地指向了正确的V2合同。接下来,我尝试对这些升级的V2状态进行结算。当事务在CollectSignatureFlow中形成并发送时,在我的方法上发现一个java.lang.NoSuchMethodError大于在合同中的verifysolite命令中调用的方法 这个特定函数最初存在于包“com.example.base”中的一个文件BaseHelper.kt,在V2中,我们将该函数迁移到另一个文件MathHelper.kt,此移动不会导致任何

我有一个场景,我已经将我的义务从V1升级到V2,并成功地指向了正确的V2合同。接下来,我尝试对这些升级的V2状态进行
结算。当事务在
CollectSignatureFlow
中形成并发送时,在我的
方法上发现一个
java.lang.NoSuchMethodError
大于在合同中的
verifysolite
命令中调用的
方法

这个特定函数最初存在于包“com.example.base”中的一个文件
BaseHelper.kt
,在V2中,我们将该函数迁移到另一个文件
MathHelper.kt
,此移动不会导致任何未解析的引用,因为包是相同的

我想了解:

  • 契约是否按文件名而不是包名引用函数位置?一旦编译了
    contract-v1.jar
    ,它就不可更改了
  • 为什么V2州仍然尝试反序列化V1合同?这是通过走链条来实现的吗
  • 下面是堆栈跟踪

    [WARN ] 2018-11-13T00:05:12,777Z [Node thread-1] flow.[cd538d42-1715-4ed3-bde6-38eca94ef79f].run - Flow ended due to receiving exception {} net.corda.core.contracts.TransactionVerificationException$ContractRejection: Contract verification failed: com.example.base.BaseHelperKt.isGreaterThan(Ljava/math/BigDecimal;Ljava/math/BigDecimal;)Z, contract: com.example.contracts.ObligationContractV1, transaction: 8B8780A16D330A93A361F747B77C227442BD310C9DAAA561376DED69F580C794 at net.corda.node.services.statemachine.FlowStateMachineImpl.erroredEnd(FlowStateMachineImpl.kt:497) ~[corda-node-3.2.1847-corda.jar:?] at net.corda.node.services.statemachine.FlowStateMachineImpl.confirmNoError(FlowStateMachineImpl.kt:481) ~[corda-node-3.2.1847-corda.jar:?] at net.corda.node.services.statemachine.FlowStateMachineImpl.waitForMessage(FlowStateMachineImpl.kt:444) ~[corda-node-3.2.1847-corda.jar:?] at net.corda.node.services.statemachine.FlowStateMachineImpl.receiveInternal(FlowStateMachineImpl.kt:376) ~[corda-node-3.2.1847-corda.jar:?] at net.corda.node.services.statemachine.FlowStateMachineImpl.receive(FlowStateMachineImpl.kt:229) ~[corda-node-3.2.1847-corda.jar:?] at net.corda.node.services.statemachine.FlowSessionImpl.receive(FlowSessionImpl.kt:44) ~[corda-node-3.2.1847-corda.jar:?] at net.corda.node.services.statemachine.FlowSessionImpl.receive(FlowSessionImpl.kt:48) ~[corda-node-3.2.1847-corda.jar:?] at net.corda.core.flows.CollectSignatureFlow.call(CollectSignaturesFlow.kt:290) ~[corda-core-3.2.1847-corda.jar:?] at net.corda.core.flows.CollectSignatureFlow.call(CollectSignaturesFlow.kt:135) ~[corda-core-3.2.1847-corda.jar:?] at net.corda.core.flows.FlowLogic.subFlow(FlowLogic.kt:290) ~[corda-core-3.2.1847-corda.jar:?] at net.corda.core.flows.CollectSignaturesFlow.call(CollectSignaturesFlow.kt:114) ~[corda-core-3.2.1847-corda.jar:?] at net.corda.core.flows.CollectSignaturesFlow.call(CollectSignaturesFlow.kt:64) ~[corda-core-3.2.1847-corda.jar:?] at net.corda.core.flows.FlowLogic.subFlow(FlowLogic.kt:290) ~[corda-core-3.2.1847-corda.jar:?] at com.example.flows.flows.SettleObligation$Initiator.collectSignature(SettleObligation.kt:178) ~[obligation-1.0.jar:?] at com.example.flows.flows.SettleObligation$Initiator.call(SettleObligation.kt:87) ~[obligation-1.0.jar:?] at com.example.flows.flows.SettleObligation$Initiator.call(SettleObligation.kt:51) ~[obligation-1.0.jar:?] at net.corda.node.services.statemachine.FlowStateMachineImpl.run(FlowStateMachineImpl.kt:96) [corda-node-3.2.1847-corda.jar:?] at net.corda.node.services.statemachine.FlowStateMachineImpl.run(FlowStateMachineImpl.kt:44) [corda-node-3.2.1847-corda.jar:?] at co.paralleluniverse.fibers.Fiber.run1(Fiber.java:1092) [quasar-core-0.7.9-jdk8.jar:0.7.9] at co.paralleluniverse.fibers.Fiber.exec(Fiber.java:788) [quasar-core-0.7.9-jdk8.jar:0.7.9] at co.paralleluniverse.fibers.RunnableFiberTask.doExec(RunnableFiberTask.java:100) [quasar-core-0.7.9-jdk8.jar:0.7.9] at co.paralleluniverse.fibers.RunnableFiberTask.run(RunnableFiberTask.java:91) [quasar-core-0.7.9-jdk8.jar:0.7.9] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_181] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_181] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [?:1.8.0_181] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [?:1.8.0_181] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_181] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_181] at net.corda.node.utilities.AffinityExecutor$ServiceAffinityExecutor$1$thread$1.run(AffinityExecutor.kt:62) [corda-node-3.2.1847-corda.jar:?] Caused by: net.corda.core.CordaRuntimeException: java.lang.NoSuchMethodError: com.example.base.BaseHelperKt.isGreaterThan(Ljava/math/BigDecimal;Ljava/math/BigDecimal;)Z [INFO ] 2018-11-13T00:05:12,807Z [RxIoScheduler-2] network.PersistentNetworkMapCache.addNode - Previous node was identical to incoming one - doing nothing {} [INFO ] 2018-11-13T00:05:12,807Z [RxIoScheduler-2] network.PersistentNetworkMapCache.addNode - Done adding node with info: NodeInfo [警告]2018-11-13T00:05:12777Z[节点线程-1]流。[cd538d42-1715-4ed3-bde6-38eca94ef79f]。运行-流因接收异常{}而结束 net.corda.core.contracts.TransactionVerificationException$ContractRejection:合同验证失败:com.example.base.BaseHelperKt.isGreaterThan(Ljava/math/BigDecimal;Ljava/math/BigDecimal;)Z, 合同:com.example.contracts.ObligationContractV1,交易记录:8B8780A16D330A93A361F7477B77C227442BD310C9DAAA561376DED69F580C794 在net.corda.node.services.statemachine.FlowStateMachineImpl.erroredEnd(FlowStateMachineImpl.kt:497)~[corda-node-3.2.1847-corda.jar:?] 在net.corda.node.services.statemachine.FlowStateMachineImpl.confirmNoError(FlowStateMachineImpl.kt:481)~[corda-node-3.2.1847-corda.jar:?] 在net.corda.node.services.statemachine.FlowStateMachineImpl.waitFormMessage(FlowStateMachineImpl.kt:444)~[corda-node-3.2.1847-corda.jar:?] 在net.corda.node.services.statemachine.FlowStateMachineImpl.receiveInternal(FlowStateMachineImpl.kt:376)~[corda-node-3.2.1847-corda.jar:?] 在net.corda.node.services.statemachine.FlowStateMachineImpl.receive(FlowStateMachineImpl.kt:229)~[corda-node-3.2.1847-corda.jar:?] 在net.corda.node.services.statemachine.FlowSessionImpl.receive(FlowSessionImpl.kt:44)~[corda-node-3.2.1847-corda.jar:?] 在net.corda.node.services.statemachine.FlowSessionImpl.receive(FlowSessionImpl.kt:48)~[corda-node-3.2.1847-corda.jar:?] 在net.corda.core.flows.CollectSignatureFlow.call(CollectSignatureFlow.kt:290)~[corda-core-3.2.1847-corda.jar:?] 在net.corda.core.flows.CollectSignatureFlow.call(CollectSignatureFlow.kt:135)~[corda-core-3.2.1847-corda.jar:?] 在net.corda.core.flows.FlowLogic.subFlow(FlowLogic.kt:290)~[corda-core-3.2.1847-corda.jar:?] 在net.corda.core.flows.CollectSignaturesFlow.call(CollectSignaturesFlow.kt:114)~[corda-core-3.2.1847-corda.jar:?] 在net.corda.core.flows.CollectSignaturesFlow.call(CollectSignaturesFlow.kt:64)~[corda-core-3.2.1847-corda.jar:?] 在net.corda.core.flows.FlowLogic.subFlow(FlowLogic.kt:290)~[corda-core-3.2.1847-corda.jar:?] 在com.example.flows.flows.SettleObligation$Initiator.collectSignature(SettleObligation.kt:178)~[义务-1.0.jar:?] 在com.example.flows.flows.SettleObligation$Initiator.call(SettleObligation.kt:87)~[义务-1.0.jar:?] 在com.example.flows.flows.SettleObligation$Initiator.call(SettleObligation.kt:51)~[responsibility-1.0.jar:?] 在net.corda.node.services.statemachine.FlowStateMachineImpl.run(FlowStateMachineImpl.kt:96)[corda-node-3.2.1847-corda.jar:?] 在net.corda.node.services.statemachine.FlowStateMachineImpl.run(FlowStateMachineImpl.kt:44)[corda-node-3.2.1847-corda.jar:?] 在co.paralleluniverse.fibers.Fiber.run1(Fiber.java:1092)[quasar-core-0.7.9-jdk8.jar:0.7.9] 在co.paralleluniverse.fibers.Fiber.exec(Fiber.java:788)[quasar-core-0.7.9-jdk8.jar:0.7.9] 在co.paralleluniverse.fibers.RunnableFiberTask.doExec(RunnableFiberTask.java:100)[quasar-core-0.7.9-jdk8.jar:0.7.9] 在co.paralleluniverse.fibers.RunnableFiberTask.run(RunnableFiberTask.java:91)[quasar-core-0.7.9-jdk8.jar:0.7.9] 在java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)[?:1.8.0_181] 在java.util.concurrent.FutureTask.run(FutureTask.java:266)[?:1.8.0_181] 在java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)[?:1.8.0_181] 在java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)[?:1.8.0_181] 位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)[?:1.8.0_181] 位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)[?:1.8.0_181] 在net.corda.node.utilities.AffinityExecutor$serviceffinityExecutor$1$thread$1.run(AffinityExecutor.kt:62)[corda-node-3.2.1847-corda.jar:?] 原因:net.corda.core.cordarantimeexception:java.lang.NoSuchMethodError:com.example.base.BaseHelperKt.isGreaterThan(Ljava/math/BigDecimal;Ljava/math/BigDecimal;)Z [信息]2018-11-13T00:05:12807Z[RxIoScheduler-2]network.PersistentNetworkMapCache.addNode-上一个节点与传入的节点相同-不做任何操作{} [信息]2018-11-13T00:05:12807Z[RxIoScheduler-2]network.PersistentNetworkMapCache.addNode-完成添加节点,信息:NodeInfo
    在Kotlin中,每个文件都被编译成一个JVM级别的类。名为Foobar.kt的文件将成为名为FoobarKt的类

    因此,当您将顶级函数从一个文件移动到另一个文件时,该文件的名称会被烘焙到已编译代码中,这样的更改甚至与二进制代码不兼容
    val result = topologicalSort(newTxns)
        result.forEach {
            // For each transaction, verify it and insert it into the database. As we are iterating over them in a
            // depth-first order, we should not encounter any verification failures due to missing data. If we fail
            // half way through, it's no big deal, although it might result in us attempting to re-download data
            // redundantly next time we attempt verification.
            it.verify(serviceHub)
            serviceHub.recordTransactions(StatesToRecord.NONE, listOf(it))
        }