В DAML как получить ContractId при выборе

Могу ли я в DAML сохранить идентификатор контракта B в контракте A? Я пробовал следующее, но создание контракта возвращает обновление, и я не могу сохранить это обновление в любом месте или даже получить доступ к его данным.


template OneContract
  with
    someParty : Party
    someText : Text
    someNumber : Int  
  where
    signatory someParty



template Main
  with
    anyone :  Party
    cid : ContractId OneContract
  where
    signatory anyone

    controller anyone can
      nonconsuming CreateOneContracts : ()
        with 
          p : Party
          int : Int
        do
-- cid is not bind to cid in the contract
          cid <- create OneContract with someParty = p, someText = "same", 
someNumber = int
-- let won't work since create returns an update 
          let x = create OneContract with someParty = p, someText = "same", 
someNumber = int
          pure()


person Frankie    schedule 04.06.2019    source источник


Ответы (1)


У вас правильная идея с cid <- ..., но это создаст новую локальную переменную cid с идентификатором контракта в ней. Все данные в DAML неизменяемы, что означает, что вы не можете записывать в this.cid. Вы должны заархивировать контракт и создать его заново, чтобы изменить хранящиеся в нем данные:

template Main
  with
    anyone :  Party
    cid : ContractId OneContract
  where
    signatory anyone

    controller anyone can
      CreateOneContracts : ContractId Main
        with 
          p : Party
          int : Int
        do
          newCid <- create OneContract with someParty = p, someText = "same", someNumber = int
          create this with cid = newCid

Обратите внимание, что это будет работать только с anyone == p. Полномочия p необходимы для создания OneContract with someParty = p, и единственные полномочия, доступные в контексте выбора CreateOneContracts, — это права anyone.

person bame    schedule 04.06.2019
comment
оно работает. Большое спасибо. Еще вопрос, можно ли это сделать в одной инструкции? например без использования newCid? - person Frankie; 05.06.2019