Автор: Роман Ярлыков 🧐
В силу собственной виртуальной машины zkEVM, а также особенностей в работе с zero-knowledge proofs разработка смарт-контрактов для zkSync отличается от классической разработки для EVM.
Всегда обращайтесь к актуальной документации. Например в следующие разделы:
С поддержкой фреймворка 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.
Небольшая консольная тулза, которая позволяет в том числе создавать проекты hardhat и vyper (подробнее тут).
Создается с использованием 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
Скомпилировать смарт-контракты в 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 | ✅ | ✅ | ✅ | ✅ |
В качестве Layer 1 для тестнета используется Goerli, для перевода токенов из Goerli в zkSync Era testnet можно воспользоваться официальным мостом. Либо использовать кран от chainstack (но для этого понадобится их ключ API). Есть и другие краны.
Это полнофункциональная симуляция сети zkSync Era, включающая в себя базу данных Postgres, локальный узел Geth (выполняет роль Layer 1) и узел zkSync. Эта среда подходит для всесторонних симуляций и тестирования, требующих взаимодействия между L1 и L2. Поддерживает более гибкую настройку, чем 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 | 🟠 |