如果我有两种当事方,例如:banka,bankb,Insurancea,InsuranceB。我可以限制交易仅由保险方发起吗?
所以我不希望Banka能够开始特定的流程。
有几种方法可以防止节点启动某些流:
-
您只能在保险公司节点上安装定义特定保险公司的流量的cordapp,而不是在银行节点上
- 您甚至可以只能提供包含保险公司的Cordapp Jar流向保险公司节点
-
正如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
的启动器是保险公司节点。pseudocode:
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的命令,表明给定保险公司已获得批准,并检查该保险公司在输出状态下与保险公司匹配。
一种方法是为拥有适当许可的银行和保险公司提供不同的RPC客户。在权限中,您可以定义哪个用户可以启动什么流程。可以在build.gradle文件中的节点配置中设置权限。