DAML:授权各方查看特定模板的合同

时间:2020-03-08 01:06:36

标签: daml

所以我在授权时遇到了这个问题。我制作了一个小型投票系统,其中包含场景中给定的参与者合同数量(请参见下面的参与者模板)。我需要在yaml文件中定义的每一方都可以查看这些合同。但是,只有创建合同的一方才能看到它。 DAML是围绕授权构建的,因此只有指定的人才能查看和使用合同(当事方是签署方还是观察员)。但是,我该如何使各方都能看到某个模板的每个合同?我不能将它们指定为观察者。是否可以定义一个包含观察者列表的模板,该模板已输入所有相关方,并且我可以作为观察者转发给每个参与者合同实例?

template Actor
  with 
    created_by  : Party
    username    : Text
    name        : Text
    email       : Text
    bankIban    : Text
    role        : Text
  where 
    signatory created_by

2 个答案:

答案 0 :(得分:1)

我认为实现此目标的惯用方法不是在DAML本身中对其进行建模。

您可以通过将其挂接到https://blog.daml.com/daml-driven/easy-authentication-for-your-distributed-app-with-daml-and-auth0中所述的auth0之类的代码中,从而在外部auth系统中将此逻辑编码。例如,想想您通常如何在RDBMS中做到这一点。您将拥有用户表,他们具有角色,角色可以具有权限等。

然后,您可以引入一个名为ActorAccess(角色)的通用方,并使其成为Actor合同的观察者。然后,您将auth0配置为向actAs这个方或类似方授予Alice和Bob这样的授权。

https://docs.daml.com/app-dev/authentication.html,在令牌中有几个字段,称为readAsactAs,这些字段根据文档中的表格实现了不同的目标。

然后,

auth0将发布具有这些详细信息的JWT令牌,并且现在爱丽丝和鲍勃是任何具有ActorAccess合同方的利益相关者,您可以订阅分类帐api事件流并通过此模板类型观察事件。

不知道这是否正确,但值得一试。

答案 1 :(得分:0)

所以我想通了。对于那些日后为此奋斗的人。我对可能的解决方案的建议奏效了。我创建了一个模板Observer,在方案中输入了各方。然后,我创建了另一个名为Create_actor的模板,允许使用输入观察者模板作为数据类型并引用观察者的选择来创建Actor模板:

template Observers
  with 
    superuser : Party
    observers : Set Party
  where 
    signatory superuser

template Create_Actor
  with 
    current_login  : Party
    username    : Text
    name        : Text
    email       : Text
    bankIban    : Text
    role        : Text
    observers_list_id : ContractId Observers
  where 
    signatory current_login
    choice Load_all_actor_observers : ContractId Actor 
      controller current_login
      do
        observers_list <- fetch observers_list_id
        create Actor with created_by = current_login; username = username; name = name; email = email; observers_list_id = observers_list_id; observers = observers_list.observers, bankIban = bankIban; role = role

template Actor
  with 
    created_by  : Party
    username    : Text
    name        : Text
    email       : Text
    bankIban    : Text
    role        : Text
    observers_list_id : ContractId Observers
    observers   : Set Party
  where 
    signatory created_by
    observer observers