Lerchuck

Posted on Mar 20, 2023Read on Mirror.xyz

Розгортання смарт-контракту у тестовій мережі ZkSync Era

Увага! Для розгортання смарт-контракту в мережі ZkSync Era вам потрібно буде вказувати свій приватний ключ від гаманця метамаск. Хоча він і не вказується в даному гайді на пряму, рекомендую вам не вказувати приватний ключ гаманця, а використовувати тестові гаманці, щоб уникнути втрати коштів.

Також можна вручну:

Назва мережі : zkSync Era Testnet Нова URL-адреса RPC : https://zksync2-testnet.zksync.dev Ідентифікатор ланцюга : 280 Символ валюти : URL-адреса ETH Block Explorer : https://goerli.explorer.zksync.io/ URL-адреса веб-сокета : wss: //zksync2-testnet.zksync.dev/ws

  • Обмінюємо тестові токени з Goerli в мережу ZkSync Era: https://portal.zksync.io/bridge .

  • Завантажуємо та встановлюємо на ПК: а) Node.js - nodejs.com/en/ (я ставив версію, яка зліва, рекомендована для всіх. Після встановлення потрібно перезавантажити ПК!) б) Visual Studio Code - code.visualstudio.com/download

  • Створюємо папку на робочому столі HELLO-ZKSYNC

  • Відкриваємо Visual Studio та відкриваємо створену вами папку HELLO-ZKSYNC, натиснувши у лівому верхньому кутку File - Open folder

  • Натискаємо на значок праворуч зверху, як показано на скрині, у вас відкриється панель з консоллю (за замовчуванням буде обрано шлях до папки HELLO-ZKSYNC)

  • У консолі пишемо команди по одній (або копіюємо та вставляємо натискання правої клавіші миші), після кожної команди, натискаємо Enter

    npm init -y

    npm install --save-dev hardhat

    npm install -g [email protected]

    npx hardhat

  • Виберіть Create a TypeScript project , потім Enter кілька разів та y (вибраний автоматично, просто Enter тисніть)

  • Зліва в меню шукаємо файл hardhat.config.tsта натискаємо на нього. Змінюємо значення 0.8.18 на 0.8.17. Закриваємо та зберігаємо натиснувши на хрестик.

  • Далі створює папку greeterв папці HELLO-ZKSYNC, натиснувши кнопку як на скріншоті

  • У консолі введіть cd greeterі тиснемо Enter, щоб перейти до цієї папки

Далі прописуємо дві команди також у консолі по одній (або копіюємо та вставляємо натискання правої клавіші миші):

npm init -y

npm add -D typescript ts-node @types/node ethers@^5.7.2 zksync-web3@^0.13.4 @ethersproject/hash @ethersproject/web hardhat @matterlabs/hardhat-zksync-solc @matterlabs/hardhat-zksync-deploy

  • Далі створіть у папці greeter (папка вибрана, коли галочка опущена вниз) файл, натиснувши кнопку як на скрині і назвіть йогоhardhat.config.ts

  • Натиснувши на нього, відкриється поле, куди ми вставляємо наступний текст (копіюйте і просто вставляйте повністю натисканням правої клавіші миші та Paste). Скрін нижче.

    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",
      },
    };
    

Закрийте файл, натиснувши на хрестик та збережіть зміни!

  • У лівому меню в папці greeterстворюємо папку contractsта папку deploy, натиснувши на кнопку, як на скріншоті

  • У папці 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;
    }
}

Закриваємо файл, натиснувши на хрестик і зберігаємо!

  • Далі в консолі вводимо наступну команду і тиснемо Enter
npx hardhat compile

Якщо зробили все правильно, побачите наступне повідомлення:

  • Вибираємо у лівому вікні створену нами папку deploy, у ній створюємо файлdeploy.ts

і вставляємо в нього наступний код:

import fs from "fs"
import { utils, Wallet } from "zksync-web3";
import * as ethers from "ethers";
import { HardhatRuntimeEnvironment } from "hardhat/types";
import { Deployer } from "@matterlabs/hardhat-zksync-deploy";

const PRIV_KEY = fs.readFileSync(".secret").toString()

// 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(PRIV_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]);
  console.log("constructor args:" + 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}`);
  }
}

Закриваємо файл та зберігаємо!

  • Створюємо файл у папці greeter, назвемо його.secret

Саме в цей файл і вставлямо свій приватний ключ . Приватний ключ взяти можна тут:

  • Закриваємо файл та зберігаємо!

  • І нарешті у нас остання команда для деплою контракту

npx hardhat deploy-zksync

Чекаємо на появу наступних рядків:

Після цього переходимо в експлорер , вводимо номер свого контракту і бачимо, що він створений. Також можете ввести в експлорері адресу свого метамаску та побачити три транзакції, т.к. після команди деплою відразу відбувається ще й взаємодія із контрактом.

**Вітаю, ви розгорнули смарт-контракт у тестовій мережі ZKSync Era!

Тепер давайте верефікуємо його **Але після цього він буде доступний для кожного, що підвищує ризик злому та крадіжки вашого приватного ключа. Як писав на початку, робіть усі операції лише на тестовому гаманці.

  • Перейдіть в експлорер , введіть адресу свого контракту

  • Далі натисніть на вкладку Contract

  • Натискаємо кнопку Verify Smart Contract

  • Заповнюємо всі поля, як зазначено на картинці:

  • У поле Enter the Solidy Contract Code вставляємо:

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

У поле Constructor Arguments вставляємо дані, що з'явилися після деплою контракту

Якщо у когось він не з'являвся, він однаковий для всіх, можете вводити

0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000094869207468657265210000000000000000000000000000000000000000000000

  • Після того, як заповнили всі поля, натискаєте кнопку Verify Smart Contract

Вітаю, Ви верифікували свій смарт контракт!

Всім профіту. З повагою команда Shark Trade.