2017-08-30 24 views
2

在我們的用例中,我們必須將具有不同合約的兩個輸出狀態添加到事務中。我試圖在withItems的交易中添加多個狀態。我從RPC調用這個流程,但在簽署事務時拋出異常爲java.lang.IllegalArgumentException: List has more than one element.Corda:在單個事務中添加多個輸出狀態

這是怎麼了添加多個輸出狀態: -

val outputstate1 = IouState1(dataModel1, me, otherParty) 
val outputstate2 = IouState2(dataModel2, me, otherParty) 
val cmd1 = Command(IouContract1.Commands.Create(), state1.participants.map { it.owningKey }) 
val cmd2 = Command(IouContract2.Commands.Initiated(), state2.participants.map { it.owningKey }) 
val txBuilder = TransactionBuilder(TransactionType.General, notary).withItems(state1, state2, cmd1, cmd2) 
progressTracker.currentStep = VERIFYING_TRANSACTION 

// Verifying the transaction. 
txBuilder.toWireTransaction().toLedgerTransaction(serviceHub).verify() 

progressTracker.currentStep = SIGNING_TRANSACTION 
// Signing the transaction. 
val partSignedTx = serviceHub.signInitialTransaction(txBuilder) 

progressTracker.currentStep = GATHERING_SIGS 
// Send the state to the counterparty, and receive it back with their signature. 
val fullySignedTx = subFlow(CollectSignaturesFlow(partSignedTx, GATHERING_SIGS.childProgressTracker())) 

// Finalising the transaction. 
progressTracker.currentStep = FINALISING_TRANSACTION 
// Notarise and record the transaction in both parties' vaults. 
return subFlow(FinalityFlow(fullySignedTx, FINALISING_TRANSACTION.childProgressTracker())).single() 

堆棧跟蹤: -

net.corda.core.flows.FlowException: java.lang.IllegalArgumentException: List has more than one element. 
    at net.corda.core.flows.SignTransactionFlow.call(CollectSignaturesFlow.kt:202) ~[corda-core-0.14.0.jar:?] 
    at net.corda.core.flows.SignTransactionFlow.call(CollectSignaturesFlow.kt:175) ~[corda-core-0.14.0.jar:?] 
    at net.corda.core.flows.FlowLogic.subFlow(FlowLogic.kt:166) ~[corda-core-0.14.0.jar:?] 
    at com.dwlabcorda.salescontract.LOCReceiverFlow.call(LOCContractFlow.kt:107) ~[tradefinancecorda-0.1.jar:?] 
    at com.dwlabcorda.salescontract.LOCReceiverFlow.call(LOCContractFlow.kt:95) ~[tradefinancecorda-0.1.jar:?] 
    at net.corda.node.services.statemachine.FlowStateMachineImpl.run(FlowStateMachineImpl.kt:101) [corda-node-0.14.0.jar:?] 
    at net.corda.node.services.statemachine.FlowStateMachineImpl.run(FlowStateMachineImpl.kt:33) [corda-node-0.14.0.jar:?] 
    at co.paralleluniverse.fibers.Fiber.run1(Fiber.java:1067) [quasar-core-0.7.6-jdk8.jar:0.7.6] 
    at co.paralleluniverse.fibers.Fiber.exec(Fiber.java:767) [quasar-core-0.7.6-jdk8.jar:0.7.6] 
    at co.paralleluniverse.fibers.RunnableFiberTask.doExec(RunnableFiberTask.java:100) [quasar-core-0.7.6-jdk8.jar:0.7.6] 
    at co.paralleluniverse.fibers.RunnableFiberTask.run(RunnableFiberTask.java:91) [quasar-core-0.7.6-jdk8.jar:0.7.6] 
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_144] 
    at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_144] 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(Unknown Source) [?:1.8.0_144] 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source) [?:1.8.0_144] 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [?:1.8.0_144] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [?:1.8.0_144] 
    at net.corda.node.utilities.AffinityExecutor$ServiceAffinityExecutor$1$thread$1.run(AffinityExecutor.kt:69) [corda-node-0.14.0.jar:?] 
Caused by: java.lang.IllegalArgumentException: List has more than one element. 
    at kotlin.collections.CollectionsKt___CollectionsKt.single(_Collections.kt:471) ~[kotlin-stdlib-1.1.1.jar:1.1.1] 
    at com.dwlabcorda.salescontract.LOCReceiverFlow$call$signTransactionFlow$1.checkTransaction(LOCContractFlow.kt:100) ~[tradefinancecorda-0.1.jar:?] 
    at net.corda.core.flows.SignTransactionFlow.call(CollectSignaturesFlow.kt:199) ~[corda-core-0.14.0.jar:?] 
    ... 17 more 
+0

這應該沒問題。我懷疑你的問題在別處。你可以發佈剩下的流程嗎? – joel

+0

更新了整個流程的代碼。 – bakriOnFire

+0

謝謝 - 您還可以添加完整的堆棧跟蹤嗎?由於我沒有看到上述任何不良情況,我猜測問題可能出現在合同代碼中(CollectSignaturesFlow將調用)。正如Stefano所說,檢查你是否正在對你的合同中輸出的「single」進行調用。 – joel

回答

2

也許你使用的。單()投在你的合同之一,現在是拋出異常

+0

是的,我用val out = tx.outputsOfType ().single() 「發件人和收件人不能是同一個實體。」使用(out.party1!= out.party2)..我如何改變它..get(0)和get(1)拋出一個異常.. – bakriOnFire

+0

你不能使用.single(),然後創建兩個輸出輸入IouState,首先必須首先選擇是否可以輸出多個IOUState或者只輸入一個IOUState –

+0

'get(0)'不應拋出異常。你看到bakriOnFire有什麼例外? – joel