# Деплой смарт-контракта в сети ZkSync Era на Windows

By [Garry In Crypto (GIC)](https://paragraph.com/@garrycrypt0) · 2023-03-16

---

Disclaimer: для разворачивания смарт-контракта в сети ZkSync Era, вам нужно будет указывать свой приватный ключ от кошелька метамаск. Хоть он и не указывается в данном гайде на прямую, рекомендую вам не указывать приватный ключ основного кошелька, а использовать тестовые кошельки, во избежании утраты средств.

В этом гайде мы будем с вами делать деплой смарт контракта как в тестовой сети ZkSync Era, так и в мейннет

*   Добавляем сети ZkSync Era в метамаск:
    

Через сайт Chainlink:

[https://chainlist.org/?search=zksync+Era&testnets=true](https://chainlist.org/?search=zksync+Era&testnets=true)

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

**Тестовая:**

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

**Мейннет:**

Network Name: `zkSync Era Mainnet` RPC URL: `https://mainnet.era.zksync.io` Chain ID: `324` Currency Symbol: `ETH` Block Explorer URL: `https://explorer.zksync.io/` WebSocket URL: `wss://mainnet.era.zksync.io/ws`

*   Обмениваем тестовые токены из Goerli в сеть ZkSync Era Goerli для работы в тестнете: [https://portal.zksync.io/bridge](https://goerli.portal.zksync.io/).
    
*   Обмениваем токены из основной сети Ethereum в сеть ZkSync Era для работы в мейннете: [https://portal.zksync.io/bridge](https://portal.zksync.io/bridge).
    
*   Скачиваем и устанавливаем на ПК: а) Node.js - [nodejs.com/en/](https://nodejs.org/en/) (я ставил версию, которая слева, рекомендованная для всех. После установки нужно перезагрузить ПК) б) Visual Studio Code - [code.visualstudio.com/download](https://code.visualstudio.com/download)
    
*   Создаем папку на рабочем столе `HELLO-ZKSYNC`
    
*   Открываем Visual Studio и открываем созданную вами папку `HELLO-ZKSYNC`, нажав в левом верхнем углу File - Open folder
    

![](https://storage.googleapis.com/papyrus_images/1e646cb03c2bb7b4deba44d81d0072c540c82764aa0afd0cd2710c9f2f68d5ec.jpg)

*   Нажимаем на значок справа сверху, как показано на скрине, у вас откроется панель с консолью (по умолчанию будет выбран путь к вашей папке `HELLO-ZKSYNC`)
    

![](https://storage.googleapis.com/papyrus_images/d12b6795493d974af4d36e7b74ea91e0908580d14eae15db10bcd15470418a61.jpg)

*   В консоле пишем команды по одной (или копируем и вставляем нажатие правой клавиши мыши):
    

    npm init -y 
    

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

*   Далее создайте в папке `HELLO-ZKSYNC` (папка выбрана, когда галочка опущена вниз) файл, нажав на кнопку как на скрине и назовите его `hardhat.config.ts`
    

![](https://storage.googleapis.com/papyrus_images/62adec35be88b17b99a8f49e321033b83df9d78f83c1dbb92ebd35f218a52094.jpg)

*   Нажав на него откроется окно, куда мы вставляем следующий код (копируйте и просто вставляйте целиком нажатием правой клавиши мыши и Paste). В зависимости от того в какой сети делаете деплой смарт контракта, тот скрипт и копируете. Если в тестовой, то скрипт для тестовой сети, если в мейннете, то скрипт для мейннет. Скрин ниже.
    
    **Для тестовой сети:**
    

    import "@matterlabs/hardhat-zksync-deploy";
    import "@matterlabs/hardhat-zksync-solc";
    
    module.exports = {
      zksolc: {
        version: "1.3.5",
        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",
      },
    };
    

**Для мейннета:**

    import "@matterlabs/hardhat-zksync-deploy";
    import "@matterlabs/hardhat-zksync-solc";
    
    module.exports = {
      zksolc: {
        version: "1.3.5",
        compilerSource: "binary",
        settings: {},
      },
      defaultNetwork: "zkSyncMainnet",
    
      networks: {
        zkSyncMainnet: {
          url: "https://zksync2-mainnet.zksync.io",
          ethNetwork: "mainnet", // Can also be the RPC URL of the network (e.g. `https://goerli.infura.io/v3/<API_KEY>`)
          zksync: true,
        },
      },
      solidity: {
        version: "0.8.17",
      },
    };
    

Скрин:

![](https://storage.googleapis.com/papyrus_images/a80bd4c5d0a859ca8e7ebc049b3d02155cd6fcc933f043098d373e3702ed3bc0.jpg)

Закройте файл, нажав на крестик и сохраните изменения!

![](https://storage.googleapis.com/papyrus_images/1904453d14aa2155f483b070f789973952d9f4e02630df80fac31a2febc3161d.jpg)

*   В левом меню в папке `HELLO-ZKSYNC` создаем папку `contracts` и папку `deploy`, нажав на кнопку, как на скриншоте
    

![](https://storage.googleapis.com/papyrus_images/1f74b847232995d77048272bff6745895dea459b4536966938e4d7a19dfae5c0.jpg)

*   В папке `contracts` создаём файл `Greeter.sol`
    

![](https://storage.googleapis.com/papyrus_images/886a6f6f4b975e39d44f40d5dc92261bd3319643e61e70b00629eac6fa649c68.jpg)

и в него вставляем следующий код

    //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
    

Если сделали всё правильно увидите следующее сообщение:

![](https://storage.googleapis.com/papyrus_images/20ca5cdd1fe46038da4c1b290493c79f00b86363c701ef2db02f34b2c9f451a8.jpg)

*   Выбираем в левом окне созданную нами папку deploy, в ней создаём файл `deploy.ts`
    

![](https://storage.googleapis.com/papyrus_images/d12aa5058ce7c249aad7716fec2be2145135c4cb04f09abaa9258fbd0b591480.jpg)

и вставляем в него следующий код (код я слегка изменил, чтобы приватник указывать не на прямую в контракте, а просто путь к файлу, где указываем приватный ключ. По мне, так безопасней, но гарантий также никаких нет. Можете сравнить с оригинальным кодом из пункта 6 ([https://era.zksync.io/docs/api/hardhat/getting-started.html#write-and-deploy-a-contract](https://era.zksync.io/docs/api/hardhat/getting-started.html#write-and-deploy-a-contract)), добавил строчки 1 и 7, они и указывают путь к созданному файлу с приватником).

    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}`);
      }
    }
    

Закрываем файл и сохраняем!

*   Создаём файл в папке `HELLO-ZKSYNC`, назовём его `.secret`
    

![](https://storage.googleapis.com/papyrus_images/2d46f2b19a3aa1bd79ee37dcf148da07f6a63eef4409ae5a9dfd2eb645fb393b.jpg)

Как раз таки в этот файл и вставляем свой **приватный ключ**. Приватный ключ брать тут:

![](https://storage.googleapis.com/papyrus_images/a4acc9c5cab211964ac951d0093f232d8bdb990699faa88d7503f687e42c09d7.jpg)

Закрываем файл и сохраняем!

*   И наконец у нас последняя команда для деплоя контракта
    

    npx hardhat deploy-zksync
    

Ждём появления следующих строчек:

![](https://storage.googleapis.com/papyrus_images/41a95e1dc0e54ea00d13ac245cf4eee786db525e39e2baf5e104617e3ba16df2.jpg)

*   После этого переходим в [эксплорер](https://goerli.explorer.zksync.io/) для тестовой сети или [эксплорер](https://explorer.zksync.io/) для мейннета, вводим номер своего контракта и видим, что он создан. Также можете ввести в эксплорере адрес своего метамаска и увидеть две транзакции, т.к. после команды деплоя сразу происходит еще и взаимодействие с контрактом.
    

**Поздравляю, вы развернули смарт-контракт в тестовой сети ZKSync Era!!!**

Также вы можете верифицировать свой контракт. Но после этого он будет доступен для каждого (поэтому сразу не стал выкладывать эту часть), что повышает риск взлома и кражи вашего приватного ключа. Как писал в начале, делайте все операции только на тестовом кошельке

![](https://storage.googleapis.com/papyrus_images/058379a31f63f7b6ae125a9977e67506f220041b51d38bd1f64364b04ca32938.jpg)

Для этого:

*   Перейдите в [эксплорер](https://goerli.explorer.zksync.io/) для тестовой сети или [эксплорер](https://explorer.zksync.io/) для мейннета, введите адрес своего контракта (в какой сети делали смарт контракт, в тот эксплорер и заходите)
    
*   Далее нажмите на вкладку `Contract`
    

![](https://storage.googleapis.com/papyrus_images/0e89207a710881cc06890f9f475fb7ffbdf08129150b8baf4211e0062e5cfafe.jpg)

*   Нажимаем на кнопку `Verify Smart Contract`
    

![](https://storage.googleapis.com/papyrus_images/a8d72c87467d8c98ce80d67eb7f5801e9ea5535914a0d683fd20a746cd1e6ef4.jpg)

*   Заполняем все поля, как указано на картинке:
    

![](https://storage.googleapis.com/papyrus_images/141c265ce4e665d7e360492b30b23f4145b59174cf50d978191d9b20e893767c.jpg)

В поле `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` вставляем данные, что появились после деплоя контракта

![](https://storage.googleapis.com/papyrus_images/a4d731600a6ae1a1c4e4aaa6ede979d7d73776f974ae42bb140e2dc7da82e4d1.jpg)

Если у кого то он не появлялся, он одинаковый для всех, можете вводить

*   После того, как заполнили все поля, нажимаете кнопку `Verify Smart Contract`
    

![](https://storage.googleapis.com/papyrus_images/2065bee08483a6f3999a7499261f3419605b66a59538c4193b16f1d638128663.jpg)

**Поздравляю, Вы верифицировали свой смарт контракт!**

![](https://storage.googleapis.com/papyrus_images/ca74edc729e4d5d3dc42f76df676df708802bdcb1f6ec20ae99ecab1b63a065b.jpg)

---

*Originally published on [Garry In Crypto (GIC)](https://paragraph.com/@garrycrypt0/zksync-era-windows)*
