访问单个或少量现金状态时,计划的流失败

时间:2018-11-29 15:55:12

标签: corda

在发布单个FungibleAsset(例如Cash.State)并且预计会有许多计划流量以不同量使用它的情况下,设置方案的最佳方法是什么?虽然我了解CashSelection实施有助于创建更改,但它是否可以容纳多个计划的流同时访问各州的情况?例如,如果存在一个100美元的Cash.State,并且为每个消费2美元设置了50个ScheduledFlow,那么如何避免公证人意外地发现已经被消费的国家的情况?

当在单个节点上背对背启动多个流并针对单个或一小组状态时,会看到类似的异常。我正在通过CentOS Linux在Java版本1.8.0_131的开源Corda 3.3上运行。

这是我看到的例外:

  

[WARN] 2018-11-12T18:53:03,422Z [节点线程2]   flow。[1ecbfdff-a0b6-4e0e-94d1-95c432822a02] .run-流程结束于   异常{} net.corda.core.flows.NotaryException:无法公证   transaction2DFF6E03F64B7445A49191EDBEF70B3054BCF37F541A2FBA012A63FB8F5DEA53:   一个或多个输入状态已在另一笔交易中使用   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.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_192]在   java.util.concurrent.FutureTask.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.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)   [?:1.8.0_192]在   java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:624)   [?:1.8.0_192]在   net.corda.node.utilities.AffinityExecutor $ ServiceAffinityExecutor $ 1 $ thread $ 1.run(AffinityExecutor.kt:62)   [corda-node-3.3-corda.jar:?]

1 个答案:

答案 0 :(得分:0)

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

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

您能否更新您的问题以显示如何从Vault检索FungibleAsset