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