为了我的硕士论文,我试图创建一个分散的文件存储系统,使用ethereum,solidity和ipfs。我想用基于属性的访问控制对智能契约进行编码,但对此不太了解。到目前为止,我看到的大多数链接都是基于角色的访问控制。有人能用几个链接或简单的代码解释来指导我吗?
发布于 2021-03-10 22:29:10
基于属性的访问控制(ABAC)是指用户的属性(或特征).例如,您可能只允许拥有100+令牌的用户投票决定是否应该将基于ERC-20的令牌迁移到自己的块链中。其他属性可以是外部数据,如用于发出事务的IP地址(或其地理位置)(由oracle验证)、用户类别(如注册表契约中指定的)或非链机密(使用散列或零知识证明来证明)。
重要的是指定如何在智能契约中验证这些属性。例如,以太平衡可以像,
if (address.balance >= 100){
can_vote = true;
}如果是ERC-20,请使用balanceOf(account) >= 100
https://blockgeeks.com/introduction-to-solidity-acl-and-events-part-2/提供了一个简单但更详细的示例
发布于 2019-11-01 07:00:15
也许是这样的:
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;}
}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;
}
}然后,任何其他合同都可以利用上述条件来管理访问控制;例如:
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();
}
}https://ethereum.stackexchange.com/questions/77111
复制相似问题