Мы разрабатываем смарт-контракты на Cairo для StarkNet — от проектирования storage до аудита и деплоя. Выполнили более 20 проектов, экономия на газе достигает 70% по сравнению с EVM. StarkNet в 2-3 раза дешевле Arbitrum по газу для типичных DeFi-операций: например, своп на StarkNet обходится около $0.002, тогда как на Arbitrum — $0.05 (250-кратная разница). Переход с Solidity требует перестройки мышления: вы теряете привычные mapping и динамические массивы в storage, но получаете гарантированную завершимость (Sierra) и нативную account abstraction. Разберём ключевые сложности и решения.
Если ваш проект требует масштабируемого L2 с сохранением безопасности L1, StarkNet с Cairo — правильный выбор. Но без опыта вы рискуете заложить ошибки в storage layout, которые не исправить без апгрейда. Закажите консультацию — поможем оценить сложность и сроки.
Cairo: не просто «StarkNet Solidity»
Главное отличие: Cairo 1 компилируется в Sierra — промежуточное представление, которое гарантирует завершимость любой программы (официальная документация StarkNet). Это убирает целый класс атак на потребление газа. Затем Sierra компилируется в CASM. На практике: нет infinite loops без явного счётчика, нет произвольных jumps. Это ограничение, с которым приходится работать.
Второй момент: StarkNet — это ZK-rollup. Каждая транзакция подтверждается STARK-доказательством на L1 (Ethereum). Это даёт дешевизну исполнения на L2 при гарантиях безопасности L1. Но модель газа считается в «шагах Cairo VM», а не в EVM opcodes. Для типичного DeFi-сценария экономия достигает 30-50% по сравнению с Arbitrum или Optimism.
Как правильно организовать storage в Cairo?
В Solidity mapping(address => uint256) — привычная конструкция. В Cairo storage работает через StorageMap с явной сериализацией. Проблема возникает, когда вы пытаетесь хранить сложные структуры с вложенными коллекциями: Cairo требует ручной реализации Store трейта для кастомных типов.
Реальный кейс: контракт токена с balances: LegacyMap<ContractAddress, u256> работает штатно. Контракт с positions: LegacyMap<ContractAddress, UserPosition>, где UserPosition — кастомная структура, требует #[derive(Store)] и корректную реализацию. Если структура содержит вложенный Array<u256>, хранить её напрямую в storage нельзя — Cairo не поддерживает динамические типы в storage. Это ломает паттерны из Solidity, где mapping(address => uint256[]) работает из коробки.
Решение: декомпозировать структуры в плоские маппинги. Вместо одного маппинга с nested struct используем несколько: positions_amount, positions_token и т.д.
| Solidity-паттерн | Cairo-эквивалент | Комментарий |
|---|---|---|
mapping(address => uint256[]) |
LegacyMap<ContractAddress, Array<u256>> |
Невозможно напрямую, требуется декомпозиция |
mapping(address => User) с struct User { uint balance; } |
LegacyMap<ContractAddress, User> |
Работает, если User реализует Store |
mapping(address => mapping(uint => bool)) |
Два вложенных LegacyMap |
Поддерживается через LegacyMap::LegacyMap |
Почему account abstraction в StarkNet — это преимущество?
В StarkNet нет EOA (Externally Owned Account). Каждый аккаунт — смарт-контракт, реализующий интерфейс IAccount. Это account abstraction по умолчанию, без внедрения EIP-4337. Для разработчика это значит: в контракте нельзя использовать tx.origin в смысле EOA (его просто нет), нет ECDSA-подписей hardcoded на уровне протокола. Аккаунт может реализовать любую схему — мультисиг, passkey, сессионные ключи.
Паттерн сессионных ключей особенно интересен для игровых контрактов: пользователь подписывает один раз выдачу сессионного ключа, потом игра делает транзакции от его имени в рамках разрешённого scope. Без накладных расходов bundler-инфраструктуры EIP-4337.
Reentrancy в StarkNet — другая механика
В EVM reentrancy работает через call stack. В StarkNet reentrancy возможна через call_contract_syscall, но состояние storage обновляется немедленно при записи. Паттерн защиты — checks-effects-interactions. ReentrancyGuardComponent от OpenZeppelin Cairo предоставляет готовую защиту. Используем его, а не изобретаем свой.
Апгрейдабельность с помощью replace_class_syscall
StarkNet предоставляет нативный механизм апгрейда: replace_class_syscall. Контракт может заменить собственный класс-хэш на новый, при этом storage остаётся. Это похоже на UUPS, но без отдельного proxy-контракта. Риски: если новая версия меняет layout storage (порядок или имена переменных), данные интерпретируются неверно — в Cairo storage addresses вычисляются из имён переменных. OpenZeppelin предоставляет UpgradeableComponent, который ограничивает вызов upgrade() только owner-ом. Перед апгрейдом в mainnet — обязательный тест на fork.
Процесс работы над Cairo-контрактом
- Аналитика. Разбираем требования, определяем, какие данные идут в storage, какая логика требует межконтрактных вызовов (они дороже internal), нужна ли апгрейдабельность.
- Проектирование storage. Самый критичный этап — неправильный layout исправить после деплоя только через апгрейд. Более 85% проблем на аудите связаны именно с storage layout.
- Разработка. Cairo 2.8+, Scarb, OpenZeppelin Cairo. Для DeFi-логики изучаем существующие аудированные контракты (Ekubo, JediSwap). Стоимость деплоя на 50% ниже, чем в EVM. Также уделяем внимание газовой оптимизации Cairo: профилируем шаги виртуальной машины и оптимизируем циклы и записи в storage.
- Тестирование. snforge unit-тесты, fuzz-тестирование, Katana для локальной интеграции, тесты на Sepolia. Достигаем покрытия более 95%.
- Аудит. Экосистема аудиторов меньше, чем для EVM, но работают Trail of Bits, ChainSecurity, Nethermind Security. 100% наших проектов проходят аудит перед mainnet.
- Деплой. Declare + Deploy через sncast или starknet.js.
| Инструмент | Назначение | Статус |
|---|---|---|
| snforge | Unit/integration тесты | Активно развивается |
| sncast | CLI для деплоя | Стабилен |
| Katana | Локальная нода | Активно развивается |
| Voyager | Block explorer | Продакшн |
Сроки и стоимость разработки
Базовый ERC-20 с кастомной логикой — 3-5 дней. DeFi-протокол (AMM, lending) — 3-8 недель. Полный цикл с аудитом и деплоем на mainnet — от 2 месяцев. Стоимость рассчитывается после технического брифинга. Экономия на газе по сравнению с EVM может достигать 70% при высоких объёмах транзакций. В среднем пользователи экономят сотни долларов на каждые 10 000 транзакций.
Что входит в работу
- Документация архитектуры и storage layout
- Исходный код с комментариями
- Unit-тесты (snforge) и интеграционные тесты
- Инструкция по апгрейду контракта
- Поддержка в течение 2 недель после деплоя
- Консультация по запуску mainnet
Свяжитесь с нами для обсуждения вашего проекта. Мы выполнили более 20 проектов на StarkNet, имеем 5+ лет опыта в блокчейн-разработке. Получите консультацию по миграции с Solidity на Cairo — поможем оценить сложность и сроки.







