Defender 允许你监督和指挥任何使用 来自 OpenZeppelin Contracts 的 AccessControl 的智能合约的合约权限。本指南将引导你完成导入 TimelockController 合约、创建提案和管理其角色的步骤。TimelockController
是一种智能合约,它强制在操作排队和执行之间设置延迟。这种机制通常用于去中心化治理,以提高安全性并提供透明度,允许利益相关者在更改执行之前观察并做出反应。TimelockController 使用以下 AccessControl
设置:
-
Proposer 角色负责对操作进行排队:这是应该授予 Governor 实例的角色,并且它可能应该是系统中唯一的 proposer。
-
Executor 角色负责执行已可用的操作:我们可以将此角色分配给特殊的零地址,以允许任何人执行(如果操作可能特别时间敏感,则应该将 Governor 设置为 Executor)。
-
最后,还有 Admin 角色,它可以授予和撤销先前的两个角色:这是一个非常敏感的角色,它将自动授予给 timelock 本身,并且可以选择授予给第二个帐户,该帐户可用于简化设置,但应立即放弃该角色。
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 角色授予部署者,并将 Proposer 和 Executor 角色授予作为参数传递的帐户。如果要将 Proposer 和 Executor 角色授予同一帐户,可以两次传递相同的地址。部署合约后,复制其地址并继续下一步。
2. 导入到 Defender
导航到 Defender 上的地址簿 并使用其地址和网络添加你的合约。如果合约已验证,Defender 将自动获取 ABI。否则,你需要 手动粘贴 ABI。
3. 创建提案
Defender 交易提案 允许你创建和管理提案。提案反过来可以直接通过 TimelockController 合约执行函数的计划延迟执行操作。为了创建一个新的提案,导航到 交易提案创建页面 并选择你导入的 TimelockController
。
然后,从函数下拉列表中选择 schedule
函数,并填写有关你要执行的提案的信息。例如:

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

然后,你可以通过创建另一个交易提案并使用先前的提案数据选择 execute
函数来执行该提案。
4. 授予角色
现在,你可以使用 Defender 访问控制 来授予或撤销你的 TimelockController
合约的角色。导航到 访问控制 并选择你导入的 TimelockController
合约。

为了授予某人一个角色,你需要有权访问拥有该角色管理权限的地址。例如,使用 DEFAULT_ADMIN_ROLE,你可以授予或撤销任何角色。在这种情况下,你可以使用拥有 DEFAULT_ADMIN_ROLE 的 EOA 将 PROPOSER_ROLE 授予另一个地址。
首先,展开 PROPOSER_ROLE
的下拉列表并将地址粘贴到要授予角色的位置。

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

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