问题描述
在多个响应者流中到底发生了什么?我们是否正在与多个节点通信?是否可以将多个响应者流用于其他目的?
解决方法
我想您指的是响应者流程的重载。它允许开发人员将节点配置为使用覆盖的响应者流而不是基本响应者进行响应。
您可以在此处找到更多详细信息: https://docs.corda.net/docs/corda-os/4.5/flow-overriding.html
,想象一下,您(发起人)正在申请贷款;您去了5家不同的银行(即5家响应者)。每家银行都有自己的标准来批准您的贷款申请(一家银行要求您拥有房屋作为担保,另一家银行要求您的年薪高于100,000,依此类推。)
因此,即使所有响应节点都可以使用编写responder
流的组织提供的initiating
流;他们也没有义务,实际上,响应节点有责任编写自己的responder
流版本以实现自己的业务规则。
如果收到的交易通过了这些业务规则,则响应者会批准(即签署交易);否则它将拒绝它(即抛出FlowException
)。
如前面的评论所述,您可以选择创建多个响应者流,也可以选择一个,根据存储在响应节点中的信息来实现不同的逻辑。如果您正在寻找流处理程序,那么在Corda的源代码中有多个示例,例如下面的示例(on github),您可以在其中看到不同的逻辑取决于响应节点的角色(由InitiatingFlow设置) ,在这种情况下):
class ObserverAwareFinalityFlowHandler(val otherSession: FlowSession) : FlowLogic<Unit>() {
@Suspendable
override fun call() {
val role = otherSession.receive<TransactionRole>().unwrap { it }
val statesToRecord = when (role) {
TransactionRole.PARTICIPANT -> StatesToRecord.ONLY_RELEVANT
TransactionRole.OBSERVER -> StatesToRecord.ALL_VISIBLE
}
// If states are issued to self,then ReceiveFinalityFlow does not need to be invoked.
if (!serviceHub.myInfo.isLegalIdentity(otherSession.counterparty)) {
subFlow(ReceiveFinalityFlow(otherSideSession = otherSession,statesToRecord = statesToRecord))
}
}
}