Без раскрытия закрытых ключей
Вот как развернуть смарт-контракты без риска раскрытия закрытого ключа с помощью 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!