我应该怎么做才能找到现有的合同?
例如,我有一个创建帐户合同的模板。在创建合约之前,我需要搜索现有的合约以确保帐户 ID 不重复。
正如Shayne Fletcher所指出的,DAML 最近获得了一项名为“合同密钥”的功能,可以解决您要解决的特定问题。key
您可以通过在 a上声明 atemplate
和一组 来使用此功能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
在您选择的可查询数据库中维护活动模板的镜像并在提交交易之前对其进行查询来做到这一点。
你可以看一下这个例子,它在 MongoDB 中维护所有活动的合约。