我正在编写一个从Whitelist.sol继承的令牌。我想要编写一个函数,它返回一个已被白化的地址数组。
它一定是某种与…有关的东西
function getWhitelistedUsers() public onlyOwner returns (address[]) {
address[] memory whitelistedUsers = Roles[ROLE_WHITELISTED].bearer.keys();
return whitelistedUsers;
}但我不确定我走上了正确的道路。有人能帮忙吗?
发布于 2018-08-15 03:57:50
只是为了详细说明伊斯梅尔的答案。
它们为契约提供了一种检查特定地址/角色(hasRole() ... returns(bool))的方法,但无法枚举来自状态的角色成员列表。这些列表不能被其他合同发现。作者不认为这是必要的。
RBAC (基于角色的访问控制)契约在添加或删除地址/角色时发出事件。在RBAC.sol的第20行:
event RoleAdded(address indexed operator, string role);
event RoleRemoved(address indexed operator, string role);软件客户端可以侦听这些事件日志,并根据需要组装自己的重构角色列表。当我写这个答案时,我突然意识到这些日志混淆了operator,因为在这两种情况下它都是indexed。
为了实现您想要的结果,我很想删除indexed,这样侦听器就可以在不事先知道地址的情况下清楚地观察它们。这将给一个感兴趣的观察者所需的一切,以方便地构建他们自己的链外副本上的事实。然后,他们可以数数,分类,搜索,等等,而不需要合同的进一步帮助。
可以为“完全可发现”的状态制作一个案例。您可以通过创建(和维护)列表来完成这一任务。您需要具有删除功能的索引,如这里所述。是否有妥善解决的和简单的存储模式的坚固性?和这里
https://medium.com/@robhitchens/solidity-crud-part-2-ed8d8b4f74ec。
希望能帮上忙。
发布于 2018-08-14 23:53:15
不,这是不可能的,持票人是一个映射,键不被存储。
struct Role {
mapping (address => bool) bearer;
}如果您需要访问映射的键,则需要将它们明确地存储在一个单独的结构中。
https://ethereum.stackexchange.com/questions/56537
复制相似问题