Увага! Для розгортання смарт-контракту в мережі ZkSync Era вам потрібно буде вказувати свій приватний ключ від гаманця метамаск. Хоча він і не вказується в даному гайді на пряму, рекомендую вам не вказувати приватний ключ гаманця, а використовувати тестові гаманці, щоб уникнути втрати коштів.
- Додаємо мережу ZkSync Era до метамаску: https://chainlist.org/?search=zkSync+Era+test&testnets=true
Також можна вручну:
Назва мережі : 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
Вітаю, Ви верифікували свій смарт контракт!