首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hyperlededger Fabric Composer事务中的权限控制

Hyperlededger Fabric Composer事务中的权限控制
EN

Stack Overflow用户
提问于 2017-11-15 11:05:57
回答 2查看 450关注 0票数 0

我有两个Participants A和B,每个人都有自己的identityCA发给他们

有一个事务可以使一个ParticipantCoins传输到另一个事务。

代码语言:javascript
复制
participant Person identified by id {
    o String id
    o String firstName
    o String lastName
    o Double coins
}

事务cto文件

代码语言:javascript
复制
transaction TransferCoins {
    o Double coinsTransferred      
    --> Person receiver
    --> Person sender
}

permissions.acl文件

代码语言:javascript
复制
rule PersonCanModifyOnlySelf {
    description: "Allow Persons to modify only their profile"
    participant(p): "org.varun.business.Person"
    operation: READ, UPDATE, DELETE
    resource(r): "org.varun.business.Person"
    condition: (r.getIdentifier() === p.getIdentifier())
    action: ALLOW
}

rule PersonCanReadAllProfile {
    description: "Allow Persons read access to other Persons"
    participant: "org.varun.business.Person"
    operation: READ
    resource: "org.varun.business.Person"
    action: ALLOW
}

transaction.js文件

代码语言:javascript
复制
/**
 * Person to Person transaction
 * @param {org.varun.business.TransferCoins} transferCoins
 * @transaction
 */
function TransferCoins(transferCoins) {

    var coinsToTransfer = transferCoins.coinsTransferred;
    transferCoins.sender.coins = transferCoins.sender.coins - coinsToTransfer;
    transferCoins.receiver.coins = transferCoins.receiver.coins + coinsToTransfer;

    return getParticipantRegistry('org.varun.business.Person')
        .then(registry => {
            return registry.updateAll([transferCoins.sender, transferCoins.receiver]);
        })                
}

总之

  • 每个人只能update他们自己的个人资料。
  • 每个人都有通用的read访问。

当调用TransferCoins函数时,硬币从A中减去,而硬币被添加到B中。

现在,如果A要调用这个事务,我收到一个错误:A不能更新B的硬币(显然是因为上面定义的acl )。那么,这种事务是如何工作的呢?有人能帮帮我吗。

EN

回答 2

Stack Overflow用户

发布于 2017-11-15 13:54:24

问得好!

因此,我需要定义两项交易:

InitiateTransfer {} AcceptTransfer{}

在你的模型里。

InitiateTransfer (事务功能)将由参与者A调用。在调用时,您可以在更新后发出一个事件,例如Node事件--将传入传输的参与者B发送给电子邮件参与者B,并在电子邮件等中添加链接以进行并接受传输。

参与者B登录应用程序并接受传输(最终调用AcceptTransfer()事务函数)。

参与者A和参与者B是两个单独的事务,不会违反您现有的ACL条件。您是否希望CoinTransfer更新参与者或资产的余额(例如,交易中与参与者有关系的帐户风格-参见下面的***NOTE )完全取决于您。

事务处理器函数将在提交事务之前等待承诺得到解决。如果一个承诺被拒绝,交易就会失败。

Composer事务所做的更改是原子性的,要么事务成功(正如您定义的那样),然后应用所有更改,要么事务失败,每个事务不应用任何更改。还建议在特定与处理错误相关的文档中看到“错误处理”,如果一个事务没有由Fabric或区块链本身“提交”(因此,参与者B是否有一个事务可与之工作) -> scripts.html

*注:*你可以(自行决定)考虑建立何种模式。您提出了在转移后保持平衡(发起者和接受者)的概念--这可能被建模为资产(例如。coinAccount),具有ID字段、coinBalance和coinHolder (链接到Person)。事务由发起者发起并更新其帐户(减少coinAccount余额),类似地,单独的事务更新受体coinAccount余额。

票数 2
EN

Stack Overflow用户

发布于 2017-11-16 15:52:40

我明白了,在资产层面。事务以一个身份提交。在您的例子中,参与者A。如果ACL将他/她限制在自己的记录上,那么该机制使得事务处理器很难在单个块链事务中实现您想要的结果。

那么,是否有可能与一方当事人提交交易,而后者与A或B无关,但可以同时更新这两种情况?这可能是最好的办法。事务历史记录将用于查看事务提交后发生的更改。

列表记录-配对发送方和接收方以及时间戳等-如果需要,也可以作为同一事务逻辑的一部分进行记录(为了报告或其他目的)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47305764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档