Skip to content

Latest commit

 

History

History
144 lines (94 loc) · 12.8 KB

zksync-dev-environment.md

File metadata and controls

144 lines (94 loc) · 12.8 KB

Среда разработки zkSync Era

Автор: Роман Ярлыков 🧐

В силу собственной виртуальной машины zkEVM, а также особенностей в работе с zero-knowledge proofs разработка смарт-контрактов для zkSync отличается от классической разработки для EVM.

Всегда обращайтесь к актуальной документации. Например в следующие разделы:

Инструменты

Foundry

С поддержкой фреймворка Foundry на момент написания этого материала все довольно грустно. За актуальными сведениями в этот репозиторий.

На данный момент зарелизили альфа-версию в которой реализован некоторый функционал forge и cast, называется zkforge и zkcast соответственно.

Возможности forge (детальнее тут):

  • можно компилировать контракты на Solidity с помощью zksolc (zk-compile, zk-build), файлы на выходе кладутся в папку zkout (видимо приставка zk будет везде 🙄). Максимальная версия компилятора 0.8.19.
  • можно задеплоить контракты с помощью zkforge zkcreate, zkforge zk-deploy
  • поддерживаются очень простые тесты

Полноценно разрабатывать и тестировать смарт-контракты используя forge пока возможности нет, т.к. не работают читкоды и сложные виды тестирования (например инвариантное и фаззинг).

Возможности cast (детальнее тут):

  • получение информации блокчейне (chain id, client, balance (L2), gas price, latest block)
  • взаимодеиствие с задеплоеными контактами, вызовы call и send (zk-send)
  • действия с мостом - ввод/вывод средств на L2 и с L2 (zkcast zk-deposit, zkcast zk-send --withdraw)

Также некоторый функционал с абстрактными аккаунтами, подробнее тут.

Не работает forge remappings, поэтому в контрактах можно использовать только абсолютные импорты. Нет возможности писать скрипты. Модуль forge debug не работает!

Важно! Модули forge и cast необходимо скомпилировать и собрать самостоятельно, поэтому для развертывания проекта также потребуется установить rust.

zksync-cli

Небольшая консольная тулза, которая позволяет в том числе создавать проекты hardhat и vyper (подробнее тут).

Hardhat

Создается с использованием zksync-cli, необходимо выбрать проект Hardhat + Solidity. Репозиторий по настройке проекта hardhat.

Важно! Необходима версия Node js не ниже 18.

$ npx zksync-cli@latest create-project test-project

Проект будет сконфигурирован под zk-evm (с настройкой для тестовых сред zkSync Era).

Компилируем контракты

$ yarn compile

Отдельно запустить In-Memory node

$ era_test_node run

Теперь можно выполнить деплой в локальную ноду либо в режиме форка блокчейна

$ yarn deploy --network inMemoryNode

Online IDE

Скомпилировать смарт-контракты в Remix не получится, потому что нужен zksolc, но можно воспользоваться другой online IDE - Atlas zk. Поддерживает в том числе и другие блокчейны.

Из плюсов - работают тесты foundry с читкодами, можно ставить библиотеки. Из минусов - очень скудная документация, многие вещи неочевидны, непонятно какой компилятор используется под капотом, если можно деплоить как zk так и в обычные блокчейны.


Тестовые среды

На данный момент есть 3 среды для тестирования и деббагинга: тестнет и 2 локальные среды (Docker, In-Memory node).

Runs Locally Rich Accounts Fast Setup Debugging
Testnet
local-setup (Docker)
In-Memory Node

Testnet

В качестве Layer 1 для тестнета используется Goerli, для перевода токенов из Goerli в zkSync Era testnet можно воспользоваться официальным мостом. Либо использовать кран от chainstack (но для этого понадобится их ключ API). Есть и другие краны.

Dockerized Local Setup

Это полнофункциональная симуляция сети zkSync Era, включающая в себя базу данных Postgres, локальный узел Geth (выполняет роль Layer 1) и узел zkSync. Эта среда подходит для всесторонних симуляций и тестирования, требующих взаимодействия между L1 и L2. Поддерживает более гибкую настройку, чем in-memory node. Подробнее тут.

In-Memory Node

In-Memory node, это локальная нода похожая на Anvil или hardhat node. Поддерживает форкинг состояния из различных сетей, включая основную сеть и тестовую сеть. Для разработки смарт-контрактов которые не требуют взаимодействия с L1 это самый подходящий вариант. Также используется для повторного воспроизведения транзакций в режиме форка сети.

🚫 Ограничения ✅ Функции
Нет связи между уровнем L1 и L2. Может форкать состояние основной сети, тестовой сети или пользовательской сети.
Некоторые API еще не реализованы. Может повторно воспроизводить существующие транзакции основной сети или тестовой сети.
Нет доступа к историческим данным. Использует локальные начальные загрузчики и системные контракты.
Разрешена только одна транзакция пакета транзакций на L1. Оперирует детерминированно в режиме без форкинга.
Фиксированные значения возвращаются для оценки zk Gas. Быстрый запуск с предварительно настроенными 'богатыми' аккаунтами.
Переразвертывание требует сброса кэша MetaMask. Поддерживает отладку через console.log в Hardhat.
Разрешает имена функций ABI и событий с использованием openchain.

Важно! In-Memory node находится на альфа-стадии разработки и не поддерживает все возможности блокчейна. Для окончательного тестирования рекомендуется использовать Dockerized Local Setup или тестовую сеть.

Пример работы с In-Memory node можно посмотреть в этом видео начиная с 5го часа.

Сравнение возможностей локальных сред

Особенность In-Memory node Dockerized Local Setup
Быстрый запуск
Поддержка форкинга состояния
Отладка через console.log
Подробные трассировки вызовов
Предварительно настроенные 'богатые' аккаунты
Повторение существующих транзакций
Быстрое выполнение интеграционных тестов
Взаимодействие между уровнем 1 и уровнем 2
Несколько транзакций в одной партии
Полный набор API ❌ (Только базовый)
Поддержка Websocket

Конфигурация тестовых сред

RPC Url chainID Layer 1
Testnet https://testnet.era.zksync.dev 280 Goerli
local-setup (Docker) http://localhost:3050 270 Geth
In-Memory Node http://localhost:8011 260 🟠