我如何限制一组节点启动流程



如果我有两种当事方,例如: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文件中的节点配置中设置权限。

最新更新