首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DAML:在需要ContractId作为输入的场景中创建一个模板,并在提交后自动执行选择

DAML:在需要ContractId作为输入的场景中创建一个模板,并在提交后自动执行选择
EN

Stack Overflow用户
提问于 2020-03-09 00:49:46
回答 2查看 229关注 0票数 1

我有两个关于DAML的问题,自动化选择和场景的可能性。我有一个需要输入ContractId的模板

代码语言:javascript
复制
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吗?

接下来,在上面的模板中,我定义了一个名为choiceLoad_all_creation_observers,它创建了一个模板创建,并将template Observers中指定的观察者作为观察员加载到其中:

代码语言:javascript
复制
 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函数。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-09 01:27:54

在一种情况下,在分类账上存在的唯一合同是迄今在该方案中创建的合同。因此,如果存在Observers contractId,则必须在场景的前一个点创建Observers契约。

ContractIds是不透明的,而且绝对是不可预测的,因此考虑一个契约id文本是没有意义的。相反,在创建契约时,在这一点上绑定结果id。即。

代码语言:javascript
复制
  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
票数 1
EN

Stack Overflow用户

发布于 2020-03-09 09:51:24

考虑到有关合同I的问题已经得到解答,我将集中讨论您的第二个问题。

您不能自动执行一个选择(您可以有一些分类账自动化,例如,一个DAML触发器这样做,但在这种情况下您没有任何原子性保证)。解决这个问题的方法是用一个选项定义一个新的模板,然后使用分类帐API上的CreateAndExercise调用该选择。这与定义顶级函数相当。对于您的示例,如下所示

代码语言:javascript
复制
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选择。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60593475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档