DAML: создайте шаблон в сценарии, требующий в качестве входных данных ContractId, и автоматически выберите его после отправки. - PullRequest
1 голос
/ 09 марта 2020

У меня есть 2 вопроса относительно 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, который создает шаблон Creation и загружает в него наблюдателей, указанных в 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? или, может быть, вообще не делать выбор и определять его как автоматизированную функциональность, как вы делали бы в обычных языках программирования (если операторы). Кажется, вы можете определить только do функций в вариантах.

Ответы [ 2 ]

2 голосов
/ 09 марта 2020

Учитывая, что на вопрос об идентификаторах контракта уже дан ответ, я сосредоточусь на вашем втором вопросе.

Вы не можете выполнить выбор автоматически (у вас может быть некоторая автоматизация вне книги, например, триггер DAML это делает это, но вы не получаете никаких гарантий атомности в этом случае). Чтобы решить эту проблему, нужно определить новый шаблон с одним выбором, а затем вызвать его с помощью CreateAndExercise в API бухгалтерской книги. Это в значительной степени эквивалентно определению функции верхнего уровня. Для вашего примера это выглядело бы примерно так:

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 выбором.

1 голос
/ 09 марта 2020

В сценарии единственными контрактами, которые существуют в бухгалтерской книге, являются контракты, которые были созданы до сих пор в этом сценарии. Таким образом, если существует Observers contractId, то в какой-то предыдущий момент сценария должен быть создан Observers контракт.

ContractIds непрозрачен и определенно непредсказуем, поэтому нет смысла думать о контракте -идальный буквальный. Вместо этого, когда контракт создан, свяжите полученный идентификатор в этой точке. Ie.

  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
...