[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-20-cicd-smart-kontrakty-gaz-regressiya":3},{"article":4,"author":60},{"id":5,"category_id":6,"title":7,"slug":8,"excerpt":9,"content_md":10,"content_html":11,"locale":12,"author_id":13,"published":14,"published_at":15,"meta_title":16,"meta_description":17,"focus_keyword":18,"og_image":19,"canonical_url":19,"robots_meta":20,"created_at":15,"updated_at":15,"tags":21,"category_name":39,"related_articles":40},"d0000000-0000-0000-0000-000000000220","a0000000-0000-0000-0000-000000000012","Deep EVM #20: CI\u002FCD для смарт-контрактов — тесты, газ-регрессия и безопасность","deep-evm-20-cicd-smart-kontrakty-gaz-regressiya","Построение полного CI\u002FCD-пайплайна для смарт-контрактов: автоматизированные тесты, газ-регрессия, статический анализ и безопасность деплоя.","## Почему CI\u002FCD критичен для смарт-контрактов\n\nСмарт-контракты неизменяемы после деплоя. Ошибка в продакшене — это не «откатим и пофиксим», а потенциальная потеря миллионов долларов. CI\u002FCD-пайплайн для блокчейн-проектов должен быть строже, чем для обычного софта, потому что цена ошибки несоизмеримо выше.\n\nВ этой статье мы построим полноценный пайплайн, который включает компиляцию, юнит-тесты, фазз-тесты, газ-регрессию, статический анализ безопасности и безопасный деплой.\n\n## Архитектура пайплайна\n\nОптимальный CI\u002FCD-пайплайн для смарт-контрактов состоит из пяти этапов:\n\n1. **Lint & Format** — проверка стиля кода\n2. **Compile** — компиляция контрактов\n3. **Test** — юнит-тесты, фаззинг, инварианты\n4. **Security** — статический анализ, проверка зависимостей\n5. **Deploy** — контролируемый деплой с верификацией\n\n## Этап 1: Lint и форматирование\n\n```yaml\nlint:\n  stage: lint\n  script:\n    - forge fmt --check\n    - solhint 'src\u002F**\u002F*.sol'\n    - forge build --sizes  # Проверка размера контрактов\n  rules:\n    - if: $CI_MERGE_REQUEST_ID\n```\n\nФорматирование с `forge fmt` должно быть единообразным. Solhint проверяет паттерны безопасности: правильное использование `external` vs `public`, наличие NatSpec-документации, запрет `tx.origin`.\n\n## Этап 2: Компиляция и размер контрактов\n\nEVM ограничивает размер контракта 24 576 байтами (EIP-170). Проверяйте это в CI:\n\n```bash\nforge build --sizes 2>&1 | while IFS= read -r line; do\n  size=$(echo \"$line\" | grep -oP '\\d+\\.\\d+')\n  if [ \"$(echo \"$size > 24\" | bc)\" -eq 1 ]; then\n    echo \"ERROR: Contract exceeds size limit: $line\"\n    exit 1\n  fi\ndone\n```\n\n## Этап 3: Многоуровневое тестирование\n\n### Юнит-тесты с покрытием\n\n```bash\nforge test --match-test \"test_\" -vvv\nforge coverage --report lcov\n```\n\n### Фаззинг\n\n```bash\nforge test --match-test \"testFuzz_\" --fuzz-runs 50000\n```\n\n### Инвариантное тестирование\n\n```bash\nforge test --match-test \"invariant_\" --fuzz-runs 1000\n```\n\n## Этап 4: Газ-регрессия\n\nГаз-снепшоты позволяют отслеживать потребление газа между коммитами:\n\n```bash\nforge snapshot --check .gas-snapshot --tolerance 5\n```\n\nТолеранс 5% допускает незначительные колебания из-за оптимизаций компилятора, но поймает значительные регрессии. Если порог превышен — MR блокируется.\n\nДля автоматического обновления базового уровня на main:\n\n```yaml\nupdate-gas-snapshot:\n  stage: post-merge\n  script:\n    - forge snapshot\n    - git add .gas-snapshot\n    - git commit -m \"chore: Update gas snapshot\"\n    - git push\n  rules:\n    - if: $CI_COMMIT_BRANCH == \"main\"\n```\n\n## Этап 5: Статический анализ безопасности\n\n### Slither\n\n```bash\nslither . --filter-paths \"test\u002F|script\u002F\" \\\n  --exclude-dependencies \\\n  --sarif results.sarif\n```\n\nSlither обнаруживает reentrancy, неконтролируемые делегат-коллы, некорректное использование `tx.origin` и десятки других паттернов уязвимостей.\n\n### Mythril\n\n```bash\nmyth analyze src\u002FContract.sol --solc-json mythril.config.json\n```\n\nMythril использует символическое выполнение для обнаружения уязвимостей, которые пропускает статический анализ.\n\n### Aderyn\n\n```bash\naderyn . --src src\u002F\n```\n\nAderyn — новый инструмент от Cyfrin, специализирующийся на Foundry-проектах.\n\n## Безопасный деплой\n\nДеплой смарт-контрактов должен быть контролируемым:\n\n```bash\n# Деплой с верификацией на Etherscan\nforge script script\u002FDeploy.s.sol:DeployScript \\\n  --rpc-url $RPC_URL \\\n  --broadcast \\\n  --verify \\\n  --etherscan-api-key $ETHERSCAN_KEY \\\n  --slow  # Ожидание подтверждения каждой транзакции\n```\n\nВажные принципы:\n- **Dry run перед деплоем**: `--broadcast` без `--verify` сначала\n- **Мультисиг для критичных операций**: используйте Safe (бывший Gnosis Safe)\n- **Timelock**: задержка между предложением и исполнением\n- **Мониторинг после деплоя**: подписка на события через Tenderly\n\n## Пример полного пайплайна GitLab CI\n\n```yaml\nstages:\n  - lint\n  - build\n  - test\n  - security\n  - deploy\n\nvariables:\n  FOUNDRY_PROFILE: ci\n\nlint:\n  stage: lint\n  script:\n    - forge fmt --check\n    - solhint 'src\u002F**\u002F*.sol'\n\nbuild:\n  stage: build\n  script:\n    - forge build --sizes\n  artifacts:\n    paths: [out\u002F]\n\ntest-unit:\n  stage: test\n  script:\n    - forge test --match-test \"test_\" -vvv\n    - forge coverage --report summary\n\ntest-fuzz:\n  stage: test\n  script:\n    - forge test --match-test \"testFuzz_|invariant_\" --fuzz-runs 50000\n  timeout: 30m\n\ngas-check:\n  stage: test\n  script:\n    - forge snapshot --check .gas-snapshot --tolerance 5\n  allow_failure: false\n\nsecurity:\n  stage: security\n  script:\n    - slither . --filter-paths \"test\u002F|script\u002F\"\n    - aderyn . --src src\u002F\n\ndeploy-testnet:\n  stage: deploy\n  script:\n    - forge script script\u002FDeploy.s.sol --rpc-url $SEPOLIA_RPC --broadcast --verify\n  when: manual\n  environment: staging\n```\n\n## Заключение\n\nCI\u002FCD для смарт-контрактов — это не роскошь, а необходимость. Автоматизированный пайплайн с многоуровневым тестированием, газ-регрессией и статическим анализом безопасности — единственный надёжный способ обеспечить качество неизменяемого кода. Инвестируйте в инфраструктуру CI\u002FCD сейчас — это окупится при первом же предотвращённом инциденте.","\u003Ch2 id=\"ci-cd\">Почему CI\u002FCD критичен для смарт-контрактов\u003C\u002Fh2>\n\u003Cp>Смарт-контракты неизменяемы после деплоя. Ошибка в продакшене — это не «откатим и пофиксим», а потенциальная потеря миллионов долларов. CI\u002FCD-пайплайн для блокчейн-проектов должен быть строже, чем для обычного софта, потому что цена ошибки несоизмеримо выше.\u003C\u002Fp>\n\u003Cp>В этой статье мы построим полноценный пайплайн, который включает компиляцию, юнит-тесты, фазз-тесты, газ-регрессию, статический анализ безопасности и безопасный деплой.\u003C\u002Fp>\n\u003Ch2 id=\"\">Архитектура пайплайна\u003C\u002Fh2>\n\u003Cp>Оптимальный CI\u002FCD-пайплайн для смарт-контрактов состоит из пяти этапов:\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Cstrong>Lint &amp; Format\u003C\u002Fstrong> — проверка стиля кода\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Compile\u003C\u002Fstrong> — компиляция контрактов\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Test\u003C\u002Fstrong> — юнит-тесты, фаззинг, инварианты\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Security\u003C\u002Fstrong> — статический анализ, проверка зависимостей\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Deploy\u003C\u002Fstrong> — контролируемый деплой с верификацией\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch2 id=\"1-lint\">Этап 1: Lint и форматирование\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-yaml\">lint:\n  stage: lint\n  script:\n    - forge fmt --check\n    - solhint 'src\u002F**\u002F*.sol'\n    - forge build --sizes  # Проверка размера контрактов\n  rules:\n    - if: $CI_MERGE_REQUEST_ID\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Форматирование с \u003Ccode>forge fmt\u003C\u002Fcode> должно быть единообразным. Solhint проверяет паттерны безопасности: правильное использование \u003Ccode>external\u003C\u002Fcode> vs \u003Ccode>public\u003C\u002Fcode>, наличие NatSpec-документации, запрет \u003Ccode>tx.origin\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch2 id=\"2\">Этап 2: Компиляция и размер контрактов\u003C\u002Fh2>\n\u003Cp>EVM ограничивает размер контракта 24 576 байтами (EIP-170). Проверяйте это в CI:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">forge build --sizes 2&gt;&amp;1 | while IFS= read -r line; do\n  size=$(echo \"$line\" | grep -oP '\\d+\\.\\d+')\n  if [ \"$(echo \"$size &gt; 24\" | bc)\" -eq 1 ]; then\n    echo \"ERROR: Contract exceeds size limit: $line\"\n    exit 1\n  fi\ndone\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"3\">Этап 3: Многоуровневое тестирование\u003C\u002Fh2>\n\u003Ch3>Юнит-тесты с покрытием\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\">forge test --match-test \"test_\" -vvv\nforge coverage --report lcov\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Фаззинг\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\">forge test --match-test \"testFuzz_\" --fuzz-runs 50000\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Инвариантное тестирование\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\">forge test --match-test \"invariant_\" --fuzz-runs 1000\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"4\">Этап 4: Газ-регрессия\u003C\u002Fh2>\n\u003Cp>Газ-снепшоты позволяют отслеживать потребление газа между коммитами:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">forge snapshot --check .gas-snapshot --tolerance 5\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Толеранс 5% допускает незначительные колебания из-за оптимизаций компилятора, но поймает значительные регрессии. Если порог превышен — MR блокируется.\u003C\u002Fp>\n\u003Cp>Для автоматического обновления базового уровня на main:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-yaml\">update-gas-snapshot:\n  stage: post-merge\n  script:\n    - forge snapshot\n    - git add .gas-snapshot\n    - git commit -m \"chore: Update gas snapshot\"\n    - git push\n  rules:\n    - if: $CI_COMMIT_BRANCH == \"main\"\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"5\">Этап 5: Статический анализ безопасности\u003C\u002Fh2>\n\u003Ch3>Slither\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\">slither . --filter-paths \"test\u002F|script\u002F\" \\\n  --exclude-dependencies \\\n  --sarif results.sarif\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Slither обнаруживает reentrancy, неконтролируемые делегат-коллы, некорректное использование \u003Ccode>tx.origin\u003C\u002Fcode> и десятки других паттернов уязвимостей.\u003C\u002Fp>\n\u003Ch3>Mythril\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\">myth analyze src\u002FContract.sol --solc-json mythril.config.json\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Mythril использует символическое выполнение для обнаружения уязвимостей, которые пропускает статический анализ.\u003C\u002Fp>\n\u003Ch3>Aderyn\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\">aderyn . --src src\u002F\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Aderyn — новый инструмент от Cyfrin, специализирующийся на Foundry-проектах.\u003C\u002Fp>\n\u003Ch2 id=\"\">Безопасный деплой\u003C\u002Fh2>\n\u003Cp>Деплой смарт-контрактов должен быть контролируемым:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\"># Деплой с верификацией на Etherscan\nforge script script\u002FDeploy.s.sol:DeployScript \\\n  --rpc-url $RPC_URL \\\n  --broadcast \\\n  --verify \\\n  --etherscan-api-key $ETHERSCAN_KEY \\\n  --slow  # Ожидание подтверждения каждой транзакции\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Важные принципы:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Dry run перед деплоем\u003C\u002Fstrong>: \u003Ccode>--broadcast\u003C\u002Fcode> без \u003Ccode>--verify\u003C\u002Fcode> сначала\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Мультисиг для критичных операций\u003C\u002Fstrong>: используйте Safe (бывший Gnosis Safe)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Timelock\u003C\u002Fstrong>: задержка между предложением и исполнением\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Мониторинг после деплоя\u003C\u002Fstrong>: подписка на события через Tenderly\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"gitlab-ci\">Пример полного пайплайна GitLab CI\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-yaml\">stages:\n  - lint\n  - build\n  - test\n  - security\n  - deploy\n\nvariables:\n  FOUNDRY_PROFILE: ci\n\nlint:\n  stage: lint\n  script:\n    - forge fmt --check\n    - solhint 'src\u002F**\u002F*.sol'\n\nbuild:\n  stage: build\n  script:\n    - forge build --sizes\n  artifacts:\n    paths: [out\u002F]\n\ntest-unit:\n  stage: test\n  script:\n    - forge test --match-test \"test_\" -vvv\n    - forge coverage --report summary\n\ntest-fuzz:\n  stage: test\n  script:\n    - forge test --match-test \"testFuzz_|invariant_\" --fuzz-runs 50000\n  timeout: 30m\n\ngas-check:\n  stage: test\n  script:\n    - forge snapshot --check .gas-snapshot --tolerance 5\n  allow_failure: false\n\nsecurity:\n  stage: security\n  script:\n    - slither . --filter-paths \"test\u002F|script\u002F\"\n    - aderyn . --src src\u002F\n\ndeploy-testnet:\n  stage: deploy\n  script:\n    - forge script script\u002FDeploy.s.sol --rpc-url $SEPOLIA_RPC --broadcast --verify\n  when: manual\n  environment: staging\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">Заключение\u003C\u002Fh2>\n\u003Cp>CI\u002FCD для смарт-контрактов — это не роскошь, а необходимость. Автоматизированный пайплайн с многоуровневым тестированием, газ-регрессией и статическим анализом безопасности — единственный надёжный способ обеспечить качество неизменяемого кода. Инвестируйте в инфраструктуру CI\u002FCD сейчас — это окупится при первом же предотвращённом инциденте.\u003C\u002Fp>\n","ru","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:23.918020Z","CI\u002FCD для смарт-контрактов — тесты, газ-регрессия и безопасность","Полный CI\u002FCD-пайплайн для смарт-контрактов: тесты, фаззинг, газ-регрессия, Slither и безопасный деплой.","cicd смарт-контракты безопасность",null,"index, follow",[22,27,31,35],{"id":23,"name":24,"slug":25,"created_at":26},"c0000000-0000-0000-0000-000000000012","DevOps","devops","2026-03-28T10:44:21.513630Z",{"id":28,"name":29,"slug":30,"created_at":26},"c0000000-0000-0000-0000-000000000016","EVM","evm",{"id":32,"name":33,"slug":34,"created_at":26},"c0000000-0000-0000-0000-000000000021","Foundry","foundry",{"id":36,"name":37,"slug":38,"created_at":26},"c0000000-0000-0000-0000-000000000013","Security","security","Блокчейн",[41,48,54],{"id":42,"title":43,"slug":44,"excerpt":45,"locale":12,"category_name":46,"published_at":47},"d0200000-0000-0000-0000-000000000013","Почему Бали становится хабом импакт-технологий Юго-Восточной Азии в 2026 году","pochemu-bali-stanovitsya-khabom-impakt-tekhnologiy-2026","Бали занимает 16-е место среди стартап-экосистем Юго-Восточной Азии. Растущая концентрация Web3-разработчиков, ИИ-стартапов в области устойчивого развития и компаний в сфере эко-тревел-технологий формирует нишу столицы импакт-технологий региона.","Инженерия","2026-03-28T10:44:37.953039Z",{"id":49,"title":50,"slug":51,"excerpt":52,"locale":12,"category_name":46,"published_at":53},"d0200000-0000-0000-0000-000000000012","Защита данных в ASEAN: чек-лист разработчика для мультистранового комплаенса","zashchita-dannykh-asean-chek-list-razrabotchika-komplaens","Семь стран ASEAN имеют собственные законы о защите данных с разными моделями согласия, требованиями к локализации и штрафами. Практический чек-лист для разработчиков мультистрановых приложений.","2026-03-28T10:44:37.944001Z",{"id":55,"title":56,"slug":57,"excerpt":58,"locale":12,"category_name":46,"published_at":59},"d0200000-0000-0000-0000-000000000011","Цифровая трансформация Индонезии на $29 миллиардов: возможности для софтверных компаний","tsifrovaya-transformatsiya-indonezii-29-milliardov-vozmozhnosti-dlya-kompaniy","Рынок IT-услуг Индонезии вырастет с $24,37 млрд в 2025 году до $29,03 млрд в 2026 году. Облачная инфраструктура, искусственный интеллект, электронная коммерция и дата-центры обеспечивают самый быстрый рост в Юго-Восточной Азии.","2026-03-28T10:44:37.917095Z",{"id":13,"name":61,"slug":62,"bio":63,"photo_url":19,"linkedin":19,"role":64,"created_at":65,"updated_at":65},"Open Soft Team","open-soft-team","The engineering team at Open Soft, building premium software solutions from Bali, Indonesia.","Engineering Team","2026-03-28T08:31:22.226811Z"]