Работа с 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 будет приостановлен. Таким образом, любая последующая передача большого объема будет неудачной.

Ресурсы