我应该怎么做才能找到现有合同?
例如我有一个创建帐户合同的模板。在创建合同之前,我需要搜索现有合同以确保帐户ID不重复。
答案 0 :(得分:0)
正如Shayne Fletcher所指出的那样,DAML最近获得了一项名为“合同密钥”的功能,该功能可以解决您要解决的特定问题。您可以通过在key
上声明template
以及一组maintainers
来使用此功能,它们可以确保该键中的唯一性约束并验证所有查找。
template Account
with
issuer: Party
owner: Party
accountNo: Text
where
signatory issuer
observer owner
key (issuer, accountNo) : (Party, Text)
maintainer issuer
以上规定,元组(issuer, accountNo)
是此类合同的“主键”,并且帐户的issuer
负责维护由其发行的帐户的索引。
您现在可以使用两个功能:fetchByKey
和lookupByKey
。两者都取一个元组(Party, Text)
。 fetchByKey
返回元组(ContractId Account, Account)
,如果找不到密钥,则中止事务。 lookupByKey
返回一个Optional (ContractId Account)
,但还有一点微妙之处,即必须由lookupByKey
授权使用issuer
。
不过,更一般而言,查询倾向于在应用程序的集成层中按分类帐进行。例如,如果您要检查给定的owner
是否已经拥有10个以上的帐户,则通常可以通过在以下数据库的可查询数据库中维护活动Account
模板的镜像来做到这一点您的选择并在提交交易之前进行查询。
您可以看看这个example,它维护了MongoDB中的所有有效合同。