corda - 如何在我的合同中添加限制谁可以调用特定命令的要求?
问题描述
当我正在开发我的第一个 corDapp 时,我认为能够从合约级别引用交易的发起者(流程启动者)可能会很有用。原因是尽管我的合约可以被任何一方调用,但我不一定要允许任何一方调用每个命令。
在我的州,我有一个你可能称之为管理员的列表。这些管理员应该是唯一能够在此列表中发出命令的人,例如 RemoveAdmin() 或 AddAdmin()。
我不能根据谁发起它的参考来拒绝合同级别的这个命令(我认为应该在这个级别完成,因为这只是另一个命令约束),我必须改为在响应者流级别上执行它。
其他人认为 tx.initiator 字段可能对我描述的权限约束有用吗?如果不是,为什么在响应者流级别上做更好?
解决方案
我认为概念上的问题是,在 Corda 中,交易可以协作构建——例如,如果两方正在交换资产并且部分 tx 被传递,因此他们可以用各自的输入填充它。所以在概念上并不总是有提议者/发起者。所以这个概念在 Corda 的数据模型上并不存在。
话虽如此,您可以采取三种方法:
由于您不关心谁提出了交易,而是由管理员完成,您可以将非提议管理员配置为仅在他们看到它已由另一个管理员签署时签署 tx。所以在实际的提议者签署之前,没有一个非提议者会签署它。
将交易的提议者/发起者作为您的 State 对象的一部分,并检查该提议者/发起者是否在您的管理员列表中。
如果流的发起者不在管理员列表中,则抛出异常:
//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.") }
推荐阅读
- apache - 在 htaccess 中重定向到真实页面
- python - 如何从框架中删除所有标签但保留菜单/按钮?tkinter,蟒蛇
- apache-nifi - 无法连接到自定义 NiFi 端口
- java - 我正在从一项服务连接到另一个面临的转换问题
- swift - 从匹配类型的字符串中获取 Swift 枚举类型,而不是 rawValue
- sql - SQL 2 选择查询
- google-drive-api - 查询“sharedWithMe=false”无效值?
- java - 访问多对多关系的 Hibernate JPA 问题:标识符无效
- hazelcast - 了解 Hazelcast 成员加入或离开集群会影响哪些数据
- c - 如何解决错误:开关量不是整数和错误:案例标签不会减少为整数常量”