Corda在单个流程调用中返回多个事务()

时间:2018-06-11 12:22:30

标签: corda

我有一方需要读取状态列表(例如DEAL STATE),然后遍历列表以找出匹配的记录。如果匹配,我们需要通过组合匹配的字段来创建新的输出状态。

因此,一旦在循环内执行匹配,我们就可以得到输入和输出状态列表。

但我对收集其他方的签名感到困惑,因为每个记录的交易对手都会有所不同。另外,如何在单流调用方法中调用多个事务的最终流程?

@joel,另一个问题 - 假设outputstate1个参与者说A,B,C和outputstate2参与者是B,C,D,即B& C参与了2笔交易。因此,在匹配状态循环中,当我们制作流程图时,签名者将是A,B,C,D。但是当我们调用CollectSignaturesFlow时,我们需要传递每个部分签名的trxn和会话。那么如何传递对应于trxn的会话?

1 个答案:

答案 0 :(得分:2)

以下是我们如何收集每个州的签名的示例:

val flowSessionMap = mutableMapOf<Party, FlowSession>()

val fullySignedTransactions = matchingStates.forEach { matchingState ->
    val requiredSigners: List<Party> = TODO("Derive this from the matching state somehow.")
    val signedTransaction: SignedTransaction = TODO("Build transaction.")

    val sessions = requiredSigners.map { signer ->
        flowSessionMap.getOrPut(signer) {
            initiateFlow(signer)
        }
    }

    val fullySignedTransaction = subFlow(CollectSignaturesInitiatingFlow(
        signedTransaction, sessions)
    )
}

CollectSignaturesInitiatingFlow的定义如下:

@InitiatingFlow
class CollectSignaturesInitiatingFlow(val signedTransaction: SignedTransaction, val sessions: List<FlowSession>): FlowLogic<SignedTransaction>() {
    override fun call(): SignedTransaction {
        return subFlow(CollectSignaturesFlow(signedTransaction, sessions))
    }
}

CollectSignaturesInitiatingFlow的响应者定义如下:

@InitiatedBy(CollectSignaturesInitiatingFlow::class)
class CollectSignaturesInitiatingFlowResponder(val otherPartyFlow: FlowSession) : FlowLogic<SignedTransaction>() {
    @Suspendable
    override fun call(): SignedTransaction {
        val signTransactionFlow = object : SignTransactionFlow(otherPartyFlow) {
            override fun checkTransaction(stx: SignedTransaction) {
                TODO("Check the transaction here.")
            }
        }

        return subFlow(signTransactionFlow)
    }
}

请注意:

  • 我们要小心每个对方只创建一个会话。从Corda 3开始,如果流程为每个交易对手创建多个会话,则会引发错误
  • 我们正在CollectSignaturesFlow中将CollectSignaturesInitiatingFlow的电话打包。为什么?在Corda中,有两种类型的流:Initiating和内联。每个Initiating流实例都有一个唯一的ID,而每个内联流都会继承将其称为子流的流的ID。从Corda 3开始,如果针对相同的流ID调用响应者两次,则抛出异常。通过在CollectSignaturesFlowCollectSignaturesInitiatingFlow流程)中包装Initiating(内联流),我们为每次收集签名的尝试创建一个新的流ID,并且不会抛出任何异常

完成签名后的交易后,您可以循环调用FinalityFlow

for (transaction in fullySignedTransactions) {
    subFlow(FinalityFlow(transaction))
}