仅将唯一键推送到Solidity中的数组



我想构建一个简单的智能合约,能够创建资产并向其添加具有不同角色的用户。每个用户在分配的每个资产时只能有一个角色。

代码的完整性:

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"是否为 等于管理员?

我没有看到您在任何地方使用授权列表。您可以删除它。要确保始终只有一个授权密钥,可以使用现有映射。现有条目将被覆盖。 当您想知道密钥是否存在时,请检查要trueactive,因为默认情况下,它将对所有不存在的密钥false。 您是否需要在某个时候遍历所有地址?

要检查角色是否等于管理员,我会为角色创建一个枚举并与之进行比较。像这样:

// Enum
enum Roles { User, Admin };
// Struct
struct Authorization {
Roles role;
bool active;
}
// Checking
if (assetStructs[assetKey].authorizationStructs[authorizationKey].role == Roles.Admin) {
// something here
}

最新更新