访问控制 - OpenZeppelin 文档

本文档介绍了OpenZeppelin Contracts库中用于访问控制的多种合约和接口。这些工具可以限制谁可以访问合约的功能以及何时可以访问。其中包括简单的Ownable合约,以及更复杂的AccessControl和AccessManager合约,它们提供了基于角色和权限的细粒度控制。

访问控制

https://docs.openzeppelin.com/contracts/api/access 上查看此文档效果更佳

此目录提供了限制谁可以访问合约函数或何时可以访问这些函数的方法。

  • AccessManager 是一种用于智能合约系统的完善的访问控制解决方案。允许跨各种合约为每个帐户创建和分配具有执行延迟的多个分层角色。

  • AccessManaged 将其访问控制委托给一个权威机构,该权威机构决定受管理合约的权限。它与作为权威机构的 AccessManager 兼容。

  • AccessControl 提供了一种基于每个合约角色的访问控制机制。可以在同一实例中创建多个分层角色,并将每个角色分配给多个帐户。

  • Ownable 是一种更简单的机制,具有可以分配给单个帐户的单个所有者“角色”。这种更简单的机制对于快速测试可能很有用,但具有生产问题的项目可能会超越它。

核心

Ownable

import "@openzeppelin/contracts/access/Ownable.sol";

合约模块,提供基本的访问控制机制,其中 有一个帐户(所有者)可以被授予对 特定功能的独占访问权限。

初始所有者设置为部署者提供的地址。这可以在 以后使用 transferOwnership 更改。

此模块通过继承使用。它将提供修饰符 onlyOwner,可以将其应用于你的函数以将其使用限制为 所有者。

修饰符

函数

事件

错误

onlyOwner() 修饰符

如果由所有者以外的任何帐户调用,则抛出异常。

constructor(address initialOwner) internal

初始化合约,将部署者提供的地址设置为初始所有者。

owner() → address public

返回当前所有者的地址。

_checkOwner() internal

如果发送者不是所有者,则抛出异常。

renounceOwnership() public

离开没有所有者的合约。将无法调用 onlyOwner 函数。只能由当前所有者调用。

放弃所有权将使合约没有所有者,<br>从而禁用任何仅对所有者可用的功能。
transferOwnership(address newOwner) public

将合约的所有权转移到新帐户 ( newOwner)。 只能由当前所有者调用。

_transferOwnership(address newOwner) internal

将合约的所有权转移到新帐户 ( newOwner)。 没有访问限制的内部函数。

OwnershipTransferred(address indexed previousOwner, address indexed newOwner) event
OwnableUnauthorizedAccount(address account) error

调用方帐户未被授权执行操作。

OwnableInvalidOwner(address owner) error

所有者不是有效的拥有者帐户。(例如 address(0)

Ownable2Step

import "@openzeppelin/contracts/access/Ownable2Step.sol";

合约模块,提供访问控制机制,其中 有一个帐户 (所有者) 可以被授予对 特定功能的独占访问权限。

Ownable 合约的扩展包括一个两步机制来转移 所有权,其中新的所有者必须调用 acceptOwnership 才能替换 旧的所有者。这可以帮助防止常见错误,例如将所有权转移到 不正确的帐户,或无法与 权限系统交互的合约。

初始所有者在部署时在 Ownable 的构造函数中指定。这 可以在以后使用 transferOwnershipacceptOwnership 更改。

此模块通过继承使用。它将提供来自父级(Ownable)的所有函数。

函数

Ownable

事件

Ownable

错误

Ownable

pendingOwner() → address public

返回待处理所有者的地址。

transferOwnership(address newOwner) public

启动合约的所有权转移到新帐户。如果存在待处理的转移,则替换它。 只能由当前所有者调用。

允许将 newOwner 设置为零地址;这可以用于取消启动的所有权转移。

_transferOwnership(address newOwner) internal

将合约的所有权转移到新帐户 ( newOwner) 并删除任何待处理的所有者。 没有访问限制的内部函数。

acceptOwnership() public

新所有者接受所有权转移。

OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner) event

IAccessControl

import "@openzeppelin/contracts/access/IAccessControl.sol";

为了支持 ERC-165 检测而声明的 AccessControl 的外部接口。

函数

事件

错误

hasRole(bytes32 role, address account) → bool external

如果 account 已被授予 role,则返回 true

getRoleAdmin(bytes32 role) → bytes32 external

返回控制 role 的管理员角色。请参阅 grantRolerevokeRole

要更改角色的管理员,请使用 AccessControl._setRoleAdmin

grantRole(bytes32 role, address account) external

授予 account 加粗role

如果 account 尚未被授予 加粗role,则发出 RoleGranted 事件。

要求:

  • 调用者必须具有 加粗role 的管理员角色。
revokeRole(bytes32 role, address account) external

account 加粗撤销role

如果 account 已被授予 加粗role,则发出 RoleRevoked 事件。

要求:

  • 调用者必须具有 加粗role 的管理员角色。
renounceRole(bytes32 role, address callerConfirmation) external

从调用帐户撤销 加粗role

角色通常通过 grantRolerevokeRole 管理:此函数 旨在提供一种机制,让帐户在 受到威胁时(例如,当受信任的设备放错地方时)失去其权限。

如果调用帐户已被撤销 加粗role,则会发出 RoleRevoked 事件。

要求:

  • 调用者必须是 加粗callerConfirmation
RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole) event

newAdminRole 被设置为 加粗role 的管理员角色时发出,替换 加粗previousAdminRole

DEFAULT_ADMIN_ROLE 是所有角色的起始管理员,尽管 RoleAdminChanged 未发出信号表明这一点。

RoleGranted(bytes32 indexed role, address indexed account, address indexed sender) event

加粗account 被授予 加粗role 时发出。

加粗sender 是发起合约调用的帐户。此帐户具有管理员角色(对于被授予的角色)。 在角色是使用内部 AccessControl._grantRole 授予的情况下预期。

RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender) event

加粗account 被撤销 加粗role 时发出。

加粗sender 是发起合约调用的帐户:

  • 如果使用 加粗revokeRole,它是管理员角色持有者
  • 如果使用 加粗renounceRole,它是角色持有者(即 加粗account
AccessControlUnauthorizedAccount(address account, bytes32 neededRole) error

加粗account 缺少一个角色。

AccessControlBadConfirmation() error

函数的调用者不是预期的人。

不要与 AccessControlUnauthorizedAccount 混淆。

AccessControl

import "@openzeppelin/contracts/access/AccessControl.sol";

合约模块,允许子合约实现基于角色的访问 控制机制。这是一个轻量级版本,不允许枚举角色 成员,除非通过访问合约事件日志的链下方式。一些 应用程序可能受益于链上可枚举性,对于这些情况,请参见 AccessControlEnumerable

角色由其 加粗bytes32 标识符引用。这些应该在 外部 API 中公开并且是唯一的。实现此目的的最佳方法是 使用 加粗public constant 哈希摘要:

bytes32 public constant MY_ROLE = keccak256("MY_ROLE");

角色可用于表示一组权限。要限制对 函数调用的访问,请使用 hasRole

function foo() public {
    require(hasRole(MY_ROLE, msg.sender));
    ...
}

可以通过 grantRolerevokeRole 函数动态地授予和撤销角色。每个角色都有一个关联的管理员角色,并且只有 具有角色管理员角色的帐户才能调用 grantRolerevokeRole

默认情况下,所有角色的管理员角色都是 加粗DEFAULT_ADMIN_ROLE,这意味着 只有具有此角色的帐户才能授予或撤销其他 角色。可以通过使用 _setRoleAdmin 创建更复杂的角色关系。

DEFAULT_ADMIN_ROLE 也是它自己的管理员:它有权<br>授予和撤销此角色。应该采取额外的预防措施来保护<br>已被授予它的帐户。我们建议使用 AccessControlDefaultAdminRules<br>来为此角色强制执行额外的安全措施。

修饰符

函数

事件

IAccessControl

错误

IAccessControl

onlyRole(bytes32 role) 修饰符

修饰符,检查帐户是否具有特定角色。还原 包含所需角色的 AccessControlUnauthorizedAccount 错误。

supportsInterface(bytes4 interfaceId) → bool public

请参阅 IERC165.supportsInterface

hasRole(bytes32 role, address account) → bool public

如果 加粗account 已被授予 加粗role,则返回 true

_checkRole(bytes32 role) internal

如果 _msgSender() 缺少 加粗role,则会还原 AccessControlUnauthorizedAccount 错误。覆盖此函数会更改 onlyRole 修饰符的行为。

_checkRole(bytes32 role, address account) internal

如果 加粗account 缺少 加粗role,则会还原 AccessControlUnauthorizedAccount 错误。

getRoleAdmin(bytes32 role) → bytes32 public

返回控制 加粗role 的管理员角色。请参阅 grantRolerevokeRole

要更改角色的管理员,请使用 _setRoleAdmin

grantRole(bytes32 role, address account) public

授予 加粗account 加粗role

如果 加粗account 尚未被授予 加粗role,则发出 RoleGranted 事件。

要求:

  • 调用者必须具有 加粗role 的管理员角色。

可能会发出 RoleGranted 事件。

revokeRole(bytes32 role, address account) public

加粗account 加粗撤销role

如果 加粗account 已被授予 加粗role,则发出 RoleRevoked 事件。

要求:

  • 调用者必须具有 加粗role 的管理员角色。

可能会发出 RoleRevoked 事件。

renounceRole(bytes32 role, address callerConfirmation) public

从调用帐户撤销 加粗role

角色通常通过 grantRolerevokeRole 管理:此函数 旨在提供一种机制,让帐户在 受到威胁时(例如,当受信任的设备放错地方时)失去其权限。

如果调用帐户已被撤销 加粗role,则会发出 RoleRevoked 事件。

要求:

  • 调用者必须是 加粗callerConfirmation

可能会发出 RoleRevoked 事件。

_setRoleAdmin(bytes32 role, bytes32 adminRole) internal

加粗adminRole 设置为 加粗role 的管理员角色。

发出 RoleAdminChanged 事件。

_grantRole(bytes32 role, address account) → bool internal

尝试授予 加粗account 加粗role,并返回一个布尔值,指示是否已授予 加粗role

没有访问限制的内部函数。

可能会发出 RoleGranted 事件。

_revokeRole(bytes32 role, address account) → bool internal

尝试从 加粗account 加粗撤销role,并返回一个布尔值,指示是否已撤销 加粗role

没有访问限制的内部函数。

可能会发出 RoleRevoked 事件。

DEFAULT_ADMIN_ROLE() → bytes32 public

扩展

IAccessControlEnumerable

import "@openzeppelin/contracts/access/extensions/IAccessControlEnumerable.sol";

为了支持 ERC-165 检测而声明的 AccessControlEnumerable 的外部接口。

函数

IAccessControl

事件

IAccessControl

错误

IAccessControl

getRoleMember(bytes32 role, uint256 index) → address external

返回具有 加粗role 的帐户之一。 加粗index 必须是 0 到 getRoleMemberCount 之间的值(不包括 0 和 getRoleMemberCount)。

角色持有者不以任何特定方式排序,并且它们的顺序可能 随时更改。

当使用 getRoleMembergetRoleMemberCount 时,请确保<br>在同一区块上执行所有查询。请参阅以下内容<br>论坛帖子<br>以获取更多信息。
getRoleMemberCount(bytes32 role) → uint256 external

返回具有 加粗role 的帐户数。可以一起使用 与 getRoleMember 一起枚举角色的所有持有者。

AccessControlEnumerable

import "@openzeppelin/contracts/access/extensions/AccessControlEnumerable.sol";

AccessControl 的扩展,允许枚举每个角色的成员。

函数

AccessControl

事件

IAccessControl

事件

IAccessControl

错误

IAccessControl

defaultAdmin() → address external

返回当前 DEFAULT_ADMIN_ROLE 持有者的地址。

pendingDefaultAdmin() → address newAdmin, uint48 acceptSchedule external

返回一个 newAdmin 和一个接受时间表的元组。

schedule 通过后,newAdmin 将能够通过调用 acceptDefaultAdminTransfer 接受 defaultAdmin 角色,从而完成角色转移。

仅在 acceptSchedule 中的零值表示没有挂起的管理员转移。

newAdmin 中的零地址意味着 defaultAdmin 正在被放弃。
defaultAdminDelay() → uint48 external

返回安排接受启动的 defaultAdmin 转移所需的延迟。

在调用 beginDefaultAdminTransfer 设置接受时间表时,此延迟将添加到当前时间戳。

如果已安排延迟更改,它将在时间表通过后立即生效,从而使此函数返回新的延迟。 请参见 changeDefaultAdminDelay
pendingDefaultAdminDelay() → uint48 newDelay, uint48 effectSchedule external

返回 newDelay 和生效时间表的元组。

schedule 通过后,newDelay 将立即对每个使用 beginDefaultAdminTransfer 启动的新 defaultAdmin 转移生效。

仅在 effectSchedule 中的零值表示没有挂起的延迟更改。

newDelay 的零值意味着在生效时间表之后,下一个 defaultAdminDelay 将为零。
beginDefaultAdminTransfer(address newAdmin) external

通过在当前时间戳加上 defaultAdminDelay 之后,设置安排接受的 pendingDefaultAdmin,来启动 defaultAdmin 转移。

要求:

发出 DefaultAdminRoleChangeStarted 事件。

cancelDefaultAdminTransfer() external

取消先前使用 beginDefaultAdminTransfer 启动的 defaultAdmin 转移。

尚未接受的 pendingDefaultAdmin 也可以使用此函数取消。

要求:

可能会发出 DefaultAdminTransferCanceled 事件。

acceptDefaultAdminTransfer() external

完成先前使用 beginDefaultAdminTransfer 启动的 defaultAdmin 转移。

调用该函数后:

  • DEFAULT_ADMIN_ROLE 应授予给调用者。

  • DEFAULT_ADMIN_ROLE 应从先前的持有者处撤销。

  • pendingDefaultAdmin 应重置为零值。

要求:

changeDefaultAdminDelay(uint48 newDelay) external

通过设置在当前时间戳加上 defaultAdminDelay 之后生效的 pendingDefaultAdminDelay,来启动 defaultAdminDelay 更新。

此函数保证,在此方法被调用时的时间戳与 pendingDefaultAdminDelay 生效时间表之间完成的任何对 beginDefaultAdminTransfer 的调用都将使用在调用之前设置的当前 defaultAdminDelay

pendingDefaultAdminDelay 的生效时间表的定义方式是,等待直到时间表并通过新的延迟调用 beginDefaultAdminTransfer 至少与另一个 defaultAdmin 完全转移(包括接受)一样。

该时间表是为两种情况设计的:

  • 当延迟更改为更大的延迟时,时间表为 block.timestamp + newDelay,并受到 defaultAdminDelayIncreaseWait 的限制。

  • 当延迟更改为更短的延迟时,时间表为 block.timestamp + (current delay - new delay)

从未生效的 pendingDefaultAdminDelay 将被取消,以支持新的计划更改。

要求:

发出 DefaultAdminDelayChangeScheduled 事件,并可能发出 DefaultAdminDelayChangeCanceled 事件。

rollbackDefaultAdminDelay() external

取消计划的 defaultAdminDelay 更改。

要求:

可能会发出 DefaultAdminDelayChangeCanceled 事件。

defaultAdminDelayIncreaseWait() → uint48 external

增加 defaultAdminDelay 的最大时间(以秒为单位)(即使用 changeDefaultAdminDelay 安排)。 默认为 5 天。

当计划增加 defaultAdminDelay 时,它会在新的延迟过去后生效,目的是为恢复任何意外更改(即使用毫秒而不是秒)提供足够的时间,这些更改可能会锁定合约。 但是,为了避免过度调度,等待时间受到此函数的限制,并且可以覆盖该函数以进行自定义 defaultAdminDelay 增加调度。

在覆盖此值时,请确保添加合理的时间量,否则,存在设置较高的新延迟的风险,该延迟几乎立即生效,而无法在发生输入错误的情况下进行人工干预(例如,设置毫秒而不是秒)。
DefaultAdminTransferScheduled(address indexed newAdmin, uint48 acceptSchedule) event

defaultAdmin 转移开始时发出,将 newAdmin 设置为下一个通过仅在 acceptSchedule 通过后调用 acceptDefaultAdminTransfer 来成为 defaultAdmin 的地址。

DefaultAdminTransferCanceled() event

pendingDefaultAdmin 被重置时发出,如果它从未被接受,无论其时间表如何。

DefaultAdminDelayChangeScheduled(uint48 newDelay, uint48 effectSchedule) event

defaultAdminDelay 更改开始时发出,将 newDelay 设置为在 effectSchedule 通过后应用于默认管理员传输之间的下一个延迟。

DefaultAdminDelayChangeCanceled() event

pendingDefaultAdminDelay 被重置时发出,如果其时间表未通过。

AccessControlInvalidDefaultAdmin(address defaultAdmin) error

新的默认管理员不是有效的默认管理员。

AccessControlEnforcedDefaultAdminRules() error

违反了以下规则中的至少一条:

  • DEFAULT_ADMIN_ROLE 必须仅由其自身管理。

  • DEFAULT_ADMIN_ROLE 必须一次仅由一个帐户持有。

  • 任何 DEFAULT_ADMIN_ROLE 转移都必须分两个延迟步骤进行。

AccessControlEnforcedDefaultAdminDelay(uint48 schedule) error

强制执行转移默认管理员延迟的延迟,并且操作必须等到 schedule

schedule 可以为 0,表示没有计划的转移。

AccessControlDefaultAdminRules

import "@openzeppelin/contracts/access/extensions/AccessControlDefaultAdminRules.sol";

AccessControl 的扩展,允许指定特殊规则来管理 DEFAULT_ADMIN_ROLE 持有者,这是一个敏感角色,对系统中的其他角色具有特殊权限,这些角色可能具有特权。

如果特定角色没有分配的管理角色,则 DEFAULT_ADMIN_ROLE 的持有者将有权授予和撤销它。

此合约在 AccessControl 之上实现了以下风险缓解措施:

  • 从部署到可能放弃之前,只有一个帐户持有 DEFAULT_ADMIN_ROLE

  • 强制执行 2 步流程,将 DEFAULT_ADMIN_ROLE 转移到另一个帐户。

  • 强制执行两个步骤之间的可配置延迟,并能够在接受之前取消。

  • 可以通过计划更改延迟,请参见 changeDefaultAdminDelay

  • 无法使用其他角色来管理 DEFAULT_ADMIN_ROLE

用法示例:

contract MyToken is AccessControlDefaultAdminRules {
  constructor() AccessControlDefaultAdminRules(
    3 days,
    msg.sender // 显式初始 `DEFAULT_ADMIN_ROLE` 持有者
   ) {}
}

函数

AccessControl

事件

IAccessControlDefaultAdminRules

IAccessControl

错误

IAccessControlDefaultAdminRules

IAccessControl

constructor(uint48 initialDelay, address initialDefaultAdmin) internal

设置 defaultAdminDelaydefaultAdmin 地址的初始值。

supportsInterface(bytes4 interfaceId) → bool public

参见 IERC165.supportsInterface

owner() → address public

参见 IERC5313.owner

grantRole(bytes32 role, address account) public

参见 AccessControl.grantRole。 对于 DEFAULT_ADMIN_ROLE 恢复。

revokeRole(bytes32 role, address account) public

参见 AccessControl.revokeRole。 对于 DEFAULT_ADMIN_ROLE 恢复。

renounceRole(bytes32 role, address account) public

参见 AccessControl.renounceRole

对于 DEFAULT_ADMIN_ROLE,它仅允许通过首先调用 beginDefaultAdminTransferaddress(0) 来分两个步骤放弃,因此要求在调用此函数时,pendingDefaultAdmin 时间表也已通过。

执行此操作后,将无法调用 onlyRole(DEFAULT_ADMIN_ROLE) 函数。

放弃 DEFAULT_ADMIN_ROLE 将使合约没有 defaultAdmin,从而禁用任何仅对其可用的功能,以及重新分配非管理角色的可能性。
_grantRole(bytes32 role, address account) → bool internal

参见 AccessControl._grantRole

对于 DEFAULT_ADMIN_ROLE,仅当没有 defaultAdmin 或角色先前已被放弃时,才允许授予。

通过另一种机制公开此函数可能会使 DEFAULT_ADMIN_ROLE 再次可分配。 确保保证这是你实现中的预期行为。
_revokeRole(bytes32 role, address account) → bool internal

参见 AccessControl._revokeRole

_setRoleAdmin(bytes32 role, bytes32 adminRole) internal

参见 AccessControl._setRoleAdmin。 对于 DEFAULT_ADMIN_ROLE 恢复。

defaultAdmin() → address public

返回当前 DEFAULT_ADMIN_ROLE 持有者的地址。

pendingDefaultAdmin() → address newAdmin, uint48 schedule public

返回一个 newAdmin 和一个接受时间表的元组。

schedule 通过后,newAdmin 将能够通过调用 acceptDefaultAdminTransfer 接受 defaultAdmin 角色,从而完成角色转移。

仅在 acceptSchedule 中的零值表示没有挂起的管理员转移。

newAdmin 中的零地址意味着 defaultAdmin 正在被放弃。
defaultAdminDelay() → uint48 public

返回安排接受启动的 defaultAdmin 转移所需的延迟。

在调用 beginDefaultAdminTransfer 设置接受时间表时,此延迟将添加到当前时间戳。

如果已安排延迟更改,它将在时间表通过后立即生效,从而使此函数返回新的延迟。 请参见 changeDefaultAdminDelay
pendingDefaultAdminDelay() → uint48 newDelay, uint48 schedule public

返回 newDelay 和生效时间表的元组。

schedule 通过后,newDelay 将立即对每个使用 beginDefaultAdminTransfer 启动的新 defaultAdmin 转移生效。

仅在 effectSchedule 中的零值表示没有挂起的延迟更改。

newDelay 的零值意味着在生效时间表之后,下一个 defaultAdminDelay 将为零。
defaultAdminDelayIncreaseWait() → uint48 public

增加 defaultAdminDelay 的最大时间(以秒为单位)(即使用 changeDefaultAdminDelay 安排)。 默认为 5 天。

当计划增加 defaultAdminDelay 时,它会在新的延迟过去后生效,目的是为恢复任何意外更改(即使用毫秒而不是秒)提供足够的时间,这些更改可能会锁定合约。 但是,为了避免过度调度,等待时间受到此函数的限制,并且可以覆盖该函数以进行自定义 defaultAdminDelay 增加调度。

在覆盖此值时,请确保添加合理的时间量,否则,存在设置较高的新延迟的风险,该延迟几乎立即生效,而无法在发生输入错误的情况下进行人工干预(例如,设置毫秒而不是秒)。
beginDefaultAdminTransfer(address newAdmin) public

通过在当前时间戳加上 defaultAdminDelay 之后,设置安排接受的 pendingDefaultAdmin,来启动 defaultAdmin 转移。

要求:

发出 DefaultAdminRoleChangeStarted 事件。

_beginDefaultAdminTransfer(address newAdmin) internal

参见 beginDefaultAdminTransfer

没有访问限制的内部函数。

cancelDefaultAdminTransfer() public

取消先前使用 beginDefaultAdminTransfer 启动的 defaultAdmin 转移。

尚未接受的 pendingDefaultAdmin 也可以使用此函数取消。

要求:

可能会发出 DefaultAdminTransferCanceled 事件。

_cancelDefaultAdminTransfer() internal

参见 cancelDefaultAdminTransfer

没有访问限制的内部函数。

acceptDefaultAdminTransfer() public

完成先前使用 beginDefaultAdminTransfer 启动一个从未生效的 pendingDefaultAdminDelay 将会被取消,取而代之的是一个新的计划变更。

要求:

会触发一个 DefaultAdminDelayChangeScheduled 事件,并且可能会触发一个 DefaultAdminDelayChangeCanceled 事件。

_changeDefaultAdminDelay(uint48 newDelay) internal

参见 changeDefaultAdminDelay

没有访问限制的内部函数。

rollbackDefaultAdminDelay() public

取消计划中的 defaultAdminDelay 变更。

要求:

可能会触发一个 DefaultAdminDelayChangeCanceled 事件。

_rollbackDefaultAdminDelay() internal

参见 rollbackDefaultAdminDelay

没有访问限制的内部函数。

_delayChangeWait(uint48 newDelay) → uint48 internal

返回在 newDelay 之后需要等待的秒数,之后 newDelay 将会变成新的 defaultAdminDelay

返回的值保证了如果 delay 减少,它将在等待一段时间后生效,这段时间遵守了先前设置的 delay。

参见 defaultAdminDelayIncreaseWait

AccessManager

IAuthority

import "@openzeppelin/contracts/access/manager/IAuthority.sol";

最初在 Dappsys 中定义的权限控制的标准接口。

函数

canCall(address caller, address target, bytes4 selector) → bool allowed external

如果调用者可以调用目标上由函数选择器标识的函数,则返回 true。

IAccessManager

import "@openzeppelin/contracts/access/manager/IAccessManager.sol";

函数

事件

错误

canCall(address caller, address target, bytes4 selector) → bool allowed, uint32 delay external

检查一个地址 ( caller) 是否被授权直接调用给定合约上的给定函数(没有限制)。此外,它返回通过 schedule & execute 工作流程间接执行调用所需的 delay。

此函数通常由目标合约调用,以控制受限函数的立即执行。因此,我们只在可以执行没有任何 delay 的调用时才返回 true。如果调用受到先前设置的 delay (非零) 的影响,则该函数应返回 false 并且调用者应计划操作以供将来执行。

如果 immediate 为 true,则可以忽略 delay 并且可以立即执行该操作,否则,当且仅当 delay 大于 0 时才可以执行该操作。

IAuthority 接口不包含 uint32 delay。这是该接口的扩展,它向后兼容。因此,一些合约可能会忽略第二个返回参数。在这种情况下,他们将无法识别间接工作流程,并将认为需要 delay 的调用是被禁止的。
此函数不报告管理器本身中的管理函数的权限。这些由 AccessManager 文档定义。
expiration() → uint32 external

计划提案的到期 delay。默认为 1 周。

避免使用 0 覆盖到期时间。否则,每个合约提案将立即过期,从而禁用任何计划使用。
minSetback() → uint32 external

所有 delay 更新的最小 setback,但执行 delay 除外。它可以增加而没有 setback (并且在意外增加的情况下通过 revokeRole 重置)。默认为 5 天。

isTargetClosed(address target) → bool external

获取合约是否已关闭,从而禁用任何访问权限。否则,将应用角色权限。

当管理器本身关闭时,管理函数仍然可以访问,以避免锁定合约。
getTargetFunctionRole(address target, bytes4 selector) → uint64 external

获取调用函数所需的角色。

getTargetAdminDelay(address target) → uint32 external

获取目标合约的管理 delay 。对合约配置的更改会受到此 delay 的影响。

getRoleAdmin(uint64 roleId) → uint64 external

获取充当给定角色管理员的角色的 ID。

授予角色,撤销角色以及更新执行 delay 以执行限制为此角色的操作需要管理权限。

getRoleGuardian(uint64 roleId) → uint64 external

获取充当给定角色监护人的角色。

监护人权限允许取消在该角色下计划的操作。

getRoleGrantDelay(uint64 roleId) → uint32 external

获取角色当前的授予 delay。

其值可能随时更改,而不会在调用 setGrantDelay 之后发出事件。包括效果时间点在内的对此值的更改会通过 RoleGrantDelayChanged 事件提前通知。

getAccess(uint64 roleId, address account) → uint48 since, uint32 currentDelay, uint32 pendingDelay, uint48 effect external

获取给定账户对于给定角色的访问详细信息。这些详细信息包括成员资格生效的时间点,以及应用于此用户的所有操作的 delay,这些操作需要此权限级别。

返回值: [0] 账户成员资格生效的时间戳。 0 表示未授予角色。 [1] 账户的当前执行 delay 。 [2] 账户的待定执行 delay 。 [3] 待定执行 delay 生效的时间戳。 0 表示未安排 delay 更新。

hasRole(uint64 roleId, address account) → bool isMember, uint32 executionDelay external

检查给定账户当前是否具有与给定角色相对应的权限级别。请注意,此权限可能与执行 delay 相关联。 getAccess 可以提供更多详细信息。

labelRole(uint64 roleId, string label) external

为角色指定标签,以便通过 UI 改进角色可发现性。

要求:

  • 调用者必须是全局管理员

触发 RoleLabel 事件。

grantRole(uint64 roleId, address account, uint32 executionDelay) external

account 添加到 roleId,或更改其执行 delay 。

这使该账户有权调用任何限制为此角色的函数。可以设置可选的执行 delay (以秒为单位)。如果该 delay 不为 0,则用户需要计划任何限制为此角色成员的操作。用户只能在 delay 过去之后,在到期之前执行该操作。在此期间,管理员和监护人可以取消该操作(参见 cancel)。

如果已将该角色授予该账户,则将更新执行 delay 。此更新不是立即的,而是遵循 delay 规则。例如,如果用户当前具有 3 小时的 delay ,并且调用此方法将该 delay 减少到 1 小时,则新的 delay 将需要一些时间才能生效,从而强制执行在此更新后的 3 小时内执行的任何操作实际上都是在此更新之前计划的。

要求:

  • 调用者必须是该角色的管理员(参见 getRoleAdmin)

  • 授予的角色不能是 PUBLIC_ROLE

触发 RoleGranted 事件。

revokeRole(uint64 roleId, address account) external

立即从角色中删除账户。如果该账户没有该角色,则此调用无效。

要求:

  • 调用者必须是该角色的管理员(参见 getRoleAdmin)

  • 撤销的角色不能是 PUBLIC_ROLE

如果该账户拥有该角色, 则触发 RoleRevoked 事件。

renounceRole(uint64 roleId, address callerConfirmation) external

立即放弃调用账户的角色权限。如果发送者不在该角色中,则此调用无效。

要求:

  • 调用者必须是 callerConfirmation

如果该账户拥有该角色, 则触发 RoleRevoked 事件。

setRoleAdmin(uint64 roleId, uint64 admin) external

更改给定角色的管理角色。

要求:

  • 调用者必须是全局管理员

触发 RoleAdminChanged 事件

setRoleGuardian(uint64 roleId, uint64 guardian) external

更改给定角色的监护人角色。

要求:

  • 调用者必须是全局管理员

触发 RoleGuardianChanged 事件

setGrantDelay(uint64 roleId, uint32 newDelay) external

更新授予 roleId 的 delay。

要求:

  • 调用者必须是全局管理员

触发 RoleGrantDelayChanged 事件。

setTargetFunctionRole(address target, bytes4[] selectors, uint64 roleId) external

设置调用 target 合约中的 selectors 标识的函数所需的角色。

要求:

  • 调用者必须是全局管理员

每个 selector 触发一个 TargetFunctionRoleUpdated 事件。

setTargetAdminDelay(address target, uint32 newDelay) external

设置用于更改给定目标合约配置的 delay。

要求:

  • 调用者必须是全局管理员

触发 TargetAdminDelayUpdated 事件。

setTargetClosed(address target, bool closed) external

设置合约的关闭标志。

关闭管理器本身不会禁用对管理方法的访问,以避免锁定合约。

要求:

  • 调用者必须是全局管理员

触发 TargetClosed 事件。

getSchedule(bytes32 id) → uint48 external

返回计划的操作准备好执行的时间点。如果该操作尚未计划、已过期、已执行或已取消,则返回 0。

getNonce(bytes32 id) → uint32 external

返回具有给定 ID 的最新计划操作的 nonce。如果该操作从未计划过,则返回 0。

schedule(address target, bytes data, uint48 when) → bytes32 operationId, uint32 nonce external

计划用于将来执行的延迟操作,并返回操作标识符。只要满足调用者所需的执行 delay ,就可以选择操作变为可执行的时间戳。特殊值零将自动设置最早可能的时间。

返回已计划的 operationId。由于此值是参数的哈希值,因此当使用相同的参数时,它可能会再次出现;如果这相关,则在调用 executecancel 时,返回的 nonce 可用于从同一 operationId 的其他出现中唯一地标识此计划的操作。

触发 OperationScheduled 事件。

不可能同时计划多个具有相同 targetdata 的操作。如果需要这样做,则可以将一个随机字节附加到 data 中,以充当盐,如果目标<br>合约正在使用标准 Solidity ABI 编码,则该盐将被目标合约忽略。
execute(address target, bytes data) → uint32 external

如果事先已正确计划,或者执行 delay 为 0,则执行受 delay 限制的函数。

返回标识先前计划的操作的 nonce,该操作已执行,如果该操作先前未计划(如果调用者没有执行 delay ),则返回 0。

仅当调用已计划和延迟时,才触发 OperationExecuted 事件。

cancel(address caller, address target, bytes data) → uint32 external

取消计划的(延迟的)操作。返回标识先前计划的已取消操作的 nonce。

要求:

  • 调用者必须是提议者,目标函数的监护人或全局管理员

触发 OperationCanceled 事件。

consumeScheduledOp(address caller, bytes data) external

消耗针对调用者的计划操作。如果存在这样的操作,则将其标记为已消耗(触发 OperationExecuted 事件并清理状态)。否则,引发错误。

这对于希望强制执行针对它们自己的调用的合约很有用,这些调用已在管理器上计划,并进行了所有验证。

触发 OperationExecuted 事件。

hashOperation(address caller, address target, bytes data) → bytes32 external

用于延迟操作的哈希函数。

updateAuthority(address target, address newAuthority) external

更改由此管理器实例管理的目标的 authority。

要求:

  • 调用者必须是全局管理员
OperationScheduled(bytes32 indexed operationId, uint32 indexed nonce, uint48 schedule, address caller, address target, bytes data) event

计划了一个延迟操作。

OperationExecuted(bytes32 indexed operationId, uint32 indexed nonce) event

计划的操作已执行。

OperationCanceled(bytes32 indexed operationId, uint32 indexed nonce) event

计划的操作已取消。

RoleLabel(uint64 indexed roleId, string label) event

角色 ID 的信息标签。

RoleGranted(uint64 indexed roleId, address indexed account, uint32 delay, uint48 since, bool newMember) event

account 被授予 roleId 时触发。

since 参数的含义取决于 newMember 参数。<br>如果将角色授予新成员,则 since 参数指示该帐户何时成为该角色的成员,<br>否则,它指示此帐户和 roleId 的执行 delay 已更新。
RoleRevoked(uint64 indexed roleId, address indexed account) event

account 的成员资格或 roleId 被撤销时触发。与授予不同,撤销是即时的。

RoleAdminChanged(uint64 indexed roleId, uint64 indexed admin) event

充当给定 roleId 管理员的角色已更新。

RoleGuardianChanged(uint64 indexed roleId, uint64 indexed guardian) event

充当给定 roleId 监护人的角色已更新。

RoleGrantDelayChanged(uint64 indexed roleId, uint32 delay, uint48 since) event

当达到 since 时,给定 roleId 的授予 delay 将更新为 delay

TargetClosed(address indexed target, bool closed) event

目标模式已更新 (true = 关闭, false = 打开)。

TargetFunctionRoleUpdated(address indexed target, bytes4 selector, uint64 indexed roleId) event

调用 target 上的 selector 所需的角色已更新为 roleId

TargetAdminDelayUpdated(address indexed target, uint32 delay, uint48 since) event

当达到 since 时,给定 target 的管理 delay 将更新为 delay

AccessManagerAlreadyScheduled(bytes32 operationId) error
AccessManagerNotScheduled(bytes32 operationId) error
AccessManagerNotReady(bytes32 operationId) error
AccessManagerExpired(bytes32 operationId) error
AccessManagerLockedRole(uint64 roleId) error
AccessManagerBadConfirmation() error
AccessManagerUnauthorizedAccount(address msgsender, uint64 roleId) error
AccessManagerUnauthorizedCall(address caller, address target, bytes4 selector) error
AccessManagerUnauthorizedConsume(address target) error
AccessManagerUnauthorizedCancel(address msgsender, address caller, address target, bytes4 selector) error
AccessManagerInvalidInitialAdmin(address initialAdmin) error

AccessManager

import "@openzeppelin/contracts/access/manager/AccessManager.sol";

AccessManager 是一个中心化的合约,用于存储系统的权限。

一个被 AccessManager 实例控制的智能合约被称为目标,并且将继承 AccessManaged 合约,连接到此合约作为其管理器,并在选定的一组要授予权限的函数上实现 AccessManaged.restricted 修饰器。请注意,没有任何此类设置的函数将不会被有效限制。

此类函数的限制规则根据 "角色" 定义,这些角色由 uint64 标识,并由目标 ( address) 和函数选择器 ( bytes4) 确定范围。这些角色存储在此合约中,并且可以在 delay 之后由管理员 ( ADMIN_ROLE 成员) 配置(请参见 getTargetAdminDelay)。

对于每个目标合约,管理员可以配置以下内容,而无需任何 delay :

默认情况下,每个地址都是 PUBLIC_ROLE 的成员,并且每个目标函数都限制为 ADMIN_ROLE,直到另行配置。 此外,每个角色都有以下配置选项,这些选项限制为该管理器的管理员:

  • 通过 setRoleAdmin 设置角色的管理角色,该角色可以授予或撤销角色。

  • 通过 setRoleGuardian 设置角色的监护人角色,该角色被允许取消操作。

  • 通过 setGrantDelay 设置在授予角色后角色生效的 delay。

  • 通过 setTargetAdminDelay 设置任何目标管理员操作的 delay。

  • 使用 labelRole 进行角色标签,以实现可发现性。

通过使用 grantRolerevokeRole 函数,可以将任何帐户添加和删除到任意数量的角色中 这些函数中的每一个都限制为每个角色的管理员(请参见 getRoleAdmin)。

由于托管系统的所有权限都可以由此实例的管理员修改,因此希望它们能够得到高度保护(例如,多重签名或配置良好的 DAO)。

此合约实现了 IAuthority 接口的一种形式,但是 canCall 具有额外的返回数据,因此它<br>不继承 IAuthority。但是,它与 IAuthority 接口兼容,因为返回数据的前 32 个字节是该接口期望的布尔值。
通过将权限(Ownable 的情况下的所有权)直接转移到 AccessManager,可以将实现其他访问控制机制(例如,使用 Ownable)的系统与 AccessManager 配对。<br>用户将能够通过 execute 函数与这些合约进行交互,并遵循在 AccessManager 中注册的访问规则。<br>请记住,在这种情况下,受限制函数看到的 msg.sender 将是 [AccessManager](https://docs.openzeppelin.- labelRole(roleId, label)

Multicall

Events

IAccessManager

Errors

IAccessManager

onlyAuthorized() modifier

检查调用者是否被授权执行该操作。 有关授权逻辑的详细分解,请参见AccessManager描述。

constructor(address initialAdmin) public
canCall(address caller, address target, bytes4 selector) → bool immediate, uint32 delay public

检查地址(caller)是否有权直接调用给定合约上的给定函数(无限制)。 此外,它返回通过scheduleexecute工作流间接执行调用所需的延迟。

此函数通常由目标合约调用,以控制受限函数的立即执行。 因此,只有在可以无任何延迟地执行调用时,我们才返回 true。 如果调用受到先前设置的延迟(非零)的影响,则该函数应返回 false,并且调用者应计划该操作以供将来执行。

如果 immediate 为 true,则可以忽略延迟并且可以立即执行该操作,否则,当且仅当延迟大于 0 时才可以执行该操作。

IAuthority 接口不包含 uint32 延迟。 这是该接口的扩展,向后兼容。 因此,某些合约可能会忽略第二个返回参数。 在这种情况下,他们将无法识别间接工作流程,并且会认为需要延迟的调用是被禁止的。
此函数不报告管理器本身中管理功能的权限。 这些由AccessManager文档定义。
expiration() → uint32 public

计划提案的到期延迟。 默认为1周。

避免使用 0 来覆盖过期时间。 否则,每个合约提案将立即过期,从而禁用任何计划使用。
minSetback() → uint32 public

所有延迟更新的最小挫折,执行延迟除外。 它可以不经挫折地增加(并在发生意外增加时通过revokeRole 重置)。 默认为 5 天。

isTargetClosed(address target) → bool public

获取合约是否已关闭,从而禁用任何访问。 否则,将应用角色权限。

当管理器本身关闭时,管理功能仍然可以访问,以避免锁定合约。
getTargetFunctionRole(address target, bytes4 selector) → uint64 public

获取调用函数所需的角色。

getTargetAdminDelay(address target) → uint32 public

获取目标合约的管理延迟。 对合约配置的更改会受到此延迟的影响。

getRoleAdmin(uint64 roleId) → uint64 public

获取充当给定角色管理员的角色 ID。

需要管理员权限才能授予角色、撤销角色和更新执行延迟以执行受限于此角色的操作。

getRoleGuardian(uint64 roleId) → uint64 public

获取充当给定角色监护人的角色。

监护人权限允许取消已在该角色下计划的操作。

getRoleGrantDelay(uint64 roleId) → uint32 public

获取角色当前的授予延迟。

在调用setGrantDelay之后,它的值可能随时更改,而不会发出事件。 对此值的更改(包括生效时间点)会通过RoleGrantDelayChanged事件提前通知。

getAccess(uint64 roleId, address account) → uint48 since, uint32 currentDelay, uint32 pendingDelay, uint48 effect public

获取给定角色的给定帐户的访问详细信息。 这些详细信息包括成员资格生效的时间点,以及此用户的所有需要此权限级别的操作所应用的延迟。

返回值: [0] 账号成员生效的时间戳。 0 表示角色未授予。 [1] 账号当前的执行延迟。 [2] 账号待定的执行延迟。 [3] 账号待定的执行延迟生效的时间戳。 0 表示没有计划延迟更新。

hasRole(uint64 roleId, address account) → bool isMember, uint32 executionDelay public

检查给定的账号当前是否具有与给定角色相对应的权限级别。 请注意,此权限可能与执行延迟相关联。 getAccess 可以提供更多详细信息。

labelRole(uint64 roleId, string label) public

为角色指定标签,以改进用户界面对角色的可发现性。

要求:

  • 调用者必须是全局管理员

发出RoleLabel事件。

grantRole(uint64 roleId, address account, uint32 executionDelay) public

account 添加到 roleId,或更改其执行延迟。

这使帐户有权调用任何限制为此角色的函数。 可以设置可选的执行延迟(以秒为单位)。 如果该延迟非 0,则用户需要安排任何限制为此角色成员的操作。 用户只有在延迟过去且过期之前才能执行该操作。 在此期间,管理员和监护人可以取消该操作(请参阅cancel)。

如果已授予该帐户此角色,则将更新执行延迟。 此更新不是立即的,并且遵循延迟规则。 例如,如果用户当前有 3 小时的延迟,并且调用此函数将该延迟减少到 1 小时,则新的延迟将需要一些时间才能生效,从而保证在此更新之后的 3 小时内执行的任何操作实际上是在此更新之前计划的。

要求:

  • 调用者必须是该角色的管理员(请参阅getRoleAdmin)

  • 授予的角色不能是 PUBLIC_ROLE

发出RoleGranted事件。

revokeRole(uint64 roleId, address account) public

立即从角色中删除帐户。 如果该帐户没有该角色,则此调用无效。

要求:

  • 调用者必须是该角色的管理员(请参阅getRoleAdmin)

  • 撤销的角色不能是 PUBLIC_ROLE

如果帐户拥有该角色,则发出RoleRevoked事件。

renounceRole(uint64 roleId, address callerConfirmation) public

立即放弃调用帐户的角色权限。 如果发送者不在该角色中,则此调用无效。

要求:

  • 调用者必须是 callerConfirmation

如果账号拥有该角色,则发出RoleRevoked事件。

setRoleAdmin(uint64 roleId, uint64 admin) public

更改给定角色的管理角色。

要求:

  • 调用者必须是全局管理员

发出RoleAdminChanged事件

setRoleGuardian(uint64 roleId, uint64 guardian) public

更改给定角色的监护人角色。

要求:

  • 调用者必须是全局管理员

发出RoleGuardianChanged事件

setGrantDelay(uint64 roleId, uint32 newDelay) public

更新授予 roleId 的延迟。

要求:

  • 调用者必须是全局管理员

发出RoleGrantDelayChanged事件。

_grantRole(uint64 roleId, address account, uint32 grantDelay, uint32 executionDelay) → bool internal

grantRole的内部版本,没有访问控制。 如果新授予该角色,则返回 true。

发出RoleGranted事件。

_revokeRole(uint64 roleId, address account) → bool internal

没有访问控制的revokeRole的内部版本。 此逻辑也由renounceRole使用。 如果先前已授予该角色,则返回 true。

如果帐户拥有该角色,则发出RoleRevoked事件。

_setRoleAdmin(uint64 roleId, uint64 admin) internal

没有访问控制的setRoleAdmin的内部版本。

发出RoleAdminChanged事件。

允许将管理角色设置为 PUBLIC_ROLE,但这实际上将允许任何人设置授予或撤销此类角色。
_setRoleGuardian(uint64 roleId, uint64 guardian) internal

没有访问控制的setRoleGuardian的内部版本。

发出RoleGuardianChanged事件。

允许将监护人角色设置为 PUBLIC_ROLE,但这实际上将允许任何人取消此类角色的任何计划操作。
_setGrantDelay(uint64 roleId, uint32 newDelay) internal

没有访问控制的setGrantDelay的内部版本。

发出RoleGrantDelayChanged事件。

setTargetFunctionRole(address target, bytes4[] selectors, uint64 roleId) public

设置在 target 合约中调用由 selectors 标识的函数所需的角色。

要求:

  • 调用者必须是全局管理员

为每个选择器发出TargetFunctionRoleUpdated事件。

_setTargetFunctionRole(address target, bytes4 selector, uint64 roleId) internal

没有访问控制的setTargetFunctionRole的内部版本。

发出TargetFunctionRoleUpdated事件。

setTargetAdminDelay(address target, uint32 newDelay) public

设置更改给定目标合约配置的延迟。

要求:

  • 调用者必须是全局管理员

发出TargetAdminDelayUpdated事件。

_setTargetAdminDelay(address target, uint32 newDelay) internal

没有访问控制的setTargetAdminDelay的内部版本。

发出TargetAdminDelayUpdated事件。

setTargetClosed(address target, bool closed) public

设置合约的关闭标志。

关闭管理器本身不会禁用对管理方法的访问,以避免锁定合约。

要求:

  • 调用者必须是全局管理员

发出TargetClosed事件。

_setTargetClosed(address target, bool closed) internal

设置合约的关闭标志。 这是一个没有访问限制的内部设置器。

发出TargetClosed事件。

getSchedule(bytes32 id) → uint48 public

返回计划操作准备好执行的时间点。 如果操作尚未计划、已过期、已执行或已取消,则返回 0。

getNonce(bytes32 id) → uint32 public

返回具有给定 ID 的最新计划操作的随机数。 如果从未计划该操作,则返回 0。

schedule(address target, bytes data, uint48 when) → bytes32 operationId, uint32 nonce public

计划延迟操作以供将来执行,并返回操作标识符。 只要满足调用者所需的执行延迟,就可以选择操作变为可执行的时间戳。 特殊值零将自动设置最早可能的时间。

返回已计划的 operationId。 由于此值是参数的哈希值,因此当使用相同参数时,它可能会再次出现; 如果这相关,则返回的 nonce 可用于将此计划操作与在executecancel的调用中同一operationId的其他事件唯一地标识出来。

发出OperationScheduled事件。

不可能同时计划多个具有相同 targetdata 的操作。 如果需要这样做,可以将一个随机字节附加到 data 中,作为 salt,如果目标合约使用标准 Solidity ABI 编码,则该 salt 将被忽略。
execute(address target, bytes data) → uint32 public

执行延迟限制的函数,前提是它已事先正确安排,或者执行延迟为 0。

返回标识已执行的先前计划操作的随机数,如果该操作先前未计划(如果调用者没有执行延迟),则返回 0。

仅当调用已计划和延迟时,才发出OperationExecuted事件。

cancel(address caller, address target, bytes data) → uint32 public

取消计划(延迟)的操作。 返回标识已取消的先前计划操作的随机数。

要求:

  • 调用者必须是提议者、目标函数的监护人或全局管理员

发出OperationCanceled事件。

consumeScheduledOp(address caller, bytes data) public

使用针对调用者的计划操作。 如果存在此类操作,则将其标记为已使用(发出OperationExecuted事件并清理状态)。 否则,抛出错误。

这对于希望强制执行针对它们自己的调用已在管理器上计划的合约非常有用,包括它所暗示的所有验证。

发出OperationExecuted事件。

_consumeScheduledOp(bytes32 operationId) → uint32 internal

在 bytes32 operationId 上运行的consumeScheduledOp的内部变体。

返回已使用的计划操作的随机数。

hashOperation(address caller, address target, bytes data) → bytes32 public

延迟操作的哈希函数。

updateAuthority(address target, address newAuthority) public

更改由此管理器实例管理的目标的权限。

要求:

  • 调用者必须是全局管理员
ADMIN_ROLE() → uint64 public

管理角色标识符。 执行大多数配置操作(包括其他角色的管理和目标限制)所必需。

PUBLIC_ROLE() → uint64 public

公共角色的标识符。 自动授予所有地址,没有延迟。

IAccessManaged

import "@openzeppelin/contracts/access/manager/IAccessManaged.sol";

函数

事件

错误

authority() → address external

返回当前权限。

setAuthority(address) external

将控制权转移到新的权限。 调用者必须是当前权限。

isConsumingScheduledOp() → bytes4 external

仅在延迟受限调用的上下文中,在正在使用计划的操作的那一刻返回 true。 避免在合约执行攻击者控制的调用时,拒绝延迟受限调用的服务。

AuthorityUpdated(address authority) event

管理此合约的授权已更新。

AccessManagedUnauthorized(address caller) error
AccessManagedRequiredDelay(address caller, uint32 delay) error
AccessManagedInvalidAuthority(address authority) error

AccessManaged

import "@openzeppelin/contracts/access/manager/AccessManaged.sol";

此合约模块提供了一个 restricted 修饰符。 使用此修饰符修饰的函数将根据“权限”进行授权:一个类似于 AccessManager 的合约,该合约遵循 IAuthority 接口,实现一个策略,允许某些调用者访问某些函数。

restricted 修饰符绝不应在 internal 函数上使用,应在 public 函数中谨慎使用,并且理想情况下仅在 external 函数中使用。 请参阅 restricted

修饰符

函数

事件

IAccessManaged

错误

IAccessManaged

restricted() modifier

限制对函数的访问,如连接的 Authority 对此合约、调用者和进入合约的函数的选择器所定义。

一般来说,此修饰符应仅在 external 函数上使用。 可以将其用于用作外部入口点且未在内部调用的 public 函数。 除非你知道自己在做什么,否则切勿在 internal 函数上使用它。 不遵守这些规则可能会产生严重的安全性影响! 这是因为权限由进入合约的函数决定,即调用堆栈底部的函数,而不是修饰符在源代码中可见的函数。
避免将此修饰符添加到 receive() 函数或 fallback()。这些函数是唯一无法从 calldata 中明确确定函数选择器的执行路径,因为如果未提供 calldata,接收 () 函数中的选择器默认为 `0x0000
  • 原文链接: docs.openzeppelin.com/co...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
OpenZeppelin
OpenZeppelin
江湖只有他的大名,没有他的介绍。