Аудит і деплой смарт-контрактів: Ethereum mainnet під ключ

Логіка в основній мережі працює з активами користувачів: помилка під час розгортання коштує дорого й підриває довіру. Ми проводимо аудит смарт-контрактів, розгортаємо їх під ключ і передаємо доступи разом із документацією. Шлях від готового коду до працюючого контракту скорочується у рази, а клас відмов під час оновлення логіки закривається до запуску.
Часті запитання

Деплой смарт-контракту: де ламається і що втрачає бізнес

Деплой смарт-контракту в основну мережу Ethereum — операція з одностороннім рухом: після підтвердження транзакції код стає незмінним, і правки до нього вже не внести.

Більшість втрат трапляється не в момент публікації, а в логіці, яку туди відправили: помилка під час публікації коду в тестовому середовищі виглядає нешкідливо, а в основній мережі обертається втраченими активами.

Необоротність транзакцій — властивість мережі, а не недоробка інструментів. Відкотити підтверджену транзакцію не можна: єдиний вихід — новий контракт і міграція, якщо вона взагалі передбачена архітектурою.

Без механізму оновлення або аварійної зупинки власник сервісу дивиться на проблему збоку, без важелів.

Найдорожче обходиться уразливість у логіці: переповнення в розрахунках, порядок перевірок, що дозволяє зняти кошти двічі, відкритий доступ до критичних функцій. Компілятор таке пропускає — він перевіряє синтаксис, а не наміри автора. Ціна помилки — виведені кошти й підірвана довіра до продукту.

Окрема точка відмови — втрата доступу до акаунта розгортання. Ключ лежить в одному місці, іде в листуванні, залишається у підрядника — і разом із ним ідуть права власника контракту.

Нижче розбираємо, як це закривається: від підготовки й перевірки до публікації з резервними сценаріями управління та зрозумілим планом міграції.

Вимірюваний ефект: термін випуску, відкати, клас відмов

Керований процес вирізняють не обіцянки, а вимірювані показники до і після. Нижче — те, на чому видно ефект від аудиту, вибудуваного контуру збірки та контрольованого запуску в основну мережу Ethereum.

Термін випуску оновлень

Контракт збирається в одному й тому ж середовищі на кожній ітерації, перевірки проганяються автоматично до того, як зміни подивиться команда.

Час від завершення аудиту до коду в основній мережі скорочується з тижнів до днів — випуск версії перестає залежати від ручних кроків конкретного інженера.

Частота інцидентів

Кожен контракт отримує набір перевірок, що покривають розгалуження логіки та межі значень. Частка шляхів, які проходить автоматика, зростає, а кількість звернень щодо інцидентів після запуску падає: типові помилки відсікаються до публікації, а не після.

Час відновлення сервісу

Ролі, обмеження на випуск і процедура зупинки описуються заздалегідь. Коли щось іде не так, повернення до попереднього стану займає хвилини замість годин узгоджень — заздалегідь зрозуміло, хто і яку дію виконує.

Зниклий клас відмов

Окремо зникає ціла група проблем: втрата управління, повторний випуск, розбіжність адрес і прав доступу. Ці сценарії закриваються схемою розгортання та перевірками в тестовій мережі, тому не доживають до основної.

Варіанти розміщення логіки: порівняння підходів

Вибір середовища визначає, хто може викликати контракт, скільки коштує запис стану і як швидко транзакція стає необоротною. Нижче — чотири варіанти, між якими реально обирають у проєктах, з умовами застосовності й обмеженнями кожного.

Варіант Коли підходить Обмеження
Публічна основна мережа Робота із зовнішніми користувачами, публічна перевірюваність коду, інтеграція з чужими протоколами Запис стану оплачується газом, виклики видно всім, помилку в логіці не можна відкотити — тільки випустити нову версію
Тестова мережа й репліка основної Прогін міграцій і сценаріїв деплою, відпрацювання прав доступу перед релізом Стан не повторює основну мережу, поведінка під навантаженням і порядок транзакцій інші — переносність перевіряється частково
Приватна мережа з обмеженим доступом Внутрішній облік між відомими учасниками, дані не виходять назовні Немає зовнішньої перевірюваності, довіру учасники підтверджують окремо, підтримка вузлів і оновлень лягає на нас
Шар другого рівня Масові операції користувачів, де важливі вартість запису й швидкість підтвердження Логіка розноситься між шарами, додається виведення коштів в основну мережу, моніторинг і перевірки ускладнюються

Тестова мережа обов’язкова, але не замінює аудит: вона ловить помилки розгортання, а не помилки в економіці контракту. Якщо логіка працює з чужими активами, між тестовою й основною мережею ставимо поступовий запуск — білий список адрес і ліміт обсягу операцій на старті.

Як проходить деплой смарт-контракту: етапи інженерної роботи

Деплой в основній мережі — необоротна операція: після публікації логіку контракту не можна переписати, можна лише задіяти заздалегідь закладені механізми оновлення. Тому порядок робіт фіксуємо до першої транзакції й проганяємо його цілком, а не окремими кроками.

  1. Аудит логіки. Розбираємо контракт за гілками виконання: зовнішні виклики, права на зміну параметрів, обробка повернень. Знахідки закриваємо правками й повторним прогоном — на виході звіт зі статусами.
  2. Схема розміщення. Визначаємо, що публікуємо окремо, а що зв’язуємо через проксі, де лежать бібліотеки. Порядок транзакцій фіксуємо заздалегідь: адреси, від яких залежать наступні кроки, створюються першими.
  3. Налаштування доступів і підписантів. Ролі адміністратора, оператора й аварійної паузи розводимо за різними ключами, критичні операції — за мультипідписом із порогом підтверджень. Ключі не зберігаються в репозиторії й не потрапляють у збиральні артефакти.
  4. Перевірка в тестовій мережі. Повторюємо публікацію цілком: ініціалізація параметрів, видача ролей, міграції. Окремо проганяємо сценарії відмови — виклик без прав, повторне виконання, відкат транзакції.
  5. Публікація в основній мережі. Транзакції йдуть затвердженим порядком із перевіркою стану після кожної, вихідний код верифікуємо в оглядачі. Адреси й хеші звіряємо до передачі команді.
  6. Передача документації. Віддаємо схему розміщення зі зв’язками, перелік ролей і підписантів, порядок оновлення й відкату, регламент аварійної паузи.

Склад документації та доступів, що передаються

Передаємо не архів файлів, а робочу систему, яку ваша команда може розвивати без нас. Кожен пункт перевіряється на прийманні: без нього супровід швидко перетворюється на спроби вгадати, як це було налаштовано.

  • Конфігурації розміщення — адреси розгорнутих контрактів для кожної мережі, параметри ініціалізації, використовувані вузли доступу, налаштування збірки та хеші вихідних кодів, за якими перевірялася компіляція.
  • Схеми взаємодії — діаграми викликів між контрактами, гаманцями й зовнішніми сервісами: хто кого викликає, які події читає бекенд, де розташовані точки відмови.
  • Політики доступу й ролі — матриця прав у контрактах і на гаманцях: власник, оператор, зупинка операцій, мультипідпис; які дії кому доступні та які пороги підписів задано.
  • Регламент оновлень — порядок випуску нової реалізації: підготовка, прогін тестів на копії мережі, збір підписів, вікно застосування та план відкату на попередню версію.
  • Документація на код — призначення контрактів і функцій, підтримувані інваріанти, відомі обмеження, інструкція з локального розгортання та запуску перевірок.
  • Звіт аудиту — знайдені зауваження, статус їх закриття та ризики, прийняті усвідомлено, з обґрунтуванням рішення.
  • Доступи й ключі — передача прав власника з ротацією: нові ключі створюються на вашій стороні, наші відкликаються, історія операцій залишається у відкритому реєстрі.

Приймання йде за чек-лістом, а не «на словах»: кожен пункт підтверджується запуском — розгортання на копії мережі, читання подій, відпрацювання сценарію оновлення.

Кейс: як закрили клас відмов під час оновлення логіки

Проєкт — торгова площадка з логікою умовного зберігання коштів: один контракт зберігав баланси, комісію та чергу спорів.

Будь-яке оновлення тарифної формули означало ручну міграцію стану: приймання заявок зупиняли на 40 хвилин, а після викату раз на два-три тижні спливали розбіжності в залишках. Клас відмов неприємний тим, що дані вже перезаписані — повернути попередню версію логіки недостатньо.

Ми розвели логіку й стан: оновлювана частина зібрана на базі OpenZeppelin, доступ до заміни логіки закритий багатопідписним гаманцем із затримкою, а сама заміна — одна транзакція із заздалегідь перевіреною процедурою повернення.

Перед кожним викатом сценарії спорів і виплат проганяються на копії основної мережі з реальним станом, розбіжності в залишках звіряються автоматично до і після.

Метрики до і після

Вікно оновлення скоротилося з 40 хвилин до двох-трьох, викати з розбіжністю балансів припинилися — замість кожного третього тепер нуль за весь період супроводу.

Термін реакції на інцидент упав із 6-8 годин до 15 хвилин: розбір більше не починається з ручного читання логів, черговий інженер бачить аномалію в залишках і повертає попередню логіку однією транзакцією.

Супровід триває: планові релізи, моніторинг залишків і перезбірка перевірок під нові сценарії спорів.

Що робити, якщо розгорнута логіка вже працює в основній мережі?

Розгорнутий контракт в основній мережі незмінний: байткод, записаний один раз, переписати не можна. Якщо логіка заздалегідь не розділена на сховище й реалізацію, оновлення розгорнутої логіки зводиться до випуску за новою адресою та перенесення стану.

Звідси правило, яке ми проговорюємо до першого деплою: оновлюваність закладається в архітектуру заздалегідь, а не винаходиться після інциденту.

Схема заміни без простою будується на контракті-обгортці: користувачі й інтеграції завжди звертаються до однієї незмінної адреси, дані лежать там же, а адреса реалізації змінюється однією транзакцією. Перемикання відбувається цілком — або активна попередня логіка, або нова.

Стану «сервіс зупинено й чекає» не виникає, тому зупинка сервісу для планового оновлення не потрібна й не повинна бути частиною схеми.

Зворотна сумісність — головне обмеження такої заміни. Новий код зобов’язаний читати вже записані дані в попередньому порядку й із попередніми типами: варто зсунути черговість полів, і старі баланси прочитаються як чужі.

Тому перед перемиканням ми звіряємо розкладку сховища й проганяємо нову реалізацію на копії основної мережі з реальним станом акаунтів, а не на порожніх тестових даних.

Чого робити не можна: змінювати сигнатури публічних методів, на які вже спираються зовнішні виклики; перевикористовувати адресу під інший сенс записаних значень; точково правити одну ланку в ланцюжку пов’язаних контрактів — оновлення одного ламає інші.

Окремо перевіряємо, що адміністративні функції обмежені й не дозволяють підмінити реалізацію без узгодженого порядку.

Якщо оновлюваність спочатку не закладена, залишається паралельний запуск: нова версія приймає нові операції, стан переноситься частинами, перемикання викликів іде після звірки сум і статусів. Це дорожче в підготовці, але проходить без зупинки сервісу й без розриву для користувачів.

Технічні сумніви: відповідаємо на запитання інженерів

Усі п’ять запитань нижче — не про код, а про процедуру навколо нього. Саме на ній ламаються проєкти, які технічно написані правильно. Відповідаємо так, як пояснюємо до старту.

Хто тримає ключі від публікації контракту?

Ключ деплою не зберігається в репозиторії, листуванні або на машині виконавця. Його генерують в апаратному модулі підпису, який залишається у вас, а випуск іде через мультипідпис: наодинці не можна ні вивести кошти, ні змінити логіку.

Копію фрази відновлення фіксуємо в захищеному сховищі заздалегідь — втрата доступу до контракту необоротна.

Як розмежовується доступ між командами?

Ролі ділимо за мінімально достатніми правами: адміністратор контракту, оператор, спостерігач. Облікові записи видаються під конкретні дії, і кожна транзакція потрапляє в журнал із зазначенням ініціатора. Розбір зміни можливий постфактум і не залежить від того, хто залишився в команді.

Що перевіряється до публікації?

Статичний аналіз, покриття тестами гілок із грошовою логікою, ручний розбір прав і повторних викликів, прогін на копії мережі. Окремо дивимося зовнішні залежності: чужі бібліотеки та джерела даних найчастіше й стають дірою, якої немає у вашому коді.

Що відбувається під час інциденту?

Регламент узгоджено заздалегідь: хто вирішує про паузу, як зупиняється контракт, де лежать адреси для відкликання прав. Реакція вимірюється хвилинами, а не годинами, тому схема й доступи затверджуються до публікації, а не в момент спрацювання тривоги.

Що входить у супровід після передачі?

Передаємо вихідні коди, схему адрес, звіт про перевірки та інструкції з оновлення. Далі залишаємося на підтримці: оновлення залежностей, повторна перевірка перед релізами, розбір інцидентів. Опишіть задачу — повернемося з оцінкою та планом.

Обговоримо задачу: надішлемо оцінку та план робіт

Щоб повернутися з оцінкою та планом робіт, а не з діапазоном «від і до», нам потрібен мінімальний склад вихідних даних.

Репозиторій із контрактами, артефакти збірки й конфігурацію мережі ми розбираємо самі — готувати щось спеціально під нас не потрібно, достатньо того, що вже є в команди.

Далі порядок такий: уточнюємо незрозуміле, фіксуємо обсяг перевірок і схему релізу, узгоджуємо терміни й точки приймання. Нижче — що потрібно на вході.

  • Репозиторій або адреси вже розгорнутих контрактів: звіримо версію компілятора, залежності та точку входу.
  • Мережа й контур: основна чи тестова, вимоги до підтверджень, хто тримає ключ деплоєра.
  • Ролі й доступи: власник, адміністратор, пауза, оновлення контракту — що має залишитися керованим після запуску.
  • Вимоги до перевірок: частка шляхів під тестами, статичний аналіз, переповнення, повторний вхід, права на випуск токенів.
  • Схема релізу: порядок кроків, міграція стану, відкат на попередню версію без втрати даних.
  • Приймання: які метрики вважаємо результатом і на якому стенді перевіряємо.
  • Інфраструктура: вузол або провайдер доступу до мережі, моніторинг подій і оповіщення після запуску.

Підтверджуємо отримання протягом робочого дня й одразу повертаємося з переліком уточнень. Після ваших відповідей надсилаємо оцінку та план робіт з етапами, залежностями й термінами по кожному — обговорюємо задачу й стартуємо.

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

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

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1369
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    816
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1142