0

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

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

2 回答 2

1

我认为实现这一点的惯用方法不是在 DAML 本身内对其进行建模。

相反,您可以通过将其连接到类似 auth0 的方式在外部身份验证系统中编写此逻辑,如https://blog.daml.com/daml-driven/easy-authentication-for-your-distributed-app-with-daml中所述-and-auth0。例如,想想您通常如何在 RDBMS 中进行操作。你会有用户表,他们有一个角色,一个角色可以有权限等。

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

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

然后 auth0 将发布一个带有这些详细信息的 JWT 令牌,您可以订阅分类帐 api 事件流并通过此模板类型观察事件,因为 Alice 和 Bob 是任何合约的利益相关者ActorAccess

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

于 2020-03-23T07:02:45.707 回答
0

所以我想通了。对于那些在未来为此苦苦挣扎的人。我对可能解决方案的建议奏效了。我创建了一个模板观察者,我在场景中输入了各方。然后我创建了另一个名为 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
于 2020-03-08T14:47:53.247 回答