【发布时间】:2020-12-14 01:06:45
【问题描述】:
在多响应者流中到底发生了什么?我们是否在与多个节点进行通信?我们可以将多响应者流用于其他目的吗?
【问题讨论】:
在多响应者流中到底发生了什么?我们是否在与多个节点进行通信?我们可以将多响应者流用于其他目的吗?
【问题讨论】:
想象一下,您(发起人)正在申请贷款;你去 5 个不同的银行(即 5 个响应者)。每家银行都有自己的标准来批准您的贷款申请(一家银行要求您拥有房屋作为担保,另一家银行要求您的年薪高于 100,000,等等)。
因此,即使所有响应节点可以使用由编写initiating 流的组织提供的responder 流;他们也没有义务,实际上响应节点有责任编写自己的responder流版本来实现自己的业务规则。
如果收到的交易通过了这些业务规则,响应者就会批准它(即它签署交易);否则它会拒绝它(即抛出FlowException)。
【讨论】:
我想您指的是响应程序流的覆盖。它允许开发人员配置节点以使用覆盖的响应程序流而不是基本响应程序进行响应。
您可以在此处找到更多详细信息: https://docs.corda.net/docs/corda-os/4.5/flow-overriding.html
【讨论】:
正如前面的 cmets 所说,您可以根据存储在响应节点中的信息,选择创建多个响应者流或使用单个实现不同逻辑的响应者流。 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))
}
}
}
【讨论】: