如何在现有合同中搜索?例如使用 accountid 在现有账户中查找账户合约

How to search in existing contracts? e.g. find the Account contract in existing Accounts by using accountid

我应该如何查找现有合同?

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

正如 Shayne Fletcher 指出的那样,DAML 最近获得了一项名为 "Contract Keys" 的功能,它解决了您试图解决的特定问题。您可以通过在 template 上声明 key 以及一组 maintainers 来利用此功能,它们确保该键中的唯一性约束并验证任何查找。

template Account
  with
    issuer: Party
    owner: Party
    accountNo: Text
  where
    signatory issuer
    observer owner

    key (issuer, accountNo) : (Party, Text)
    maintainer issuer

上面指定元组(issuer, accountNo)是该类合约的"primary key",一个账户的issuer负责维护其发行账户的索引.

您现在可以使用两个函数:fetchByKeylookupByKey。两者都采用一个元组 (Party, Text)fetchByKey returns 元组 (ContractId Account, Account) 并在找不到密钥时中止事务。 lookupByKey returns 和 Optional (ContractId Account),另外一个微妙之处是,lookupByKey 的使用必须得到 issuer.

的授权

不过,更一般地说,查询往往是在应用程序的集成层中完成的 off-ledger。例如,如果您想检查给定的 owner 是否已经拥有超过 10 个帐户,您通常会通过在可查询的数据库中维护活动 Account 模板的镜像来做到这一点您的选择并在提交交易前查询。

你可以看看这个 example,它在 MongoDB.

中维护所有活跃的合约