March 29, 2023

Развертывание смарт-контракта на zkSync.

Аренда сервера

Арендуем сервер, например на Contabo , Hetzner , VDsina или на любой другой платформе.
Минимальные характеристики для развертывания контракта: 1 CPU, 1 GB RAM и 30 GB SSD.

Приступаем к развертыванию смарт-контракта

Обновляемся:

sudo apt update
sudo apt upgrade

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

sudo apt install -y curl

Запускаем скрипт установки для Node.js 18 (LTS) и устанавливаем:

curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs

Далее выполняем команды c директориями:

mkdir greeter-example
cd greeter-example
apt install cmdtest

Нужно ввести Y, чтобы подтвердить действие.
Устанавливаем hardhat:

npm init --y
npm install --save-dev hardhat
npm install -g [email protected]
npx hardhat

Выбираем Create a TypeScript project, нажимаем 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
vim hardhat.config.ts

После крайней команды откроется файл в папке для деплоя, в него вставляете код, для этого нажимаете i для того, чтобы можно было редактировать и вставляете код, который указан ниже. Данный код брался по ссылке , была изменена версия и сеть на майннет.

import "@matterlabs/hardhat-zksync-deploy";import "@matterlabs/hardhat-zksync-solc";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,    },  },  solidity: {    version: "0.8.19",  },};

Далее нажимаем Esc и вводим :wq и Enter.Продолжаем набирать команды.

mkdir contracts
mkdir deploy
vim contracts/Greeter.sol

После крайней команды откроется файл, нажимаем снова i и вставляем код, который указан ниже, данный код был взят по ссылке.

//SPDX-License-Identifier: Unlicensedpragma 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;    }}

Далее нажимаем Esc и вводим :wq и Enter.Продолжаем набирать команды.

npx hardhat compile
vim deploy/deploy.ts

После крайней команды откроется файл, нажимаем снова i и вставляем код, который указан ниже, данный код брался по ссылке в шестом пункте, в него были внесены небольшие изменения, а именно строчка (console.log(greeterContract.interface.encodeDeploy([greeting])) она была взята по ссылке, т.к нужно вести на экран в конце значения constructor arguments для того, чтобы в дальнейшем верифицировать контракт в скане. Также было убрано автоматическое пополнение с L1 на L2 сеть, надеюсь, что у вас есть ETH в сети zkSync Era.

Самое важное!! В коде приведенном ниже вместо <WALLET-PRIVATE-KEY> вставляем свой ключ от кошелька.

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("<WALLET-PRIVATE-KEY>");  // 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 = "Hi there!";  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 = "Hey guys";  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}`);  }}

Далее нажимаем Esc и вводим :wq и Enter.Вводим команду для деплоя контракта:

npx hardhat deploy-zksync

Успешное развертывание должно выглядеть так:

Сохраняем себе данные из своего терминала:

  1. Сonstructor arguments — это 5я строчка снизу, она самая длинная (это то, ради чего мы добавляли строчку в код);
  2. Контракт — это 4я строчка снизу;
  3. Сompiler — 0.8.19;
  4. Zksolc Version — 1.3.7.

Созданный контракт можем проверить перейдя в скан zkSync Era по ссылке и вставить свой смарт контракт.

Готово, мы развернули смарт контракт!

Подписывайся на мои соцсети и будь в курсе всех актуальных новостей о тестнетах и нодах!)

📢 Мой телеграм-канал Millennials Crypto

📢 Мой Ютуб канал

📢 Мой твиттер https://twitter.com/mzemlu777 (всем оформлю взаимку ;) )