046.Solidity入门——33权限控制合约

权限控制合约是一种常见的智能合约,用于限制对合约功能的访问权限,在这章011.智能合约的结构——07权限管理 有粗略介绍过。

它的语法权限控制合约的语法与普通合约的语法相似,但要使用Solidity中的修饰符来定义访问权限,

016.Solidity入门——03函数修饰符033.Solidity入门——20函数的可视范围 这两个章节有讲过。

咱们来复习下这几个常见的修饰符:

修饰符

描述

public

定义为公共变量或函数,可以在任何地方访问。

private

义为私有变量或函数,只能在合约内部访问。

internal

定义为内部变量或函数,只能在合约内部或继承合约中访问。

external

定义为外部函数,只能从合约外部通过交易调用。

这是一个简单的权限控制合约代码,包含了管理员角色和用户角色的访问权限控制,角色的添加和移除:

pragma solidity ^0.8.7;

contract AccessControl {
    // 定义角色
    bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE");
    bytes32 public constant USER_ROLE = keccak256("USER_ROLE");

    // 定义事件
    event AdminAdded(address indexed account);
    event AdminRemoved(address indexed account);
    event UserAdded(address indexed account);
    event UserRemoved(address indexed account);

    // 管理员角色
    struct Admin {
        bool exists;
        uint256 index;
    }

    // 用户角色
    struct User {
        bool exists;
        uint256 index;
    }

    // 所有角色的账户
    address[] public admins;
    address[] public users;

    // 存储角色对应的账户
    mapping(address => Admin) private adminAccounts;
    mapping(address => User) private userAccounts;

    // 仅允许管理员访问的函数
    modifier onlyAdmin() {
        require(isAdmin(msg.sender), "AccessControl: caller is not an admin");
        _;
    }

    // 仅允许用户访问的函数
    modifier onlyUser() {
        require(isUser(msg.sender), "AccessControl: caller is not a user");
        _;
    }

    // 添加管理员角色
    function addAdmin(address account) public onlyAdmin {
        require(!adminAccounts[account].exists, "AccessControl: account already has admin role");
        adminAccounts[account] = Admin(true, admins.length);
        admins.push(account);
        emit AdminAdded(account);
    }

    // 移除管理员角色
    function removeAdmin(address account) public onlyAdmin {
        require(adminAccounts[account].exists, "AccessControl: account does not have admin role");
        uint256 indexToDelete = adminAccounts[account].index;
        address accountToMove = admins[admins.length - 1];
        admins[indexToDelete] = accountToMove;
        adminAccounts[accountToMove].index = indexToDelete;
        admins.pop();
        delete adminAccounts[account];
        emit AdminRemoved(account);
    }

    // 添加用户角色
    function addUser(address account) public onlyAdmin {
        require(!userAccounts[account].exists, "AccessControl: account already has user role");
        userAccounts[account] = User(true, users.length);
        users.push(account);
        emit UserAdded(account);
    }

    // 移除用户角色
    function removeUser(address account) public onlyAdmin {
        require(userAccounts[account].exists, "AccessControl: account does not have user role");
        uint256 indexToDelete = userAccounts[account].index;
        address accountToMove = users[users.length - 1];
        users[indexToDelete] = accountToMove;
        userAccounts[accountToMove].index = indexToDelete;
        users.pop();
        delete userAccounts[account];
        emit UserRemoved(account);
    }

    // 检查是否是管理员账户
    function isAdmin(address account) public view returns (bool) {
        return adminAccounts[account].exists;
    }

    // 检查是否是用户账户
    function isUser(address account) public view returns (bool) {
        return userAccounts[account].exists;
    }
}
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Solidity是一种智能合约语言,它是以太坊平台上的主要编程语言之一。以下是Solidity的教程: 1. 智能合约的基础结构 Solidity智能合约由两个部分组成:状态变量和函数。状态变量是合约内部存储的数据,而函数是合约内部的代码,用于处理状态变量或执行其他操作。 2. Solidity的数据类型 Solidity支持各种数据类型,包括布尔值、整型、地址、字符串、数组、结构体等。例如: - 布尔值:bool - 整型:int、uint - 地址:address - 字符串:string - 数组:array - 结构体:struct 3. Solidity的函数 函数是Solidity合约中最重要的部分之一。函数可以接受参数,也可以返回值。例如: ``` function add(uint a, uint b) public returns (uint) { return a + b; } ``` 这个函数接受两个整数作为参数,并返回它们的和。 4. Solidity控制Solidity支持各种控制流结构,包括if、for、while、do-while等。例如: ``` function isEven(uint x) public returns (bool) { if (x % 2 == 0) { return true; } else { return false; } } ``` 这个函数接受一个整数作为参数,并返回它是否为偶数。 5. Solidity的事件 事件是Solidity合约中的一种通知机制,它可以向外部应用程序发送消息。例如: ``` event Transfer(address indexed _from, address indexed _to, uint _value); ``` 这个事件表示在合约中发生了一次转账操作,它包含了发送方地址、接收方地址和转账金额。 6. Solidity的继承 Solidity支持继承,一个合约可以从另一个合约中继承状态变量和函数。例如: ``` contract A { uint public x = 1; } contract B is A { uint public y = 2; } ``` 在这个例子中,合约B从合约A中继承了状态变量x,并且定义了自己的状态变量y。 以上就是Solidity的基础教程,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值