Corda竞争条件,从当前流调用其他流,但输入状态来自当前流

Corda竞争条件,从当前流调用其他流,但输入状态来自当前流,corda,Corda,这个问题是在讨论时提出的 假设我们正在实现一个贷款申请。收到LoanRequest后,Corda flow将进行HTTP调用以验证请求,我们希望根据HTTP调用的结果自动调用其他事务,即记录ApprovedLoan或RejectedLoan状态 现在这个场景中的问题是,ApprovedLoan或RejectedLoan事务需要输入状态为LoanRequest。因此,我们不能从LoanRequest流的接受者调用另一个流,因为输入状态尚未提交,从而导致竞争条件 如有任何关于如何实施的建议或示例,将

这个问题是在讨论时提出的

假设我们正在实现一个贷款申请。收到
LoanRequest
后,Corda flow将进行HTTP调用以验证请求,我们希望根据HTTP调用的结果自动调用其他事务,即记录
ApprovedLoan
RejectedLoan
状态

现在这个场景中的问题是,
ApprovedLoan
RejectedLoan
事务需要输入状态为
LoanRequest
。因此,我们不能从
LoanRequest
流的接受者调用另一个流,因为输入状态尚未提交,从而导致竞争条件

如有任何关于如何实施的建议或示例,将不胜感激


谢谢。

您需要先将
LoanRequest
事务提交到每个节点的存储中,然后在接受者中进行调用以决定是否批准或拒绝请求。您还需要使用
FlowLogic.waitForLedgerCommit
,以确保在存储
贷款请求之前不会启动批准或拒绝。下面是一个例子:

@InitiatingFlow
@StartableByRPC
class Initiator(val otherParty: Party) : FlowLogic<SignedTransaction>() {

    /**
     * The flow logic is encapsulated within the call() method.
     */
    @Suspendable
    override fun call(): SignedTransaction {
        val session = initiateFlow(otherParty)

        val fullySignedTx: SignedTransaction = TODO("Build fully signed transaction.")

        subFlow(FinalityFlow(fullySignedTx))

        session.send(fullySignedTx.id)
    }
}

@InitiatedBy(Initiator::class)
class Acceptor(val session: FlowSession) : FlowLogic<SignedTransaction>() {
    @Suspendable
    override fun call(): SignedTransaction {
        TODO("Response logic for building fully signed transaction.")

        val txId = session.receive<SecureHash>().unwrap { secureHash -> secureHash }

        waitForLedgerCommit(txId)

        val approve: Boolean = TODO("Make HTTP call to decide whether to approve or reject.")

        if (approve) {
            TODO("Response logic for building approval transaction.")
        } else {
            TODO("Response logic for building rejection transaction.")
        }
    }
}
@InitiatingFlow
@星表
类启动器(val otherParty:Party):FlowLogic(){
/**
*流逻辑封装在call()方法中。
*/
@暂停
重写趣味调用():SignedTransaction{
val会话=initiateFlow(另一方)
val fullySignedTx:SignedTransaction=TODO(“生成完全签名的事务”)
子流(最终流(fullySignedTx))
session.send(fullySignedTx.id)
}
}
@发起人(发起人::类)
类接受程序(val会话:FlowSession):FlowLogic(){
@暂停
重写趣味调用():SignedTransaction{
TODO(“用于构建完全签名事务的响应逻辑”)
val txId=session.receive().unwrap{secureHash->secureHash}
waitForLedgerCommit(txId)
val approve:Boolean=TODO(“进行HTTP调用以决定是批准还是拒绝。”)
如果(批准){
TODO(“建筑审批事务的响应逻辑”)
}否则{
TODO(“构建拒绝事务的响应逻辑”)
}
}
}