Defender 允许你监督和指挥任何使用 来自 OpenZeppelin Contracts 的 AccessControl 的智能合约的合约权限。本指南将引导你完成导入 TimelockController 合约、创建提案和管理其角色的步骤。TimelockController 是一种智能合约,它强制在操作排队和执行之间设置延迟。这种机制通常用于去中心化治理,以提高安全性并提供透明度,允许利益相关者在更改执行之前观察并做出反应。TimelockController 使用以下 AccessControl 设置:

  • Proposer 角色负责对操作进行排队:这是应该授予 Governor 实例的角色,并且它可能应该是系统中唯一的 proposer。

  • Executor 角色负责执行已可用的操作:我们可以将此角色分配给特殊的零地址,以允许任何人执行(如果操作可能特别时间敏感,则应该将 Governor 设置为 Executor)。

  • 最后,还有 Admin 角色,它可以授予和撤销先前的两个角色:这是一个非常敏感的角色,它将自动授予给 timelock 本身,并且可以选择授予给第二个帐户,该帐户可用于简化设置,但应立即放弃该角色。

先决条件

  • OpenZeppelin Defender 帐户。

1. 创建 TimelockController

首先,你需要部署一个实现 TimelockController 的合约。例如,使用 OpenZeppelin Contracts 5.0:

//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.18;

import "@openzeppelin/contracts/governance/TimelockController.sol";

contract Timelock is TimelockController {
    constructor(uint256 minDelay, address[] memory proposers, address[] memory executors) TimelockController(minDelay, proposers, executors, msg.sender) {}
}

此合约会将 Admin 角色授予部署者,并将 ProposerExecutor 角色授予作为参数传递的帐户。如果要将 ProposerExecutor 角色授予同一帐户,可以两次传递相同的地址。部署合约后,复制其地址并继续下一步。

2. 导入到 Defender

导航到 Defender 上的地址簿 并使用其地址和网络添加你的合约。如果合约已验证,Defender 将自动获取 ABI。否则,你需要 手动粘贴 ABI

3. 创建提案

Defender 交易提案 允许你创建和管理提案。提案反过来可以直接通过 TimelockController 合约执行函数的计划延迟执行操作。为了创建一个新的提案,导航到 交易提案创建页面 并选择你导入的 TimelockController

然后,从函数下拉列表中选择 schedule 函数,并填写有关你要执行的提案的信息。例如:

提案数据

最后,选择审批流程以发送此提案。这取决于你的 TimelockController 合约的提议者是谁。对于本指南,提议者是一个 EOA 钱包。使用 Defender,你可以创建一个连接到你的 EOA 的审批流程,并使用它发送此提案。

提议者

然后,你可以通过创建另一个交易提案并使用先前的提案数据选择 execute 函数来执行该提案。

4. 授予角色

现在,你可以使用 Defender 访问控制 来授予或撤销你的 TimelockController 合约的角色。导航到 访问控制 并选择你导入的 TimelockController 合约。

Timelock Controller 角色

为了授予某人一个角色,你需要有权访问拥有该角色管理权限的地址。例如,使用 DEFAULT_ADMIN_ROLE,你可以授予或撤销任何角色。在这种情况下,你可以使用拥有 DEFAULT_ADMIN_ROLE 的 EOA 将 PROPOSER_ROLE 授予另一个地址。

首先,展开 PROPOSER_ROLE 的下拉列表并将地址粘贴到要授予角色的位置。

角色接收者

然后,向下滚动并使用拥有 DEFAULT_ADMIN_ROLE 的审批流程来发送交易,例如 EOA 钱包。单击 保存更改,这将把交易发送到你的钱包。

授予角色

在该页面的右侧,你将看到交易已执行,并且该角色已授予你选择的地址。

已授予角色

撤销角色

要撤销一个角色,你需要执行相同的步骤,但取消选择下拉列表中要撤销角色的地址。

角色移除者

然后,使用相同的审批流程并保存更改。交易应执行并撤销该角色,如在该页面的右侧确认的那样。

已撤销角色