如何搜索现有合同?例如通过使用accountid在现有帐户中找到帐户合同

时间:2019-05-07 23:16:51

标签: daml

我应该怎么做才能找到现有合同?

例如我有一个创建帐户合同的模板。在创建合同之前,我需要搜索现有合同以确保帐户ID不重复。

1 个答案:

答案 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负责维护由其发行的帐户的索引。

您现在可以使用两个功能:fetchByKeylookupByKey。两者都取一个元组(Party, Text)fetchByKey返回元组(ContractId Account, Account),如果找不到密钥,则中止事务。 lookupByKey返回一个Optional (ContractId Account),但还有一点微妙之处,即必须由lookupByKey授权使用issuer

不过,更一般而言,查询倾向于在应用程序的集成层中按分类帐进行。例如,如果您要检查给定的owner是否已经拥有10个以上的帐户,则通常可以通过在以下数据库的可查询数据库中维护活动Account模板的镜像来做到这一点您的选择并在提交交易之前进行查询。

您可以看看这个example,它维护了MongoDB中的所有有效合同。