访问单个或一小部分现金状态时,计划流量失败



设置一个场景的最佳方法是什么?在这个场景中,发行了一个单一的FungibleAsset(如Cash.State(,并且许多计划流预计会以不同的金额消耗它?虽然我理解CashSelection实现有助于创建更改,但它是否适用于多个计划流同时访问状态的场景?例如,如果存在一个100美元的现金状态,并且设置了50个ScheduledFlow,每个消耗2美元,我们如何避免公证人意外发现一个已经消耗的状态?

当多个流在单个节点上背靠背启动并针对单个或一小组状态时,也会出现类似的异常。我在开放源代码corda 3.3上运行,Java版本1.8.0_131,在Linux上运行。

这是我看到的例外:

[警告]2018-11-12T18:53:03422Z[节点线程-2]流[1ecbfdff-a0b6-4e0e-94d1-95c432822a02].run-流已完成异常{}net.corda.core.flows.NotaryException:无法公证交易2DF6E03F64B7445A449191EDBEF70B3054BCF37F541A2FBA012A63FB8F5DEA53:一个或多个输入状态已在的另一事务中使用net.corda.core.flows.NotaryFlow$Service.call(NotaryFlow.kt:149(~[corda-core-3.3-corda.jar:?]在net.corda.core.flows.NotaryFlow$Service.call(NotaryFlow.kt:133(~[corda-core-3.3-corda.jar:?]在net.corda.node.services.statemachine.FlowStateMachineImpl.run(FlowStateMachineImpl.kt:96([corda-node-3.3-corda.jar:?]net.corda.node.services.statemachine.FlowStateMachineImpl.run(FlowStateMachineImpl.kt:44([corda-node-3.3-corda.jar:?]co.paralleluniverse.fibers.Fiber.run1(Fiber.java:1092([quasar-core-0.7.9-jdk8.罐:0.7.9]co.paralleuniverse.fibers.Fiber.exec(Fiber.java:788([quasar-core-0.7.9-jdk8.罐:0.7.9]co.parallelunverse.fibers.RunnableFiberTask.doExec(RunnableFiberTask.java:100([quasar-core-0.7.9-jdk8.罐:0.7.9]co.parallelunverse.fibers.RunnableFiberTask.run(RunnableFiberTask.java:91([quasar-core-0.7.9-jdk8.罐:0.7.9]java.util.concurrent.Executors$RunnableAdapter.call(Executitors.java:511([?:1.8.0_192]java.util.concurrent.FFutureTask.run(FutureTask.java:266([?:1.8.0_192]在java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180([?:1.8.0_192]java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293([?:1.8.0_192]java.util.concurrent.ThreadPoolExecutiator.runWorker(ThreadPoolExecutiator.java:1149([?:1.8.0_192]java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624([?:1.8.0_192]net.corda.node.putilities.AffinityExecutitor$ServiceAffinityExecutor$1$thread$1.run(AffinityExecutor.kt:62([corda-node-3.3-corda.jar:?]

平台提供了一种软锁定机制,以防止多个流试图同时花费相同的FungibleAsset。在NodeVaultService.tryLockFungibleStatesForSpending中,我们有以下行:

softLockReserve(lockId, claimedStates.map { it.ref }.toNonEmptySet())

你能更新你的问题以显示你是如何从保险库中检索FungibleAsset的吗?

最新更新