如何牢固地声明列出的变量?

问题描述

我已经在固态智能合约中创建了一个功能,可以在游戏中添加玩家,玩家应该在游戏中以“用户”或“英雄”的身份存储。用户发送交易请求,而英雄发送奖励。我创建了一个修饰符,仅允许用户请求,而英雄发送奖励,但是定义每个人在注册阶段的角色令我感到困惑。预先感谢。

 function Addplayer(string _name,string _role) public returns (bool){
 players[msg.sender].name=_name;
 players[msg.sender].Paddress=msg.sender;
 players[msg.sender].role = _role; 
 return true;
    }
 modifier onlyuser() {
    require(msg.sender == user,"Only user can call this method");
    _;}
modifier onlyheros() {
    require(msg.sender == hero,"Only hero can call this method");
    _;}

    
function Request() onlyuser external payable returns(bool) {
    balances[msg.sender] += msg.value;
    }
    
    
function Reward() onlyhero external payable returns (bool) {
    balances[msg.sender] += msg.value;
    user.transfer(msg.value);
    }    

解决方法

尝试将它们声明为枚举。枚举名称{variable1,variable2}

,

您可以创建一个映射和函数来检查用户角色,例如:

pragma solidity >=0.4.22 <0.6.0;
pragma experimental ABIEncoderV2;

// User address => Role of user
mapping(address => string) UserAuth;

// Set user role to a User Address
function setUser(address _userAddress,string memory _role) public {
    UserAuth[_userAddress] = _role;
}

//Check user role
modifier checkAuth(string memory _role){
    require(keccak256(abi.encode(UserAuth[msg.sender])) == keccak256(abi.encode(_role)));
    _;
}

//get user role
function getUserAuth(address _userAddress) public view returns ( string memory){
    return UserAuth[_userAddress];
}

,您还可以将 ADMIN 用户设置为构造函数,以控制诸如此类的功能:

pragma solidity >=0.4.22 <0.6.0;
pragma experimental ABIEncoderV2;

// User address => Role of user
mapping(address => string) UserAuth;

constructor() public{
    UserAuth[msg.sender] = "ADMIN";
}

//Check user role
modifier checkAuth(string memory _role){
    require(keccak256(abi.encode(UserAuth[msg.sender])) == keccak256(abi.encode(_role)));
    _;
}

// Set User Role to a User Address
function setUser(address _userAddress,string memory _role) public checkAuth("ADMIN"){
    UserAuth[_userAddress] = _role;
}
 
// get user role 
function getUserAuth(address _userAddress) public view checkAuth("ADMIN") returns ( string memory){
    return UserAuth[_userAddress];
}