关于openzeppelin中AccessControl合约库的疑惑

王long 王long 提出于 2022-06-22 10:09 3845 浏览

image.png

合约库中grantRole 方法是给role角色 添加会员 , 在函数执行中会 经过onlyRolegetRoleAdmin(role))判断 getRoleAdmin(role)是返回当前role管理员=>adminRole image.png 然后将管理员这个by32类型 又当成角色role传递到_checkRole()函数中 从这里开始就疑惑了管理员和role角色不是不同的吗

而_checkRole是判断 调用人是否有这个role角色的会员 传值应该是role 而不应该是adminRole呀 这样转了 一圈 并没有 验证调用人就是adminRole这个管理员呀

image.png image.png

最佳答案

2022-06-22 17:58
struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }
 比如这个是Manager组 role是0xabc
 onlyRole(getRoleAdmin(role))
	getRoleAdmin(role)==>获取role所在组的admin的Role adminRole
 onlyRole(adminRole)
	_checkRole(adminRole);
		_checkRole(adminRole, _msgSender());//检查调用者在不在admin组
		   hasRole(adminRole, account)
		     _roles[adminRole].members[account];//只要在adminRole所在组的成员,都是 (role是0xabc)的管理员

初始管理员 bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
struct RoleData {
        mapping(address => bool) members;//0x00这个管理组,可以有多个成员,
        bytes32 adminRole;//0x0 也就是如果没设置这个,都属于0x00
    }


	
zen
zen

采纳率 39% · 回答于 2022-06-22 12:54

其它 0 个回答

写回答

你需要登录后才可以回答问题,登录