如果我有两种派对:BankA,BankB,InsuranceA,InsuranceB。我可以将交易限制为仅由保险方发起吗?
所以我不希望BankA能够启动特定的流程。
答案 0 :(得分:3)
有几种方法可以阻止节点启动某些流:
您只能在保险公司节点上安装定义保险公司特定流量的CorDapp,而不能在银行节点上安装
正如Kid101所说,你可以限制节点' RPC权限仅允许保险公司节点的RPC用户启动相关流程。例如:
rpcUsers=[
{
username=exampleUser
password=examplePass
permissions=[
"StartFlow.net.corda.flows.ExampleFlow1",
"StartFlow.net.corda.flows.ExampleFlow2"
]
}
...
]
这两种方法依赖于节点之间的信任。没有什么可以阻止其中一个银行节点获得包含保险公司流量的CorDapp,并授予自己启动它的RPC权限。
如果节点不信任(您应该假设它们处于DLT世界中),则应采用以下方法之一:
您可以在响应者流程中执行检查。例如,如果您拥有流对IssueInsurancePolicyFlow
/ IssueInsurancePolicyFlowResponder
,则可以在IssueInsurancePolicyFlowResponder
中添加一个检查,以确保IssueInsurancePolicyFlow
的发起人是保险人节点。< / p>
在伪代码中:
if (counterpartySession.counterparty !in insurerNodeList) {
throw IllegalStateException("Flow must be run by an insurer node.")
}
在此,您可以决定如何检索有效保险公司节点列表。例如,它可以从响应者节点的数据库中读取。
请注意,只有在除了发起人之外还有必需的签名者时,此方法才有效。否则,无法强制不诚实的银行节点向诚实的交易对手发送消息以调用响应者流(从而包含检查)。
另请注意,此检查应放在响应程序流中,因为启动程序无法修改响应程序端运行的代码。如果检查放在启动器流程中,银行节点可以创建自己的启动流程并将此签出保留
您可以在合同内进行检查。例如:
override fun verify(tx: LedgerTransaction) {
...
val dealStateOutput = tx.outputsOfType<DealState>().single()
if (dealStateOutput.insurer !in approvedInsurers)
throw IllegalArgumentException("Unapproved insurer.")
...
}
这种方法的难点在于将批准的保险公司名单纳入合同。您可以对其进行硬编码,但它可能会随着时间的推移而发生变化,从而迫使您升级合同。一种替代方案是包括一个oracle签名的命令,表明给定的保险公司已获批准,并检查该保险公司是否与保险公司的输出状态相匹配。
答案 1 :(得分:1)
一种方法是为银行和保险公司提供具有适当权限的不同RPC客户端集。在权限中,您可以定义哪个用户可以启动哪个流。可以在build.gradle文件中的节点配置中设置权限。