首页 > 解决方案 > 如何在我的合同中添加限制谁可以调用特定命令的要求?

问题描述

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

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

我不能根据谁发起它的参考来拒绝合同级别的这个命令(我认为应该在这个级别完成,因为这只是另一个命令约束),我必须改为在响应者流级别上执行它。

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

标签: cordasmartcontracts

解决方案


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

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

  1. 由于您不关心谁提出了交易,而是由管理员完成,您可以将非提议管理员配置为仅在他们看到它已由另一个管理员签署时签署 tx。所以在实际的提议者签署之前,没有一个非提议者会签署它。

  2. 将交易的提议者/发起者作为您的 State 对象的一部分,并检查该提议者/发起者是否在您的管理员列表中。

  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.") }


推荐阅读