首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在智能契约中创建基于属性的访问控制,以控制用户访问和权限?

如何在智能契约中创建基于属性的访问控制,以控制用户访问和权限?
EN

Ethereum用户
提问于 2019-10-31 22:35:58
回答 2查看 314关注 0票数 0

为了我的硕士论文,我试图创建一个分散的文件存储系统,使用ethereum,solidity和ipfs。我想用基于属性的访问控制对智能契约进行编码,但对此不太了解。到目前为止,我看到的大多数链接都是基于角色的访问控制。有人能用几个链接或简单的代码解释来指导我吗?

EN

回答 2

Ethereum用户

发布于 2021-03-10 22:29:10

基于属性的访问控制(ABAC)是指用户的属性(或特征).例如,您可能只允许拥有100+令牌的用户投票决定是否应该将基于ERC-20的令牌迁移到自己的块链中。其他属性可以是外部数据,如用于发出事务的IP地址(或其地理位置)(由oracle验证)、用户类别(如注册表契约中指定的)或非链机密(使用散列或零知识证明来证明)。

重要的是指定如何在智能契约中验证这些属性。例如,以太平衡可以像,

代码语言:javascript
复制
if (address.balance >= 100){
    can_vote = true;
}

如果是ERC-20,请使用balanceOf(account) >= 100

https://blockgeeks.com/introduction-to-solidity-acl-and-events-part-2/提供了一个简单但更详细的示例

票数 2
EN

Ethereum用户

发布于 2019-11-01 07:00:15

也许是这样的:

A库:

代码语言:javascript
复制
library Roles {
    enum Flag {
        Role1,
        Role2,
        Role3
    }

    function isAuthorizedToRole1(uint256 _flags) internal pure returns (bool) {return isAuthorized(_flags, Flag.Role1);}
    function isAuthorizedToRole2(uint256 _flags) internal pure returns (bool) {return isAuthorized(_flags, Flag.Role2);}
    function isAuthorizedToRole3(uint256 _flags) internal pure returns (bool) {return isAuthorized(_flags, Flag.Role3);}
    function isAuthorized(uint256 _flags, Flag _flag) private pure returns (bool) {return ((_flags >> uint256(_flag)) & 1) == 1;}
}

A合同:

代码语言:javascript
复制
contract Users {
    address public owner;
    mapping(address => uint256) public roles;

    constructor() {
        owner = msg.sender;
    }

    function getRole(address _user) external view returns (uint256) {
        return roles[_user];
    }

    function setRole(address _user, uint256 _role) external {
        require(msg.sender == owner, "illegal caller");
        roles[_user] = _role;
    }
}

然后,任何其他合同都可以利用上述条件来管理访问控制;例如:

代码语言:javascript
复制
contract Manager {
    using Roles for uint256;

    Users public users;

    constructor(Users _users) public {
        users = _users;
    }

    function isAuthorizedToRole1(address _user) external view returns (bool) {
        return users.getRole(_user).isAuthorizedToRole1();
    }

    function isAuthorizedToRole2(address _user) external view returns (bool) {
        return users.getRole(_user).isAuthorizedToRole2();
    }

    function isAuthorizedToRole3(address _user) external view returns (bool) {
        return users.getRole(_user).isAuthorizedToRole3();
    }
}
票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/77111

复制
相关文章

相似问题

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