当前位置: 首页 > 知识库问答 >
问题:

指向新合同版本的国家仍然试图废除旧合同?

汪永春
2023-03-14

我有一个场景,我已经将我的义务从V1升级到V2,并成功指向正确的V2合约。接下来,我试图对这些升级后的V2国家做一个< code>SettleObligation。当在< code > CollectSignatureFlow 中形成并发送事务时,在我的< code>isGreaterThan方法中发现了一个< code > Java . lang . nosuchmethoderror ,该方法在契约中的< code>verifySettle命令中调用。

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

想了解:

  1. 合约是否通过文件名而不是包名来引用函数位置?并且编译合约 v1.jar后它是不可更改的?
  2. 为什么 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

共有2个答案

公羊浩气
2023-03-14

在柯特林中,每个文件都被编译为一个 JVM 级类。名为福巴.kt 的文件将成为名为福巴的类。

因此,当您将一个顶级函数从一个文件移动到另一个文件时,该文件的名称将被嵌入到编译后的代码中,这样的更改不是二进制兼容的,即使它是源代码兼容的。

不幸的是,这是所有软件开发隐藏的复杂性之一——源代码编译器解析符号范围的方式并不总是与运行时链接器相同。它在每种语言和运行时都会发生,尽管JetBrains的人有办法在很长时间内修复它,如果他们选择这样做的话。抱歉。您必须将函数移回来,或者提供一个别名(查看< code>@JvmName注释)。

沈华皓
2023-03-14

resolveTransactionFlow.kt(沿着链走时)将按顺序循环以获取Tx,同时验证它。在这种情况下,需要所有旧的合同代码(作为cordapp)都存在,否则您将无法解析链的来源。

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))
    }
 类似资料:
  • 我有一个使用SLF4J的项目,SLF4J也使用log4j1.2.17(默认情况下,没有在pom.xml中指定任何版本)。 嗨,我想升级Log4J版本到2.17.1,有关于如何操作的信息https://logging.apache.org/log4j/2.x/maven-artifacts.html 我在pom中添加了以下代码。xml文件 然后,当我检查Maven依赖项时,它会在我的项目中显示旧版本

  • 在的下载站点上,它说你可以克隆它来更新它。我下载它是为了安装它,但我开始真正进入并希望从现在开始每次更新它时都克隆它。我想我找到了我们需要克隆它的地方,经过了大量的搜索和比平时更少的文档。如果我是对的,它就在目录中,就在我的眼皮底下! 我是不是没有找到难以捉摸的文件夹,还是团队直到最新版本发布后才让您直接克隆它?例如,我知道VirtualBox就是这样做的。 我知道这有点重复这个问题,但我尝试了它

  • 我已经读过这个线程,com.android.support库必须使用完全相同的版本规范和许多其他类似的线程,但没有一个答案解决了我的问题。 错误:-

  • 问题内容: 我正在编写一个使用QuickFIX / J作为FIX框架的应用程序。我的对方向我发送了FIX版本4.4 的消息,但只有某些字段(组件)的版本为5.0 现在,我正在尝试实现可以​​阅读此组件的功能。 这个 不起作用!消息来自版本4.4,这就是为什么只需要a 而不是版本5.0的原因 如果我尝试这个 我收到以下错误: 这是因为我得到4.4场,但要像对待4.4版本。看这里 也许有人可以帮我…

  • 问题内容: 有没有一种方法可以使用一个版本的JRE构建我的应用程序,但是我的源代码符合另一个版本? 我想使用1.6在本地调试我的应用程序,因为OS X 1.6优于1.4.2,但是由于向后兼容的原因,我们实际上使用1.4.2进行了调试。 问题答案: 您可以通过“运行配置”选项进行管理。创建一个新的Run Configuration-> Java Application,然后您可以指定要用于该配置的J

  • 在新版本的Hadoop中有一种方法。http://hadoop.apache.org/docs/current/api/org/apache/hadoop/fs/filesystem.html#concat%28org.apache.hadoop.fs.path,%20org.apache.hadoop.fs.path[]%29 此方法在Hadoop 1.0.4中不可用,我能做些什么来使用它吗?