我有两个关于DAML的问题,自动化选择和场景的可能性。我有一个需要输入ContractId的模板
template Create_Creation
with
current_login : Party
artist : Party
title : Text
votingRight : Set Party
observers_list_id : ContractId Observers
where
signatory current_login我需要在场景中创建一些模板,但是无法指定一个ContractId (比如#0:0),给出了诸如:Couldn't match expected type 'ContractId Observers' with actual type 'Text'这样的错误,在场景中可以指定一个ContractId吗?
接下来,在上面的模板中,我定义了一个名为choice的Load_all_creation_observers,它创建了一个模板创建,并将template Observers中指定的观察者作为观察员加载到其中:
choice Load_all_creation_observers : ContractId Creation
controller current_login
do
observers_list <- fetch observers_list_id
create Creation with created_by = current_login; artist = artist; title = title;
votingRight = votingRight; observers_list_id = observers_list_id; observers = observers_list.observers
template Observers
with
superuser : Party
observers : Set Party
where
signatory superuser
observer observers正如现在的代码所显示的那样,当用户创建Create_Creation template时,他需要执行Load_all_creation_observers选择,以便使用加载到其中的所有观察者创建Creation模板。当用户提交Create_Creation模板时,是否可以自动执行此选择?或者完全没有选择,并将其定义为自动化功能,就像您在普通编程语言(if语句)中所做的那样。您似乎只能在选择中定义do函数。
发布于 2020-03-09 01:27:54
在一种情况下,在分类账上存在的唯一合同是迄今在该方案中创建的合同。因此,如果存在Observers contractId,则必须在场景的前一个点创建Observers契约。
ContractIds是不透明的,而且绝对是不可预测的,因此考虑一个契约id文本是没有意义的。相反,在创建契约时,在这一点上绑定结果id。即。
test = scenario do
su <- getParty "Super User"
obsId <- su submit create Observers with ...
p1 <- getParty "Party 1"
ccId <- p1 submit create Create_Creation with ...; observers_list_id = obsId发布于 2020-03-09 09:51:24
考虑到有关合同I的问题已经得到解答,我将集中讨论您的第二个问题。
您不能自动执行一个选择(您可以有一些分类账自动化,例如,一个DAML触发器这样做,但在这种情况下您没有任何原子性保证)。解决这个问题的方法是用一个选项定义一个新的模板,然后使用分类帐API上的CreateAndExercise调用该选择。这与定义顶级函数相当。对于您的示例,如下所示
template CreateCreationTemplate
with
p : Party
where
signatory p
choice CreateCreation : ContractId Creation
with
observers_list_id : ContractId Observers
artist : Party
title : Text
votingRight : Set Party
do observers_list <- fetch observers_list_id
create Creation with
created_by = p
artist = artist
title = title
votingRight = votingRight
observers_list_id = observers_list_id
observers = observers_list.observers您可以选择一些字段作为模板的字段,但作为一般指导原则,在模拟顶级函数时,我倾向于只将一方作为模板的字段。
根据您的使用情况,也有可能有一个“工厂”模板与一个不消费的CreateCreation选择。
https://stackoverflow.com/questions/60593475
复制相似问题