OpenZeppelin Defender¶
概览¶
OpenZeppelin Defender是基于网络的应用程序,让开发者可以通过安全的方式实现智能合约运行的自动化。Defender提供以下不同的组件:
- Admin —— 实现所有智能合约运行过程的自动化,例如进入权限控制、升级、暂停等,并提供安全保障
- Relay —— 通过具备私有中继器部署、安全的私有交易基础设施进行构建
- Autotasks —— 创建自动化脚本,与智能合约交互
- Sentinel —— 监控智能合约的事件、功能及交易,并通过邮件接收通知
OpenZeppelin Defender现已上线Moonbeam、Moonriver和Moonbase Alpha测试网。本教程将介绍如何使用Defender,并演示如何通过Admin组件暂停部署于Moonbase Alpha的智能合约,也可适用于Moonbeam和Moonriver。
如需了解更多信息,请参阅OpenZeppelin团队撰写的Defender文档页面。
开始使用Defender¶
本小节将介绍在Moonbase Alpha上开始使用OpenZeppelin的步骤。
检查先决条件¶
请确保安装MetaMask,并已连接至Moonbase Alpha测试网。如果您还没有将MetaMask连接到测试网,请根据我们的MetaMask整合教程进行操作。
此外,您还需要登录Defender网站并注册OpenZeppelin免费账户。
本教程使用的合约是在智能合约升级教程中的Box.sol
合约的拓展,是OpenZeppelin文档中抽取的合约。此外,本合约可升级、可暂停,能够充分发挥Admin组件的优势。您可以使用以下代码进行合约部署,并根据智能合约升级教程进行操作:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
contract PausableBox is Initializable, PausableUpgradeable, OwnableUpgradeable {
uint256 private value;
// Emitted when the stored value changes
event ValueChanged(uint256 newValue);
// Initialize
function initialize() initializer public {
__Ownable_init();
__Pausable_init_unchained();
}
// Stores a new value in the contract
function store(uint256 newValue) whenNotPaused public {
value = newValue;
emit ValueChanged(newValue);
}
// Reads the last stored value
function retrieve() public view returns (uint256) {
return value;
}
function pause() public onlyOwner {
_pause();
}
function unpause() public onlyOwner {
_unpause();
}
}
连接Defender¶
注册了OpenZeppelin Defender账户以后,登录Defender App。在主屏幕中,您将看到MetaMask已连接到Moonbase Alpha,点击右上角的Connect wallet(连接钱包)按钮:
如果操作成功,您可以看到自己的地址,并显示Connected to Moonbase Alpha(已连接到Moonbase Alpha)。
使用Admin组件¶
本小节将介绍如何使用OpenZeppelin Defender Admin组件管理Moonbase Alpha上的智能合约。
导入合约¶
使用Defender Admin的第一步是添加需管理的合约。点击右上角附近的Add contract(添加合约)按钮,进入import contract(导入合约)页面,然后进行以下操作:
- 设置合约名称(仅用于显示)
- 选择需管理合约所在的网络。如果该合约已经以相同地址部署到多个网络中,这一步将尤其有用。在这一示例中,输入
Moonbase Alpha
- 输入合约地址
- 粘贴合约ABI。可以通过Remix或者在编译过程(例如在Truffle或Hardhat)中创建的
.json
文件中找到 - 检查合约功能是否被正确识别
- 检查所有信息后,点击Add(添加)按钮
导入成功后,就可以在Admin组件主界面看到该合约:
创建合约提案¶
提案指的是合约即将执行的行动。截至本文撰写时,该合约已产生三个主要提案/行动:
- Pause —— 检测到暂停功能后可用。可暂停代币转移、铸造及销毁
- Upgrade —— 检测到升级功能后可用。可通过代理合约对合约进行升级
- Admin action —— 可调用受管理合约的任何函数
在本示例中,我们创建了一个新提案,提案内容为暂停合约。为此,需要进行以下操作:
- 点击New proposal(新建提案)按钮,显示所有选项
- 点击Pause(暂停)
提案页面将打开,显示所有需要填写的提案相关信息。在本示例中,需要提供以下信息:
- Admin账户地址。如果想通过现有钱包(在获得所有必要许可的前提下)运行,该提案这一字段可以留空
- 提案名称
- 提案描述。为合约的其他成员/管理员提供的信息越详细越好(若使用多重签名钱包)
- 点击Create pause proposal(创建暂停提案)
成功创建提案后,提案将显示在合约管理员主面板上。
同意合约提案¶
创建合约提案后,下一步是同意并执行提案。进入提案,并点击Approve and Execute(同意并执行)。
通过这一步骤将创建一笔交易,需要使用MetaMask签名。此后提案状态将改为Executed(confirmation pending)。交易被处理后,状态将显示为Executed(已执行)。
合约状态也将从Running(运行中)变为Paused(已暂停)。现在您已学会如何使用Admin组件管理智能合约了。
| Created: May 27, 2021