LOADING

加载过慢请开启缓存 浏览器默认开启

Code review: Openzeppelin-IAccessControl

2023/6/26 Solidity Coding

概述:

这段代码定义了一个名为IAccessControl的接口,提供了角色控制的功能。通过该接口,可以进行以下操作:

分配角色:可以将某个角色授权给指定的帐户。

撤销角色:可以从指定的帐户中撤销某个角色的授权。

查询角色:可以检查某个帐户是否被授予了指定的角色。

管理角色管理员:可以查询和更改角色的管理员角色。

此外,该接口定义了一些事件,用于在角色授权和撤销时发出通知。

完整代码:

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

代码分析:

这段代码定义了一个名为IAccessControl的接口,用于角色控制。

首先,关键字interface表示这是一个接口的定义。

接口中声明了一些函数和事件,具体如下:

  1. event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    • 事件:RoleAdminChanged,当一个角色的管理员角色发生变化时触发。
    • 参数:
      • role:角色的标识符。
      • previousAdminRole:先前的管理员角色的标识符。
      • newAdminRole:新的管理员角色的标识符。
  2. event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    • 事件:RoleGranted,当将某个角色授权给一个帐户时触发。
    • 参数:
      • role:角色的标识符。
      • account:被授权的帐户地址。
      • sender:发起合约调用的发送者地址。
  3. event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    • 事件:RoleRevoked,当从一个帐户中撤销某个角色的授权时触发。
    • 参数:
      • role:角色的标识符。
      • account:被撤销授权的帐户地址。
      • sender:发起合约调用的发送者地址。

接下来是一系列函数的声明,用于实现角色控制的具体功能:

  1. function hasRole(bytes32 role, address account) external view returns (bool);

    • 函数:hasRole,用于检查某个帐户是否被授予了指定的角色。
    • 参数:
      • role:角色的标识符。
      • account:待检查的帐户地址。
    • 返回值:如果帐户被授予了指定的角色,则返回true,否则返回false
  2. function getRoleAdmin(bytes32 role) external view returns (bytes32);

    • 函数:getRoleAdmin,用于查询控制指定角色的管理员角色。
    • 参数:
      • role:角色的标识符。
    • 返回值:指定角色的管理员角色的标识符。
  3. function grantRole(bytes32 role, address account) external;

    • 函数:grantRole,用于将指定角色授权给指定的帐户。
    • 参数:
      • role:角色的标识符。
      • account:被授权的帐户地址。
    • 注意事项:调用该函数的合约调用者必须具有指定角色的管理员角色。
  4. function revokeRole(bytes32 role, address account) external;

    • 函数:revokeRole,用于从指定的帐户中撤销指定角色的授权。

    • 参数:role:角色的标识符。

      • account:被撤销授权的帐户地址。

      • 注意事项:调用该函数的合约调用者必须具有指定角色的管理员角色。

  5. function renounceRole(bytes32 role, address account) external;

    • 函数:renounceRole,用于让指定帐户自行放弃某个角色。
    • 参数:
      • role:角色的标识符。
      • account:希望放弃的帐户地址。
      • 注意事项:调用该函数的帐户必须是指定角色的持有人(即帐户本身)。

通过这些函数和事件,实现了角色控制的功能。可以使用grantRole函数将角色授权给指定的帐户,使用revokeRole函数从指定的帐户中撤销角色的授权。使用hasRole函数可以查询某个帐户是否被授予了指定的角色。使用getRoleAdmin函数可以查询控制指定角色的管理员角色。而renounceRole函数可以让指定的帐户自行放弃某个角色。这样的角色控制机制可以在智能合约中用于管理角色和权限,例如限制特定操作只能由特定角色的帐户执行,或者检查帐户是否具有特定的角色以进行条件检查等。