DEV Community

EgorMajj
EgorMajj

Posted on • Edited on

Развертывание смарт-контракта в тестовой сети ZkSync Era

Image description

Минимальные требования к серверу
1 CPU, 1 GB RAM, 30 GB SSD, 32 TB Traffic, Ubuntu 20.04

Я использую Contabo
https://contabo.com

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

Обновление системы

sudo apt update
sudo apt upgrade

При установке нажмите y

Установите загрузчик 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

Добавление сети ZkSync Era в метамаск: https://chainlist.org/?search=zkSync+Era+test&testnets=true

или вручную

Network Name: zkSync Era Testnet
New RPC URL: https://zksync2-testnet.zksync.dev
Chain ID: 280
Currency Symbol: ETH
Block Explorer URL: https://goerli.explorer.zksync.io/
WebSocket URL: wss://zksync2-testnet.zksync.dev/ws

Официальный источник PRC: https://era.zksync.io/docs/dev/fundamentals/interacting.html#connecting-to-zksync-era-on-metamask:~:text=Testnet%20network%20info

Обмениваем тестовые токены из Goerli в сеть ZkSync Era: https://portal.zksync.io/bridge.

Выполняем команды
npm init --y
npm install --save-dev hardhat
npm install -g npm@9.6.0
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@^0.13.1 @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.1",
    compilerSource: "binary",
    settings: {},
  },
  defaultNetwork: "zkTestnet",
  networks: {
    zkTestnet: {
      url: "https://zksync2-testnet.zksync.dev", // URL of the zkSync network RPC
      ethNetwork: "goerli", // Can also be the RPC URL of the Ethereum network (e.g. `https://goerli.infura.io/v3/<API_KEY>`)
      zksync: true,
    },
  },
  solidity: {
    version: "0.8.17",
  },
};
Enter fullscreen mode Exit fullscreen mode

Выполняем команды
mkdir contracts
mkdir deploy
vim contracts/Greeter.sol

Откроется страница редактирования, снова нажмите i и вставьте приведенный ниже скрипт

//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;
    }
}
Enter fullscreen mode Exit fullscreen mode

Затем нажмите Esc и :wq

Выполняем команды
npx hardhat compile
vim deploy/deploy.ts

Откроется страница редактирования, снова нажмите i и вставьте приведенный ниже скрипт

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");

  // Deposit some funds to L2 in order to be able to perform L2 transactions.
  const depositAmount = ethers.utils.parseEther("0.001");
  const depositHandle = await deployer.zkWallet.deposit({
    to: deployer.zkWallet.address,
    token: utils.ETH_ADDRESS,
    amount: depositAmount,
  });
  // Wait until the deposit is processed on zkSync
  await depositHandle.wait();

  // 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]);

  // 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}`);
  }
}
Enter fullscreen mode Exit fullscreen mode

At const wallet = new Wallet(""); измените на свой закрытый ключ метамаска.

ДИСКЛАЙМЕР:Развертывайте смарт-контракт с нового кошелька, не имеющего реальных средств, что бы избежать финансовых потерь!

Затем нажмите Esc и :wq

Выполните команду
npx hardhat deploy-zksync

Должен появиться текст

Greeter was deployed to (номер вашей метамаска)
Contract greets us with Hi there!!
Contract greets us with Hey guys!
Enter fullscreen mode Exit fullscreen mode

Заходим в эксплорер https://goerli.explorer.zksync.io/ , вводим свой номер метамаска и видим три транзакции, так как после команды развертывания сразу происходит и взаимодействие с контрактом.

Это означает, что смарт-контракт развернут!

Поздравляю!

Top comments (8)

Collapse
 
mikke555 profile image
mikke555

Зачем нужно мучаться с сервером и с Vim-ом, когда можно тоже самое запустить локально?

Collapse
 
antony220998 profile image
Antony Tony

:wq это что за такое ваще, сори если кого-то обидел

Collapse
 
cronastore profile image
Olga Skraglenko

пишет успешный деплой, но транз в эксплорере на метамаске не видно

Collapse
 
igormig77 profile image
Igor Machniev

Автор пропустил целый раздел.

Collapse
 
olegrio1993 profile image
Olegrio1993

на маке делаю с терминала после: "Затем нажмите Esc и :wq", - ничего не происходит, как правильно?

Collapse
 
igormig77 profile image
Igor Machniev

Когда копируете чужой гайд, будьте внимательны.

Collapse
 
rznd8 profile image
Daniel

можете подсказать где оригинал?

Collapse
 
etherad1 profile image
etherad1

сервер после развертывания можно удалять ?