是否可以限制每天只能创建一次模板

时间:2019-11-07 08:46:16

标签: daml

是否可以定义模板Daily,如果Alice创建一个模板,Bob不再可以,并且{{ 1}}创建了一个,Bob不再可以了?

2 个答案:

答案 0 :(得分:1)

在询问DAML中的“每天一次”之类的约束时,必须考虑该约束的范围以及由谁来保证。

DAML中最简单的模板是

Alice

template Daily with holder : Party where signatory holder 仅知道此模板的实例。在holderAlice之间,没有一方或一组方可以确保只有一个这样的合同实例。在某些分类帐拓扑中,BobAlice甚至可能彼此都不认识,也没有一方知道这两者。

需要一组确保唯一性的参与者:

Bob

唯一性保证者需要能够启用或阻止创建template Daily with holder : Party uniquenessGuarantors : [Party] ... 。换句话说,它们必须是签名者。

Daily

现在,在DAML中保证任何类型的唯一性的最简单方法是使用contract keys。由于我们每天需要一个,因此我们需要一个template Daily with holder : Party uniquenessGuarantors : [Party] where signatory holder, uniquenessGuarantors 字段。

Date

这说明每个密钥都有一个template Daily with holder : Party uniquenessGuarantors : [Party] date : Date where signatory holder, uniquenessGuarantors key (uniquenessGuarantors, date) : ([Party], Date) maintainer key._1 的唯一副本,Daily中的担保人对此负责。

最后,您需要一种机制来实际创建这些东西,由担保人提供一种key._1。该工厂还可以确保将DailyFactory始终设置为分类帐上的当前日期。

date

一个简单的测试说明了它是如何工作的,并且由单方template DailyFactory with uniquenessGuarantors : [Party] holder : Party where signatory uniquenessGuarantors controller holder can nonconsuming FabricateDaily : ContractId Daily do now <- getTime let date = toDateUTC now create Daily with .. 来保证唯一性:

Charlie

请注意,在隐私方面,test_daily = scenario do [alice, bob, charlie] <- mapA getParty ["Alice", "Bob", "Charlie"] fAlice <- submit charlie do create DailyFactory with holder = alice uniquenessGuarantors = [charlie] fBob <- submit charlie do create DailyFactory with holder = bob uniquenessGuarantors = [charlie] -- Alice can get hold of a `Daily` submit alice do exercise fAlice FabricateDaily -- Neither can create a second submitMustFail alice do exercise fAlice FabricateDaily submitMustFail bob do exercise fBob FabricateDaily -- The next day bob can create one pass (days 1) submit bob do exercise fBob FabricateDaily -- But neither can create a second submitMustFail alice do exercise fAlice FabricateDaily submitMustFail bob do exercise fBob FabricateDaily Alice彼此之间或彼此的BobDaily彼此不了解,但是DailyFactory知道维护唯一性的所有各方,并知道他们保证唯一性的所有uniquenessGuarantors实例。他们必须!

要运行上述代码段,您需要导入DailyDA.Time

答案 1 :(得分:0)

请注意,getTime返回UTC-因此,根据UTC,该代码将保证唯一性,每天一次,但不能根据本地日历(例如,可能是NZ)。 >