本文档介绍了如何使用 OpenZeppelin Defender 管理 TimelockController 合约的角色。TimelockController 是一种智能合约,用于在操作排队和执行之间强制实施延迟,以提高去中心化治理的安全性。通过 Defender,用户可以导入 TimelockController 合约,创建提案,授予和撤销角色,从而实现对合约权限的集中管理。
Defender 允许你监督和指挥任何使用来自 OpenZeppelin Contracts 的 AccessControl 的智能合约的合约权限。本指南将引导你完成导入 TimelockController 合约、创建提案和管理其角色的步骤。TimelockController
是一个智能合约,它强制在操作被排队和可以被执行之间存在延迟。这种机制通常用于去中心化治理,以提高安全性并提供透明度,允许利益相关者在变更执行之前观察并对其做出反应。TimelockController 使用以下 AccessControl
设置:
Proposer(提案者) 角色负责对操作进行排队:这是应该授予 Governor 实例的角色,并且它很可能是系统中唯一的提案者。
Executor(执行者) 角色负责执行已可用的操作:我们可以将此角色分配给特殊的零地址,以允许任何人执行(如果操作可能对时间特别敏感,则应将 Governor 设置为执行者)。
最后,还有 Admin(管理员) 角色,它可以授予和撤销前两个角色:这是一个非常敏感的角色,它将被自动授予给 timelock 本身,并且可以选择性地授予给第二个帐户,该帐户可以用于简化设置,但应立即放弃该角色。
首先,你需要部署一个实现 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 角色授予同一个帐户,则可以两次传递相同的地址。部署合约后,复制其地址并继续下一步。
导航到 Defender 上的地址簿 并添加你的合约及其地址和网络。如果合约已验证,Defender 将自动拾取 ABI。否则,你需要手动粘贴 ABI。
Defender 交易提案 允许你创建和管理提案。提案反过来可以直接在 TimelockController 合约上执行预定的延迟函数执行操作。为了创建一个新的提案,导航到交易提案创建页面并选择你导入的 TimelockController
。
然后,从函数下拉列表中选择 schedule
函数,并填写有关要执行的提案的信息。例如:
最后,选择发送此提案的审批流程。这取决于你的 TimelockController
合约的提案者是谁。对于本指南,提案者是一个 EOA 钱包。使用 Defender,你可以创建一个连接到你的 EOA 的审批流程并使用它发送此提案。
然后,你可以通过创建另一个交易提案并选择带有先前提案数据的 execute
函数来执行该提案。
现在,你可以使用 Defender 访问控制 来授予或撤销你的 TimelockController
合约的角色。导航到 访问控制 并选择你导入的 TimelockController
合约。
为了授予某人一个角色,你需要访问对该角色具有管理权限的地址。例如,使用 DEFAULT_ADMIN_ROLE,你可以授予或撤销任何角色。在本例中,你可以使用持有 DEFAULT_ADMIN_ROLE 的 EOA 将 PROPOSER_ROLE 授予给另一个地址。
首先,展开 PROPOSER_ROLE
的下拉列表,并粘贴要授予角色的地址。
然后,向下滚动并使用持有 DEFAULT_ADMIN_ROLE 的审批流程来发送交易,例如 EOA 钱包。单击 Save Changes
,这将把交易发送到你的钱包。
在该页面的右侧,你将看到交易已执行,并且该角色已授予给你选择的地址。
要撤销角色,你需要执行相同的步骤,但在下拉列表中取消选择要撤销其角色的地址。
然后,使用相同的审批流程并保存更改。交易应该被执行并且角色被撤销,如在该页面右侧确认的那样。
- 原文链接: docs.openzeppelin.com/de...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!