如何向我的合同添加限制谁可以调用特定命令的要求?

How can I add a requirement to my contract that restricts who can call specific commands?

在我开发我的第一个 corDapp 时,我认为能够从合约级别引用交易的发起者(流程启动者)可能会很有用。原因是虽然我的合约可以被任何一方调用,但我不一定想让任何一方调用每个命令。

在我的州,我有一份您可以称为管理员的清单。这些管理员应该是唯一能够在此列表中发出命令的人,例如 RemoveAdmin() 或 AddAdmin()。

我不能根据启动者的参考从合同级别拒绝此命令(我认为应该在这个级别完成,因为这只是另一个命令约束),我必须改为在响应者流量级别。

还有人认为 tx.initiator 字段可能对我描述的权限限制有用吗?如果不是,为什么在响应者流级别做更好?

我认为概念上的问题是,在 Corda 中,交易可以协作构建——例如,如果两方正在交换资产并且部分 tx 被传递,以便他们可以用各自的输入填充它。所以概念上并不总是 proposer/initiator。所以这个概念在 Corda 的数据模型中不存在。

话虽如此,您可以采用三种方法:

  1. 因为你不关心谁提出了交易,而是由管理员完成的,你可以配置非提议的管理员只在他们看到交易已经签名时签署交易由另一个管理员。因此 none 的非提议者将签署它,直到实际提议者签署。

  2. 将 proposer/initiator 设为您的 State 对象的交易部分,并检查此 proposer/initiator 是否在您的 Admin 列表中。

  3. 如果流的发起者不在管理列表中,则抛出异常:

    //make sure that the party running this flow is already an admin if(ourIdentity !in AdminInputStateRef.state.data.participants){ throw IllegalArgumentException("The initiator of this flow must be a admin.") }