Развертывание смарт-контракта в тестовой сети ZkSync Era
Published: 2023-03-14 08:45:57


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a3rk3zwglz31e5x2uy1b.png)

**Минимальные требования к серверу**
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** для редактирования и введите приведенный ниже скрипт

```javascript
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",
  },
};
```
Выполняем команды
`mkdir contracts`
`mkdir deploy`
`vim contracts/Greeter.sol`

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

```javascript
//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;
    }
}
```

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

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

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

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

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!
```

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

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

Поздравляю!