Hyperledger transaction 基于某些第三资源的参与者权限

Hyperledger transaction Permission to participant based on some 3rd resource

我正在研究 Hyperledger 的一些权限逻辑,当需要出现我需要在 permission.acl 条件下使用 3 个资源的情况时。

场景简介让我们假设Resource Transaction是t,需要为其授予Read Permission,Participant是P,需要读取transaction t。

现在事务 t 包含资产 A 的标识符名称。 所以我想做一个条件,比如如果资产 A 其中标识符(名称)等于交易 T 名称,将资产 A 注册商(这将持有参与者名称)与参与者 P 标识符进行比较。并且如果比较成功则将资源(事务T)的读取权限授予参与者P。

例如片段。

Asset ABC identified by name{
    o String name;
    --> Company registrar; (Company is type of participant)

}

Transaction CreateABC{
     o String name;
}

因此,如果包含 createABC.name 的资产的 registar 等于 P.getIdenitifer();

,则类型公司的参与者 P 应该有权读取交易 CreateABC

我读到我们可以在 js 文件中创建单独的函数并从 permission.acl 调用它,但我还不能实现这种情况。

  1. 使用 3 个资源的示例类似于(示例):

// 首先,访问调用事务资源本身

rule Transaction_access {
    description: "Can generate transaction"
    participant: "org.acme.account.AccountTrader"
    operation: CREATE
    resource: "org.acme.account.TransferAmount"
    action: ALLOW
}

// 接下来,(示例)动态 ACL 规则评估在谁之间完成交易

rule BiTrade_betweenTraders_only {
    description: "Only Allow Updatee between Transferor/Transferee via named transaction"
    participant(p): "org.acme.account.AccountTrader"
    operation: ALL
    resource(v): "org.acme.account.BankAccount"
    transaction(tx): "org.acme.account.TransferAmount"
  condition: ( p.getIdentifier() === v.owner.getIdentifier()  && v.getIdentifier() === tx.targetAccount.getIdentifier() )
    action: ALLOW
}

已更新第 2 项:

  1. 基于参与者的资产所有权(均从交易对象派生)授予对交易资源的访问权限的示例可能是:
rule my_restricted_Transaction_access {
           description: "as per description above"
           participant(p): "org.acme.account.AccountTrader"
           operation: CREATE
           resource(v): "org.acme.account.TransferAmount"
           condition: ( p.getIdentifier() === v.account.owner.getIdentifier() )
           action: ALLOW
}

其中 TransferAmount 可能定义为:

transaction TransferAmount {
   --> Account account   // asset
}

account 有一个 --> owner 字段指向 AccountTrader(参与者,在我原来的例子中 - 等等) - 请记住,您的 ACL 必须允许参与者拥有也可以访问相关资产和资产所有者目标资源。

显然这是一个简单的示例 - 但您可以在 condition 部分中定义您的函数(为您的模型进行等效检查)。如果您已经将 JS 脚本添加到 /lib 下的 BNA(并升级了 Fabric 上的业务网络以生效)——那么您只需要担心您的函数名称是否是您所调用的(同样,我发送给您的链接应该提供一个清晰的使用示例。

  1. 调用函数作为 ACL 条件的一部分很简单 - 您可以在这个 github 测试文件中看到一个例子 -> 函数 (JS) 在这里 https://github.com/hyperledger/composer/blob/master/packages/composer-tests-functional/systest/data/accesscontrols.js#L23 and the corresponding (calling) ACL ruleset is here -> https://github.com/hyperledger/composer/blob/master/packages/composer-tests-functional/systest/data/accesscontrols.acl#L124

更新项目 3:

例如,在您的 permissions.acl 文件中,规则如下:

rule rule_func_condition {
    description: "Allow all participants access to all resources"
    participant(p): "org.acme.account.AccountTrader"
    operation: CREATE
    resource(a): "org.example.account.TransferAmount"
    condition: (testOwnership(a, p))
    action: ALLOW
}

在 functions.js(或其他)中的 /lib 文件夹中(或者如果您愿意,也可以将它放在现有的 logic.js 中,但是您想要这样做):

/**
 * Test that the specified asset is owned by the specified participant.
 * @param {Resource} asset The asset.
 * @param {Resource} participant The participant.
 * @return {boolean} True if yes, false if no.
 */
function testOwnership(asset, participant) {
    return asset.owner.getIdentifier() === participant.getIdentifier();
}

其中 assetparticipant 对象被传递到这个特定的函数示例中。