Что делает ключевое слово signatory
в контракте DAML? Например, что на самом деле означает строка signatory issuer, owner
в контракте Iou?
Означает ли это, что и владелец, и эмитент должны быть одинаковыми?
Что делает ключевое слово signatory
в контракте DAML? Например, что на самом деле означает строка signatory issuer, owner
в контракте Iou?
Означает ли это, что и владелец, и эмитент должны быть одинаковыми?
Одной из привлекательных особенностей DAML как языка моделирования является то, что он предназначен для решения проблем, связанных с авторизацией и делегированием. Для этого DAML имеет тип первого класса Party
, представляющий независимых участников реестра, и каждый контракт в реестре должен быть авторизован одной или несколькими сторонами, прежде чем его можно будет создать.
Выражение signatory
в шаблоне определяет, кто должен разрешить создание экземпляра контракта этого шаблона. Это делается с точки зрения данных, содержащихся в предлагаемом экземпляре контракта — это означает, что любая сторона, которая может видеть транзакцию, пытающуюся создать контракт, также имеет достаточно данных для проверки того, что создание было должным образом авторизовано.
В случае долгового контракта:
template Iou
with
issuer : Party
owner : Party
currency : Text
amount : Decimal
observers : [Party]
where
signatory issuer, owner
...
Сторона, желающая создать Iou, должна заполнить запись: issuer
, owner
, currency
и т. д. Затем она должна передать эту запись функции create
внутри транзакции, отправленной в реестр. Этот вызов create
должен быть авторизован issuer
и owner
, но не требует авторизации observers
, поскольку они не указаны в качестве подписантов.
Обратите внимание, что issuer
и owner
могут быть одной и той же стороной. На самом деле, это был бы единственный способ легально отправить create
непосредственно в реестр, поскольку отдельные взаимодействия с реестром могут быть разрешены только одной стороной. Большие наборы полномочий должны выполняться как часть более крупной транзакции с использованием делегированных полномочий из других контрактов, уже находящихся в реестре.
Подробнее об этом и особенно о том, как делегировать полномочия, см. документацию по DAML: https://docs.daml.com/concepts/ledger-model/ledger-structure.html
Рабочий пример см. по адресу: https://docs.daml.com/daml/patterns/initaccept.html и другие примеры в разделе Шаблоны документов DAML.