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 调用它,但我还不能实现这种情况。
- 使用 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 项:
- 基于参与者的资产所有权(均从交易对象派生)授予对交易资源的访问权限的示例可能是:
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 上的业务网络以生效)——那么您只需要担心您的函数名称是否是您所调用的(同样,我发送给您的链接应该提供一个清晰的使用示例。
- 调用函数作为 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();
}
其中 asset
和 participant
对象被传递到这个特定的函数示例中。
我正在研究 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 调用它,但我还不能实现这种情况。
- 使用 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 项:
- 基于参与者的资产所有权(均从交易对象派生)授予对交易资源的访问权限的示例可能是:
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 上的业务网络以生效)——那么您只需要担心您的函数名称是否是您所调用的(同样,我发送给您的链接应该提供一个清晰的使用示例。
- 调用函数作为 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();
}
其中 asset
和 participant
对象被传递到这个特定的函数示例中。