Деплой смарт-контракта в сети zkSync Era Mainnet
Данная статья подготовлена командой DAO Crypto. Мы есть в Youtube и Telegram
Видео-гайд по ссылке
Содержание
О проекте
zkSync - проект, суть которого заключается в переносе вычислений из Ethereum в свою сеть, обеспечивая масштабируемость Ethereum и низкую стоимость транзакций при работе с нативным токеном ETH. Проект основан на применении технологии zk-Rollup.
Текущая версия zkSync Era удовлетворяет потребности большинства приложений на Ethereum. Обмен сообщениями смарт-контрактов L1 → L2: позволяет разработчикам передавать данные из Ethereum в смарт-контракты на zkSync, предоставляя необходимую информацию для запуска различных смарт-контрактов. Мы будем разворачивать смарт-контракт в сети zkSync Era Mainnet с помощью плагина Hardhat.
Подготовка к деплою смарт-контракта
- Добавляем сеть zkSync Era Mainnet в метамаск через сайт Chainlink.
- Бриджим токены из основной сети Ethereum в сеть ZkSync Era Mainnet для оплаты газа по ссылке.
❗️❗️❗️ Комиссия за деплой смарт-контракта в сети ZkSync Era Mainnet составляет около $0.5 ❗️❗️❗️
Как развернуть смарт-контракт в сети ZkSync Era Mainnet на Linux
Для деплоя смарт-контракта нам потребуется арендовать сервер с операционной системой Ubuntu 20.04.
Если у вас еще нет опыта по деплою смарт-контракта
Если вы еще не имеете опыт по запуску нод, деплою смарт-контрактов и работе с серверами, то у нас есть детальное видео по этим вопросам.
Смотрите это видео здесь 👉 ссылка
В нем рассказано и про MobaXterm, и про аналоги на Mac, и про SSH ключ. К уроку идет подробная статья, пошагово рассказывающая о создании SSH ключа и подключении к серверу через MobaXterm с его помощью.
Статья про создание SSH-ключа 👉 ссылка
Подключение к серверу через SSH-клиент 👉 ссылка
И еще статья по кранам в Тестовой сети Goerli 👉 ссылка
Сохраняйте себе эти полезные статьи, чтобы у вас больше не возникало вопросов по работе с серверами и все получалось с первого раза!
Арендуем сервер
Для разворачивания смарт-контракта нужен сервер с минимальными техническими характеристиками (например: Процессор: 1 core Память: 1 ГБ Хранилище: 30 ГБ Трафик: 32 ТБ). Такой сервер можно арендовать на Vdsina
Заходим на сайт и нажимаем на кнопку "Создать сервер".
Задаем параметры сервера: выбираем операционную систему Ubuntu - Версия 20.04 - тип Стандартные серверы - Стоимость аренды минимальная - Локация Амстердам - Отключаем ползунок Автоматическая резервная копия - включаем Дополнительные настройки, там вводим название и выбираем SSH-ключ - жмем кнопку "Создать"
Сервер создан. Копируем его IP-адрес.
Подключаемся к серверу
Для того, чтобы подключиться к серверу на Windows, потребуется программа MobaXterm.
Открываем MobaXterm, через вкладку Session добавляем сервер. В поле "Remote Host" вставляем IP-адрес арендованного сервера, в разделе "Advanced SSH settings" ставим галочку в поле "Use private key" и выбираем файл с приватным ключом.
Разворачиваем смарт-контракт
После этого начинаем запускать команды. Последовательно вводим следующие команды в окне MobaXterm, после каждой строчки нажимаем Enter и ждем выполнения:
sudo apt update
sudo apt upgrade
При установке нажимаем y, затем Enter
sudo apt install -y curl
После обновления нашей системы и проверки зависимостей запустим скрипт установки для Node.js 18 (LTS)
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
После завершения работы скрипта устанавливаем Node.js 18
sudo apt install -y nodejs
Далее выполняем команды по очереди
mkdir greeter-example
cd greeter-example
apt install cmdtest
Далее продолжаем набирать команды на сервере
npm init --y
npm install --save-dev hardhat
npm install -g [email protected]
npx hardhat
Появятся варианты выбора. Используем стрелки вверх и вниз, чтобы переключаться между ними.
Выбираем Create a TypeScript project и жмем Enter.
Далее нажимаем Enter при выборе папки, а затем три раза отвечаем y
В процессе могут быть ошибки, не обращаем на них внимания
Продолжаем набирать дальше команды
mkdir greeter
cd greeter
npm init -y
npm add -D typescript ts-node @types/node ethers@^5.7.2 zksync-web3 @ethersproject/hash @ethersproject/web hardhat @matterlabs/hardhat-zksync-solc @matterlabs/hardhat-zksync-deploy
npm i -D @matterlabs/hardhat-zksync-verify @nomiclabs/hardhat-etherscan
nano hardhat.config.ts
После этой команды откроется текстовый редактор. Вставляем здесь следующий текст:
import "@matterlabs/hardhat-zksync-deploy";
import "@matterlabs/hardhat-zksync-solc";
import "@matterlabs/hardhat-zksync-verify";
module.exports = {
zksolc: {
version: "1.3.7",
compilerSource: "binary",
settings: {},
},
defaultNetwork: "zkMainnet",
networks: {
zkMainnet: {
url: "https://mainnet.era.zksync.io",
ethNetwork: "https://eth.llamarpc.com",
zksync: true,
verifyURL: 'https://zksync2-mainnet-explorer.zksync.io/contract_verification',
},
},
solidity: {
version: "0.8.18",
},
};
Для того, чтобы сохранить текст и выйти, нажимаем Ctrl + X, затем y, затем Enter.
mkdir contracts
mkdir deploy
nano contracts/Greeter.sol
После этой команды откроется текстовый редактор. Вставляем здесь следующий текст:
//SPDX-License-Identifier: Unlicensed
pragma solidity ^0.8.0;
contract Greeter {
string private greeting;
constructor(string memory _greeting) {
greeting = _greeting;
}
function greet() public view returns (string memory) {
return greeting;
}
function setGreeting(string memory _greeting) public {
greeting = _greeting;
}
}
Для того, чтобы сохранить текст и выйти, нажимаем Ctrl + X, затем y, затем Enter.
npx hardhat compile
Если компиляция выполнена успешно, увидим сообщение:
nano deploy/deploy.ts
После этой команды откроется текстовый редактор. Здесь нужно вставить текст, который приведен ниже. Но предварительно его нужно скопировать в блокнот и отредактировать: вместо слов ВАШ_ПРИВАТНЫЙ_КЛЮЧ нужно вставить приватный ключ вашего кошелька метамаск.
Получить приватный ключ можно следующим образом: открываем свой метамаск, затем нажимаем на три точки вверху справа. И выбираем в меню Реквизиты счета. Далее вводим пароль и копируем свой приватный ключ.
Вставляем скопированный приватный ключ в текст ниже:
import { utils, Wallet } from "zksync-web3";
import * as ethers from "ethers";
import { HardhatRuntimeEnvironment } from "hardhat/types";
import { Deployer } from "@matterlabs/hardhat-zksync-deploy";
// An example of a deploy script that will deploy and call a simple contract.
export default async function (hre: HardhatRuntimeEnvironment) {
console.log(`Running deploy script for the Greeter contract`);
// Initialize the wallet.
const wallet = new Wallet("ВАШ_ПРИВАТНЫЙ_КЛЮЧ");
// Create deployer object and load the artifact of the contract we want to deploy.
const deployer = new Deployer(hre, wallet);
const artifact = await deployer.loadArtifact("Greeter");
// Deploy this contract. The returned object will be of a `Contract` type, similarly to ones in `ethers`.
// `greeting` is an argument for contract constructor.
const greeting = "Hello everyone!";
const greeterContract = await deployer.deploy(artifact, [greeting]);
console.log(greeterContract.interface.encodeDeploy([greeting]));
// Show the contract info.
const contractAddress = greeterContract.address;
console.log(`${artifact.contractName} was deployed to ${contractAddress}`);
// Call the deployed contract.
const greetingFromContract = await greeterContract.greet();
if (greetingFromContract == greeting) {
console.log(`Contract greets us with ${greeting}!`);
} else {
console.error(`Contract said something unexpected: ${greetingFromContract}`);
}
// Edit the greeting of the contract
const newGreeting = "Hi ho from DAO Crypto channel!!!";
const setNewGreetingHandle = await greeterContract.setGreeting(newGreeting);
await setNewGreetingHandle.wait();
const newGreetingFromContract = await greeterContract.greet();
if (newGreetingFromContract == newGreeting) {
console.log(`Contract greets us with ${newGreeting}!`);
} else {
console.error(`Contract said something unexpected: ${newGreetingFromContract}`);
}
}
Вставляем полученный текст в текстовый редактор в окне MobaXterm.
Для того, чтобы сохранить текст и выйти, нажимаем Ctrl + X, затем y, затем Enter.
npx hardhat deploy-zksync
После этого произойдет деплой контракта, и терминал выдаст информацию, как на скриншоте ниже. Здесь указан адрес контракта. Копируем эту информацию и сохраняем у себя.
После этого переходим в эксплорер zkSync Era Mainnet, вводим в строке поиска адрес своего контракта и видим, что он создан.
Также можем ввести в эксплорере адрес своего кошелька метамаск и увидеть две транзакции, т.к. после команды деплоя сразу происходит еще и взаимодействие с контрактом.
Поздравляем, вы развернули смарт-контракт в сети zkSync Era Mainnet!!!
Верифицируем смарт-контракт
Для верификациии смарт-контракта вводим в терминале команду, в которую подставляем два аргумента. Первый - адрес контракта, его мы получаем в терминале при деплое смарт-контракта (скриншот выше). Второй - аргументы конструктора. В нашем случае это фраза "Hello everyone!".
Пример того, как должна выглядеть команда:
После выполнения команды мы получим verification ID и сообщение об успехе операции:
С помощью следующей команды можно еще раз все проверить, подставляем в нее полученный в терминале verification ID:
npx hardhat verify-status --verification-id ВАШ_verification_ID
Результат выполнения команды будет следующим:
Далее переходим в эксплорер zkSync Era Mainnet, вводим в строке поиска номер своего контракта и нажимаем на TRANSACTION HASH контракта.
Находим строку Input data. Верифицированный контракт будет иметь следующий вид:
Если контракт не верифицирован, то надпись будет такой:
Как загрузить еще один смарт-контракт
Для деплоя еще одного смарт-контракта не нужно удалять сервер. Продолжаем работать в том же окне терминала MobaXterm и возвращаемся к этому пункту.
То есть в терминале нужно снова набрать команду:
nano deploy/deploy.ts
И далее повторяем все шаги по инструкции, только приватный ключ в тексте документа указываем уже другой, от нового кошелька метамаск, к которому перешли.
При этом, чтобы указать новый приватник в документе, не надо удалять весь текст. Курсором переходим на нужную строчку (двигаемся стрелками вверх-вниз, вправо-влево на клавиатуре), удаляем там предыдущий приватный ключ и вставляем новый (нажав правую кнопку мыши).
Переустановка системы на сервере
Если вы запутались в командах или что-то пошло не так, вы не можете найти, где допустили ошибку, не знаете, как ее исправить и хотите начать процесс разворачивания приложения заново, то можно не удалять для этого сервер на VDSina, а переустановить на нем систему. Таким образом все ранее введенные команды сбросятся.
Для этого переходим на VDSina и открываем свой сервер.
Выбираем вкладку Переустановка. И нажимаем кнопку Переустановка.
Здесь можно переустановить систему на сервере и таким образом удалить все внесенные изменения на нем.
Надеюсь наш гайд оказался вам полезен. Подпишитесь на нас в Youtube и Telegram
Видео-гайд по ссылке