June 7, 2023

Деплой смарт-контракта в сети 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

Устанавливаем загрузчик curl

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

Нажимаем y, затем Enter

Далее продолжаем набирать команды на сервере

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!".

npx hardhat verify АДРЕС_КОНТРАКТА АРГУМЕНТЫ_КОНСТРУКТОРА

Пример того, как должна выглядеть команда:

npx hardhat verify 0x3f..........cfC "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

Видео-гайд по ссылке