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(“构建拒绝事务的响应逻辑”)
}
}
}