Работа с OpenZeppelin Defender
Одной из ключевых возможностей OpenZeppelin Defender является его полезность для мониторинга безопасности и общей автоматизации. В этом руководстве используются несколько компонентов Defender для автоматизации реагирования на инциденты для заданного набора условий контракта ERC20.
Обзор
OpenZeppelin Defender имеет несколько основных функциональных компонентов: Sentinel, Autotasks, Admin и Relayer. Каждый компонент служит важным строительным блоком для настройки настройки автоматизации для вашего децентрализованного приложения или протокола.
В этой конструкции системы Страж отслеживает транзакции по контракту и настроен на автоматический запуск Автозадачи в случае передачи крупного токена. Скрипт Autotask отправляет транзакцию паузы в контракт ERC20 через Relayer.
Настраивать
Во-первых, зарегистрируйтесь в Defender и убедитесь, что EOA, используемый для развертывания контракта, финансируется Goerli ETH (через кран).
Форк Форк демо репо.
Клонируйте свой форк и установите зависимости:
$ git clone https://github.com/[GitHub username]/pause-guardian.git
$ cd pause-guardian
$ npm install
Укажите необходимые ключи API в локальном .env
файле. Ожидаются следующие значения:
PRIVATE_KEY
: Для контрактного развертывания в сети Goerli
API_KEY
: API-ключ команды защитников
API_SECRET
: Секрет API команды защитников
Развернуть контракт ERC20
Мастер контрактов OpenZeppelin имеет API для простого создания смарт-контрактов. Создайте контракт ERC20, который является Mintable, Pausable и реализует управление доступом на основе ролей с предварительно отчеканенным 1 миллионом токенов. Предустановленный скрипт автоматизирует это:
import { erc20 } from '@openzeppelin/wizard'
const params = { name: 'ExampleToken', symbol: 'ETK', mintable: true, premint: '1000000', access: 'roles', pausable: true, }
const contract = erc20.print(params)
Беги с $ npm run generate
Затем запустите $ npm run deploy
, чтобы скомпилировать и развернуть контракт.
const adminClient = new AdminClient({ apiKey: process.env.API_KEY, apiSecret: process.env.API_SECRET, })
const contractDetails = { network: 'goerli', address: contract.address, name: NAME, abi: contractABI, }
const newAdminContract = await adminClient.addContract(contractDetails)
Сценарий использует admin-client
Защитника и загружает контракт на панель администратора сразу после развертывания.
Создайте ретранслятор и назначьте роль паузы
Создайте Relayer для запуска транзакций блокчейна через API:
$ npm run relay
Теперь, когда у вас есть ретранслятор, вам нужно назначить ему соответствующую роль.
Веб-интерфейс Defender упрощает управление контролем доступа. На панели администратора выберите только что созданный контракт ERC20, затем «Новое предложение» → «Изменить доступ». На следующем экране выберите роль PAUSER из раскрывающегося списка и укажите адрес только что созданного ретранслятора. Выберите EOA в качестве стратегии выполнения и выберите адрес учетной записи, используемой для развертывания контракта. Дайте предложению доступа название и выполните его.
Создать автозадачу для отправки транзакции паузы
Теперь, когда у вас есть ретранслятор с соответствующим доступом для приостановки контракта, пришло время перейти к автоматизации этой функции.
Создайте автозадачу, которая отправит транзакцию pause
в развернутый контракт ERC20 с помощью ретранслятора.
$ npm run autotask
Сценарий создает новую автозадачу в Защитнике и загружает код автозадачи, предоставляя идентификатор ретранслятора, только что созданного для выполнения транзакции с использованием ретранслятора.
async function handler(event) { const provider = new DefenderRelayProvider(event) const signer = new DefenderRelaySigner(event, provider, { speed: 'fast' })
const erc20 = new ethers.Contract(ADDRESS, ABI, signer)
const isPaused = await erc20.paused() if (!isPaused) { const tx = await erc20.pause() console.log(tx) } else if (isPaused) { console.log('Contract is paused; doing nothing') } }
После создания автозадачи последним строительным блоком является настройка Sentinel для отслеживания событий в сети и запуска автозадачи.
Создайте Sentinel для запуска автозадачи
Sentinels могут отслеживать широкий спектр условий контракта и отправлять уведомления или запускать автозадачи при срабатывании.
Запустите $ npm run sentinel
, чтобы создать Sentinel, который запускает автозадачу при обнаружении передачи токена большого объема:
eventConditions: [
{
eventSignature: 'Transfer(address,address,uint256)',
expression: 'value > 200000e18',
},
],
Протестируйте автоматизацию автоматической паузы
Теперь, когда все строительные блоки заложены, система готова к тестированию. Попробуйте перевести количество токенов больше 200000 с контракта на другой аккаунт. Sentinel обнаружит событие Transfer
большого объема и активирует автозадачу, автозадача отправит транзакцию паузы через ретранслятор, и контракт ERC20 будет приостановлен. Таким образом, любая последующая передача большого объема будет неудачной.