如何限制一组节点启动流

nel*_*ruk 2 corda

如果我有两种当事人,例如:银行A、银行B、保险A、保险B。我可以限制交易只能由保险公司发起吗?

所以我不希望 BankA 能够启动一个特定的流程。

Joe*_*oel 5

有几种方法可以让您阻止节点启动某些流:

  • 您只能在保险公司节点上安装定义保险公司特定流程的 CorDapp,而不能在银行节点上安装

    • 你甚至可以只提供包含保险公司流向保险公司节点的 CorDapp JAR
  • 正如 Kid101 所说,您可以限制节点的 RPC 权限,仅允许保险公司节点的 RPC 用户启动相关流程。例如:

    rpcUsers=[
        {
            username=exampleUser
            password=examplePass
            permissions=[
                "StartFlow.net.corda.flows.ExampleFlow1",
                "StartFlow.net.corda.flows.ExampleFlow2"
            ]
        }
        ...
    ]
    
    Run Code Online (Sandbox Code Playgroud)

这两种方法依赖于节点之间的信任。没有什么可以阻止银行节点之一获取包含保险流的 CorDapp 并授予自己启动它的 RPC 权限。

如果节点不信任(您应该假设它们在 DLT 世界中),您应该采用以下方法之一:

  • 您可以在响应者流程中执行检查。例如,如果您有流对IssueInsurancePolicyFlow/ IssueInsurancePolicyFlowResponder,则可以添加签入IssueInsurancePolicyFlowResponder以确保 的发起者IssueInsurancePolicyFlow是保险人节点。

    在伪代码中:

    if (counterpartySession.counterparty !in insurerNodeList) {
        throw IllegalStateException("Flow must be run by an insurer node.")
    }
    
    Run Code Online (Sandbox Code Playgroud)

    在这里,由您决定如何检索有效保险公司节点的列表。例如,它可以从响应者节点的数据库中读取。

    请注意,此方法仅适用于发起人(公证人除外)以外的必需签名者。否则,无法强制不诚实的银行节点向诚实的交易对手发送消息以调用响应者流程(以及包含的检查)。

    还要注意,这个检查应该放在响应者流中,因为发起者不能修改在响应者端运行的代码。如果支票被放置在发起人流中,银行节点可以创建自己的发起人流并离开此结帐

  • 您可以在合同本身内进行检查。例如:

    override fun verify(tx: LedgerTransaction) {
        ...
    
        val dealStateOutput = tx.outputsOfType<DealState>().single()
        if (dealStateOutput.insurer !in approvedInsurers)
            throw IllegalArgumentException("Unapproved insurer.")
    
        ...
    }  
    
    Run Code Online (Sandbox Code Playgroud)

    这种方法的困难在于将批准的保险公司名单纳入合同。您可以对其进行硬编码,但它可能会随着时间的推移而发生变化,从而迫使您升级合约。一种替代方法是包含一个 oracle 签名的命令,指示给定的保险公司已获批准,并检查该保险公司在输出状态上与该保险公司相匹配。