在 cordapp 中编写多个响应程序流是什么意思?
What do we mean by writing multiple responder flows in cordapp?
多重响应流中到底发生了什么?我们是否与多个节点通信?我们可以将多重响应流用于其他目的吗?
我想您指的是覆盖响应程序流。它允许开发人员将节点配置为使用覆盖的响应程序流而不是基本响应程序进行响应。
您可以在此处找到更多详细信息:
https://docs.corda.net/docs/corda-os/4.5/flow-overriding.html
想象一下,你(发起人)正在申请贷款;您去了 5 家不同的银行(即 5 位响应者)。每家银行对你的贷款申请都有自己的审批标准(一家银行要求你有房子作为担保,另一家银行要求你的年薪高于10万,等等)。
因此即使所有响应节点可以使用编写initiating
流程的组织提供的responder
流程;他们也没有义务,实际上响应节点有责任编写自己版本的 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))
}
}
}
多重响应流中到底发生了什么?我们是否与多个节点通信?我们可以将多重响应流用于其他目的吗?
我想您指的是覆盖响应程序流。它允许开发人员将节点配置为使用覆盖的响应程序流而不是基本响应程序进行响应。
您可以在此处找到更多详细信息: https://docs.corda.net/docs/corda-os/4.5/flow-overriding.html
想象一下,你(发起人)正在申请贷款;您去了 5 家不同的银行(即 5 位响应者)。每家银行对你的贷款申请都有自己的审批标准(一家银行要求你有房子作为担保,另一家银行要求你的年薪高于10万,等等)。
因此即使所有响应节点可以使用编写initiating
流程的组织提供的responder
流程;他们也没有义务,实际上响应节点有责任编写自己版本的 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))
}
}
}