Нажмите уникальные ключи только для массива в Солидности - PullRequest
0 голосов
/ 02 сентября 2018

Я хочу создать простой умный контракт, который может создавать активы и добавлять в них пользователей с различными ролями. Каждый пользователь должен иметь только одну роль за один назначенный актив.

Код в браке:

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);
}
}

Мои вопросы по этому поводу:

  • Как я могу убедиться, что «authorizationKey» помещен в authorizationList [], если он уникален? Если он не уникален, следует изменить только значения.
  • Как я могу проверить, если "assetStructs [assetKey] .authorizationStructs [msg.sender] .role" равен равен админ?

1 Ответ

0 голосов
/ 10 сентября 2018

Я нигде не вижу, чтобы вы использовали список авторизации Вы можете удалить это. Чтобы убедиться, что всегда есть только один ключ авторизации, вы можете использовать существующую карту. Существующая запись будет перезаписана. Если вы хотите узнать, существует ли ключ, проверьте, чтобы active было true, так как оно будет false по умолчанию для всех несуществующих ключей. Вам нужно перебрать все адреса в какой-то момент?

Чтобы проверить, равна ли роль Admin, я бы создал Enum для ролей и сравнил бы с этим. Примерно так:

// Enum
enum Roles { User, Admin };

// Struct
struct Authorization {
    Roles role;
    bool active;
}

// Checking
if (assetStructs[assetKey].authorizationStructs[authorizationKey].role == Roles.Admin) {
    // something here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...