是否可以定义模板Daily
,如果Alice
创建一个模板,Bob
不再可以,并且{{ 1}}创建了一个,Bob
不再可以了?
答案 0 :(得分:1)
在询问DAML中的“每天一次”之类的约束时,必须考虑该约束的范围以及由谁来保证。
DAML中最简单的模板是
Alice
template Daily
with
holder : Party
where
signatory holder
仅知道此模板的实例。在holder
和Alice
之间,没有一方或一组方可以确保只有一个这样的合同实例。在某些分类帐拓扑中,Bob
和Alice
甚至可能彼此都不认识,也没有一方知道这两者。
需要一组确保唯一性的参与者:
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
彼此之间或彼此的Bob
或Daily
彼此不了解,但是DailyFactory
知道维护唯一性的所有各方,并知道他们保证唯一性的所有uniquenessGuarantors
实例。他们必须!
要运行上述代码段,您需要导入Daily
和DA.Time
。
答案 1 :(得分:0)
请注意,getTime
返回UTC-因此,根据UTC,该代码将保证唯一性,每天一次,但不能根据本地日历(例如,可能是NZ)。 >