forked from DecentralizedClimateFoundation/DCIPs
93 lines
4.5 KiB
Markdown
93 lines
4.5 KiB
Markdown
---
|
|
eip: 5982
|
|
title: Role-based Access Control
|
|
description: An interface for role-based access control for smart contracts.
|
|
author: Zainan Victor Zhou (@xinbenlv)
|
|
discussions-to: https://ethereum-magicians.org/t/eip-5982-role-based-access-control/11759
|
|
status: Review
|
|
type: Standards Track
|
|
category: ERC
|
|
created: 2022-11-15
|
|
requires: 165, 5750
|
|
---
|
|
|
|
## Abstract
|
|
|
|
This EIP defines an interface for role-based access control for smart contracts. Roles are defined as `byte32`. The interface specifies how to read, grant, create and destroy roles. It specifies the sense of role power in the format of its ability to call a given method
|
|
identified by `bytes4` method selector. It also specifies how metadata of roles are represented.
|
|
|
|
## Motivation
|
|
|
|
There are many ways to establish access control for privileged actions. One common pattern is "role-based" access control, where one or more users are assigned to one or more "roles," which grant access to privileged actions. This pattern is more secure and flexible than ownership-based access control since it allows for many people to be granted permissions according to the principle of least privilege.
|
|
|
|
## Specification
|
|
|
|
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 and RFC 8174.
|
|
|
|
Interfaces of reference is described as followed:
|
|
|
|
```solidity
|
|
interface IERC_ACL_CORE {
|
|
function hasRole(bytes32 role, address account) external view returns (bool);
|
|
function grantRole(bytes32 role, address account) external;
|
|
function revokeRole(bytes32 role, address account) external;
|
|
}
|
|
```
|
|
|
|
```solidity
|
|
interface IERC_ACL_GENERAL {
|
|
event RoleGranted(address indexed grantor, bytes32 indexed role, address indexed grantee, bytes _data);
|
|
event RoleRevoked(address indexed revoker, bytes32 indexed role, address indexed revokee, bytes _data);
|
|
|
|
event RoleCreated(address indexed roleGrantor, bytes32 role, bytes32 adminOfRole, string name, string desc, string uri, bytes32 calldata _data);
|
|
event RoleDestroyed(address indexed roleDestroyer, bytes32 role, bytes32 calldata _data);
|
|
event RolePowerSet(address indexed rolePowerSetter, bytes32 role, bytes4 methods, bytes calldata _data);
|
|
|
|
function grantRole(bytes32 role, address account, bytes calldata _data) external;
|
|
function revokeRole(bytes32 role, address account, bytes calldata _data) external;
|
|
|
|
function createRole(bytes32 role, bytes32 adminOfRole, string name, string desc, string uri, bytes32 calldata _data) external;
|
|
function destroyRole(bytes32 role, bytes32 calldata _data) external;
|
|
function setRolePower(bytes32 role, bytes4 methods, bytes calldata _data) view external returns(bool);
|
|
|
|
function hasRole(bytes32 role, address account, bytes calldata _data) external view returns (bool);
|
|
function canGrantRole(bytes32 grantor, bytes32 grantee, bytes calldata _data) view external returns(bool);
|
|
function canRevokeRole(bytes32 revoker, bytes32 revokee, address account, bytes calldata _data) view external returns(bool);
|
|
function canExecute(bytes32 executor, bytes4 methods, bytes32 calldata payload, bytes calldata _data) view external returns(bool);
|
|
}
|
|
```
|
|
|
|
```solidity
|
|
interface IERC_ACL_METADATA {
|
|
function roleName(bytes32) external view returns(string);
|
|
function roleDescription(bytes32) external view returns(string);
|
|
function roleURI(bytes32) external view returns(string);
|
|
}
|
|
```
|
|
|
|
1. Compliant contracts MUST implement `IERC_ACL_CORE`
|
|
2. It is RECOMMENDED for compliant contracts to implement the optional extension `IERC_ACL_GENERAL`.
|
|
3. Compliant contracts MAY implement the optional extension `IERC_ACL_METADATA`.
|
|
4. A role in a compliant smart contract is represented in the format of `bytes32`. It's RECOMMENDED the value of such role is computed as a
|
|
`keccak256` hash of a string of the role name, in this format: `bytes32 role = keccak256("<role_name>")`. such as `bytes32 role = keccak256("MINTER")`.
|
|
5. Compliant contracts SHOULD implement [EIP-165](./eip-165.md) identifier.
|
|
|
|
## Rationale
|
|
|
|
1. The names and parameters of methods in `IERC_ACL_CORE` are chosen to allow backward compatibility with OpenZeppelin's implementation.
|
|
2. The methods in `IERC_ACL_GENERAL` conform to [EIP-5750](./eip-5750.md) to allow extension.
|
|
3. The method of `renounceRole` was not adopted, consolidating with `revokeRole` to simplify interface.
|
|
|
|
|
|
## Backwards Compatibility
|
|
|
|
Needs discussion.
|
|
|
|
## Security Considerations
|
|
|
|
Needs discussion.
|
|
|
|
## Copyright
|
|
|
|
Copyright and related rights waived via [CC0](../LICENSE.md).
|