Без раскрытия закрытых ключей

Вот как развернуть смарт-контракты без риска раскрытия закрытого ключа с помощью API Relayer OpenZeppelin Defender.

Скопируйте ключ и секрет API вашей команды Defender

В Защитнике выберите меню-гамбургер в правом верхнем углу, а затем ключи Team API. Здесь вы увидите все существующие API-ключи, а также то, что с ними можно сделать. На этой панели вы также можете удалить ключи API, наведя на нее курсор и выбрав корзину справа.

Выберите «Создать командный ключ API», затем оставьте все отмеченными, если вы не хотите ограничивать права на то, что можно выполнять с помощью этого ключа API. Нажмите Сохранить. Вам будет предложено скопировать ключ API и секрет. Храните их в надежном месте. Они больше не будут отображаться.

Установите флажок, чтобы указать, что вы скопировали ключи, и выберите Сохранить.

Скопируйте ключ API вашей команды и секрет из Защитника.

Создать ретранслятор

Сначала установите необходимый пакет:

$ npm install defender-relay-client

Создайте сценарий, подобный следующему, указав свой ключ и секрет API Защитника в файле .env и соответствующим образом изменив имена переменных.

const { RelayClient } = require(‘defender-relay-client’);
const { appendFileSync, writeFileSync} = require(‘fs’);
async function run() {
 require(‘dotenv’).config();
 const { DEFENDER_API_KEY: apiKey, DEFENDER_API_SECRET: apiSecret } = process.env;
 const relayClient = new RelayClient({ apiKey, apiSecret });
// create relay using defender client
 const requestParams = {
 name: ‘MyRelayer’,
 network: ‘goerli’,
 minBalance: BigInt(1e17).toString(),
 };
 const relayer = await relayClient.create(requestParams);
 
 // store relayer info in file (optional)
 writeFileSync(‘relay.json’, JSON.stringify({
 relayer
 }, null, 2));
 console.log(‘Relayer ID: ‘, relayer);
// create and save the api key to .env — needed for sending tx
 const {apiKey: relayerKey, secretKey: relayerSecret} = await relayClient.createKey(relayer.relayerId);
 appendFileSync(‘.env’, `\nRELAYER_KEY=${relayerKey}\nRELAYER_SECRET=${relayerSecret}`);
}
run().catch((error) => {
 console.error(error);
 process.exitCode = 1;
});

Примечание. Чтобы отправить транзакцию напрямую через ретранслятор с использованием API, вам потребуются ключ и секрет (которые были добавлены в приведенном выше коде к вашему файлу .env).

Однако, если вы хотите отправить транзакцию с помощью автозадачи, единственные учетные данные, которые вам нужны, — это ключ API команды и секрет вместе с relayerId (который на предыдущем шаге был сохранен в файле relay.json).

Скомпилируйте и разверните контракт

Запустите npx hardhat compile (или эквивалент, если используете другой компилятор), чтобы подготовить смарт-контракт к развертыванию.

Используйте следующий скрипт для развертывания контракта:

const { DefenderRelayProvider, DefenderRelaySigner } = require(‘defender-relay-client/lib/ethers’);
const { ethers } = require(‘hardhat’);
const {writeFileSync} = require(‘fs’);
async function main() {
 require(‘dotenv’).config();
 const credentials = {apiKey: process.env.RELAYER_KEY, apiSecret: process.env.RELAYER_SECRET};
 const provider = new DefenderRelayProvider(credentials);
 const relaySigner = new DefenderRelaySigner(credentials, provider, { speed: ‘fast’ });
 
 const MyContract = await ethers.getContractFactory(“SimpleRegistry”);
 const myContract = await MyContract.connect(relaySigner).deploy().then(f => f.deployed());
writeFileSync(‘deploy.json’, JSON.stringify({
 MyContract: myContract.address,
 }, null, 2));
console.log(`MyContract: ${myContract.address}\n`);
}
if (require.main === module) {
 main().then(() => process.exit(0))
 .catch(error => { console.error(error); process.exit(1); });
}

Этот код извлекает учетные данные Relayer из локального файла вместе с артефактами для контракта и использует ethers.js для развертывания. Соответствующий адрес контракта сохраняется в локальном файле deploy.json.

Поздравляем с успешным развертыванием вашего контракта через Relayer!