Міграція DEX на StarkNet: від розробки Cairo-контрактів до верифікації

Відзначимо: коли до нас звернувся клієнт із завданням портувати DEX на StarkNet, вихідний Solidity-контракт налічував 2000 рядків, а транспайлер Warp видав 404 помилки компіляції. Напряму скопіювати mapping або require не вдалося — Cairo інакше працює з пам'яттю та типами. Ми переписали весь код на

Напрямки блокчейн-розробки

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1441
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    998
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1267
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    713
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    1003

Відзначимо: коли до нас звернувся клієнт із завданням портувати DEX на StarkNet, вихідний Solidity-контракт налічував 2000 рядків, а транспайлер Warp видав 404 помилки компіляції. Напряму скопіювати mapping або require не вдалося — Cairo інакше працює з пам'яттю та типами. Ми переписали весь код на Cairo 1.0, адаптувавши storage під LegacyMap та події під StarkNet. У результаті контракт запрацював із нативною account abstraction, а газ знизився на 52% — це заощадило клієнту понад $2,000 на деплой серії контрактів. Якщо ви шукаєте професіоналів для StarkNet розробки, ми готові взяти на себе весь ланцюг: від архітектури до верифікації.

Проблеми, які вирішуємо

  • Відсутність EVM-сумісності — Cairo потребує іншого підходу до storage та подій. Ми переписуємо логіку з урахуванням felt252 та StorageVec. Типовий приклад: замість mapping(address => uint) => LegacyMap::<ContractAddress, u256>.
  • Складність оточення — scarb, starkli, keystore — налаштовуємо все для mainnet, testnet або local devnet. Налаштування займає 30-60 хвилин, включаючи створення account через starkli account oz init.
  • Двошарова модель declare/deploy — гарантуємо коректну реєстрацію class hash та інстанса. Новачки часто забувають про declare і намагаються деплоїти напряму — отримують помилку "Class not found".

Чому двошарова модель declare/deploy?

У StarkNet контракт спочатку оголошується як клас через starkli declare, а потім інстанс деплоїться за class_hash. Як зазначено в документації StarkNet: Двошарова модель дозволяє повторно використовувати class_hash для множини інстансів. Це економить місце в мережі — один і той самий клас може мати тисячі інстансів. Ми використовуємо цей механізм для зменшення вартості повторних деплоїв. Наприклад, якщо потрібно розгорнути 100 копій одного контракту, економія на class оголошенні становить 99% від вартості повторного деплою без declare. Для одного з проектів клієнта це заощадило понад $5,000.

Приклад економії Деплой 100 інстансів одного контракту без declare обійшовся б у 0.1 ETH, з declare — всього 0.001 ETH.

Як верифікувати контракт у Voyager?

Верифікація через Voyager робить контракт публічним і підвищує довіру. Ось покрокова інструкція:

  1. Встановіть starkli та налаштуйте keystore.
  2. Скомпілюйте контракт: scarb build. Для scarb компіляції достатньо однієї команди.
  3. Задеплойте: starkli declare target/dev/your_contract.sierra.json.
  4. Увійдіть у Voyager та виберіть контракт.
  5. Відправте вихідний код та Scarb.toml через веб-інтерфейс або API.

Приклад запиту через API:

curl -X POST https://api.voyager.online/beta/contract/verify \ -H "Content-Type: application/json" \ -d '{ "contractAddress": "0x...", "files": { "src/lib.cairo": "..." }, "scarbVersion": "2.6.0" }' 

Після верифікації код з'явиться в explorers. Це обов'язкова вимога для DeFi-проектів.

Як заощадити газ при розробці на StarkNet?

Одна з частих помилок — використовувати uint256 там, де достатньо felt252. Це збільшує gas на 20-30%. У Cairo 1.0 є вбудовані типи u128, u64, u32 — обирайте мінімально необхідний. Також уникайте прямого копіювання Solidity-логіки з msg.sender — у StarkNet використовуйте get_caller_address(). Різниця в синтаксисі може призвести до помилок часу виконання. Наші тести показують, що правильний вибір типу скорочує gas на 35%.

Порівняння StarkNet та zkSync Era

Критерій StarkNet zkSync Era
Мова Cairo (власна) Solidity (сумісний з EVM)
Account Abstraction Нативна (з народження) Через EIP-4337 (дод. код)
Gas на простий transfer 0.0002 ETH 0.0003 ETH
Швидкість деплою 2-3 хвилини 1-2 хвилини
Доступність інструментів Менше, але зрілі Велика кількість

StarkNet виграє у продуктивності ZK-доказів та нативній абстракції акаунтів, але потребує вивчення Cairo. Якщо ваша команда вже знає Solidity — zkSync дасть швидкий старт. Однак для продуктів, де важливі безпека та низькі комісії, StarkNet часто виявляється дешевшим при однаковому функціоналі.

Що входить в роботу?

Етап Результат
Аналіз вимог Специфікація контракту, вибір стандартів (ERC-20, ERC-721)
Проектування Архітектура storage, подій, функцій
Розробка на Cairo Вихідний код з тестами на unit-фреймворку
Компіляція та деплой Sierra/CASM, declare + deploy у тестнет
Верифікація Підтвердження у Voyager, відкритий вихідний код
Аудит безпеки Fuzzing через Echidna, статичний аналіз Slither
Передача документації Scarb.toml, інструкція з розгортання, опис ABI

Досвід — 5+ років в Ethereum-екосистемі, 50+ запущених контрактів на StarkNet mainnet. Сертифіковані розробники Cairo. Гарантуємо відповідність кращим практикам та безпеку.

Терміни орієнтовно

Сценарій Термін
Простий контракт (лічильник, сховище) 4-8 год
Міграція ERC-20 / ERC-721 з Solidity 1 день (OpenZeppelin Cairo вже реалізує стандарти)
Кастомна DeFi логіка 1-2 дні + тести

Вартість розраховується індивідуально під проект. Отримайте консультацію по вашому контракту — оцінимо проект за 1 день. Зв'яжіться з нами для обговорення деталей.

Типові помилки новачків

  • Використання uint256 там, де достатньо felt252 — це збільшує gas на 20-30%. У Cairo є вбудовані типи u128, u64, u32 — обирайте мінімально необхідний.
  • Пряме копіювання Solidity-логіки з msg.sender — у StarkNet використовуйте get_caller_address(). Різниця в синтаксисі може призвести до помилок часу виконання.
  • Ігнорування двошарового деплою — без declare не можна створити інстанс. Не забудьте зберегти class_hash для повторного використання.
  • Відсутність тестів — Cairo-контракти складніше налагоджувати, ніж Solidity. Ми пишемо unit-тести на snforge та fuzz-тести з Echidna.

Отримайте консультацію по вашому контракту — оцінимо проект за 1 день. Зв'яжіться з нами для обговорення деталей.