我有一方需要读取状态列表(例如DEAL STATE),然后遍历列表以找出匹配的记录。如果匹配,我们需要通过组合匹配的字段来创建新的输出状态。
因此,一旦在循环内执行匹配,我们就可以得到输入和输出状态列表。
但我对收集其他方的签名感到困惑,因为每个记录的交易对手都会有所不同。另外,如何在单流调用方法中调用多个事务的最终流程?
@joel,另一个问题 - 假设outputstate1个参与者说A,B,C和outputstate2参与者是B,C,D,即B& C参与了2笔交易。因此,在匹配状态循环中,当我们制作流程图时,签名者将是A,B,C,D。但是当我们调用CollectSignaturesFlow时,我们需要传递每个部分签名的trxn和会话。那么如何传递对应于trxn的会话?
答案 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)
}
}
请注意:
CollectSignaturesFlow
中将CollectSignaturesInitiatingFlow
的电话打包。为什么?在Corda中,有两种类型的流:Initiating
和内联。每个Initiating
流实例都有一个唯一的ID,而每个内联流都会继承将其称为子流的流的ID。从Corda 3开始,如果针对相同的流ID调用响应者两次,则抛出异常。通过在CollectSignaturesFlow
(CollectSignaturesInitiatingFlow
流程)中包装Initiating
(内联流),我们为每次收集签名的尝试创建一个新的流ID,并且不会抛出任何异常完成签名后的交易后,您可以循环调用FinalityFlow
:
for (transaction in fullySignedTransactions) {
subFlow(FinalityFlow(transaction))
}