我想构建一个简单的智能合约,能够创建资产并向其添加具有不同角色的用户。每个用户在分配的每个资产时只能有一个角色。
代码的完整性:
contract AccessManagement {
struct Authorization {
string role;
bool active;
}
struct Asset {
address owner;
address[] authorizationList;
mapping(address => Authorization) authorizationStructs;
bool initialized;
}
mapping(string => Asset) assetStructs;
string[] assetList;
function newAsset(string assetKey) public returns(bool success) {
// Check for duplicates
assetStructs[assetKey].owner = msg.sender;
assetStructs[assetKey].initialized = true;
assetList.push(assetKey);
return true;
}
function addAuthorization(string assetKey, address authorizationKey, string authorizationRole) public returns(bool success) {
// ??? - Require Role "Admin"
// ??? - Push only if "authorizationKey" is unique. Otherwise change the values.
assetStructs[assetKey].authorizationList.push(authorizationKey);
assetStructs[assetKey].authorizationStructs[authorizationKey].role = authorizationRole;
assetStructs[assetKey].authorizationStructs[authorizationKey].active = true;
return true;
}
function getAssetAuthorization(string assetKey, address authorizationKey) public constant returns(string authorizationRole) {
return(assetStructs[assetKey].authorizationStructs[authorizationKey].role);
}
}
我对此的问题:
- 如果"授权密钥"是唯一的,如何确保将其推送到授权列表[]?如果它不唯一,则只应更改值。
- 如何检查"assetStructs[assetKey].authorizationStructs[msg.sender].role"是否为 等于管理员?
我没有看到您在任何地方使用授权列表。您可以删除它。要确保始终只有一个授权密钥,可以使用现有映射。现有条目将被覆盖。 当您想知道密钥是否存在时,请检查要true
active
,因为默认情况下,它将对所有不存在的密钥false
。 您是否需要在某个时候遍历所有地址?
要检查角色是否等于管理员,我会为角色创建一个枚举并与之进行比较。像这样:
// Enum
enum Roles { User, Admin };
// Struct
struct Authorization {
Roles role;
bool active;
}
// Checking
if (assetStructs[assetKey].authorizationStructs[authorizationKey].role == Roles.Admin) {
// something here
}