От идеи токена до тестнета: цепочка промтов, которая проведёт вас через Solidity, аудит и деплой

От идеи токена до тестнета: цепочка промтов, которая проведёт вас через Solidity, аудит и деплой

Смарт-контракт — это код, который держит чужие деньги. Одна опечатка в проверке require, забытый модификатор onlyOwner или неверный порядок обновления состояния — и контракт становится дырявым сейфом. По данным ежегодного отчёта CertiK Hack3d и дашборда Rekt.news, потери от взломов и эксплойтов в Web3 исчисляются миллиардами долларов ежегодно, причём значительная часть инцидентов связана не с экзотическими атаками, а с классическими ошибками: reentrancy, целочисленные переполнения, отсутствие проверок доступа.

Хорошая новость в том, что ИИ-модели (Claude, GPT, Gemini) давно и уверенно пишут Solidity. Плохая — в том, что они же уверенно пишут и уязвимый Solidity. Разница между «работает» и «безопасно» — в том, какие промты вы используете. Ниже — проверенная цепочка промтов, которая ведёт от идеи токена до задеплоенного в тестнете контракта: генерация, тесты, поиск уязвимостей, оптимизация газа и подготовка к аудиту. Каждый промт — готов к копипасту.

1. Промт для генерации каркаса ERC-20 с нуля

Задача: получить не «пример из туториала», а контракт с осмысленной структурой, событиями и NatSpec-комментариями.

Ты — senior Solidity-разработчик. Напиши контракт ERC-20 на Solidity ^0.8.24.
Требования:
- Название токена: MyToken (MTK), 18 decimals, initial supply 1_000_000 * 10**18
- Использовать OpenZeppelin Contracts v5 (import @openzeppelin/contracts/token/ERC20/ERC20.sol)
- Добавить mint с ограничением onlyOwner и событие Minted(address indexed to, uint256 amount)
- Добавить burn с событием Burned
- Все публичные функции с NatSpec (@notice, @param, @return)
- Никаких assembly, никаких selfdestruct
Выведи один файл MyToken.sol без лишних пояснений.

Пример использования: вы получаете готовый файл для contracts/MyToken.sol. Дальше — npx hardhat compile. Важно: OpenZeppelin v5 убрал Ownable-конструктор без аргумента — конструктор теперь Ownable(msg.sender). Если модель выдаст старый синтаксис, попросите: «Обнови под OpenZeppelin v5.0, конструктор Ownable(msg.sender)».

2. Промт для генерации Hardhat-конфига и структуры проекта

Задача: не собирать конфиг руками по кускам из Stack Overflow.

Сгенерируй hardhat.config.js для проекта с Solidity 0.8.24.
Требования:
- Сеть: hardhat + sepolia (testnet)
- Использовать @nomicfoundation/hardhat-toolbox
- Приватный ключ и RPC-URL через process.env (dotenv)
- Оптимизатор включён, runs: 200
- Плагин hardhat-gas-reporter
Также выведи список npm-зависимостей с точными версиями для package.json.

Пример: после npm i --save-dev @nomicfoundation/hardhat-toolbox dotenv hardhat-gas-reporter вы получаете рабочий конфиг. Для Sepolia нужен RPC от Alchemy или Infura — это бесплатные тарифы, официальная документация: docs.alchemy.com.

3. Промт для генерации тестов на Hardhat + Chai

Задача: покрыть контракт тестами до деплоя — не после.

Напиши тесты на Hardhat + Chai + ethers v6 для контракта MyToken.
Покрой кейсы:
1. Деплой: правильное имя, символ, decimals, initial supply
2. transfer: успешный перевод и событие Transfer
3. transfer: revert при недостатке баланса
4. mint: доступ только owner, revert для чужого адреса
5. burn: уменьшение totalSupply
6. Проверка реверта с кастомной ошибкой (expect(...).to.be.revertedWithCustomError)
Выведи один файл test/MyToken.test.js.

Пример: запуск npx hardhat test даёт зелёный прогон. Ключевой момент — revertedWithCustomError вместо устаревшего revertedWith для OZ v5, где ошибки кастомные (OwnableUnauthorizedAccount).

4. Промт для поиска уязвимостей (роль аудитора)

Задача: заставить модель переключиться из режима «писатель» в режим «атакующий».

Ты — аудитор смарт-контрактов уровня Code4rena. Проанализируй контракт ниже
на уязвимости. Проверь строго по чек-листу:
- Reentrancy (checks-effects-interactions, reentrancy guard)
- Access control (missing onlyOwner, tx.origin)
- Integer issues (overflow, division before multiplication)
- Front-running / MEV
- Oracle manipulation
- Unchecked external calls (low-level call без проверки возврата)
- DoS через unbounded loop
Для каждой находки: severity (Critical/High/Medium/Low), строка, объяснение,
исправленный фрагмент. Если уязвимостей нет — скажи прямо.
[ВСТАВЬТЕ КОД КОНТРАКТА]

Пример: на простом ERC-20 находок будет мало, но на контракте со стейкингом и external call вы почти гарантированно получите находку про reentrancy. Классический референс — SWC Registry и документация ConsenSys Smart Contract Best Practices.

5. Промт для генерации теста на reentrancy (attack simulation)

Задача: не просто найти уязвимость, а доказать её эксплойтом.

Напиши контракт-атакующий Attacker.sol, который эксплуатирует reentrancy
в функции withdraw() целевого контракта через fallback/receive.
Используй паттерн: атакующий контракт вызывает withdraw, в receive() снова
вызывает withdraw, пока баланс не опустеет.
Выведи также тест на Hardhat, который показывает, что до фикса баланс
жертвы обнуляется, а после добавления nonReentrant — атака ревертится.

Пример: этот промт превращает абстрактное «есть reentrancy» в воспроизводимый PoC. Так работают реальные аудиторы: не верят отчёту, пока не увидят падающий тест.

6. Промт для оптимизации газа

Задача: снизить стоимость транзакций без потери читаемости.

Проанализируй контракт и предложи оптимизации газа. Для каждой:
- что меняем, почему это экономит gas, примерная экономия (в gas units)
- не ломает ли это безопасность или читаемость
Учитывай: packing storage slots, immutable/constant, calldata вместо memory
для external функций, кэширование storage в memory в циклах, custom errors
вместо строк revert.
[ВСТАВЬТЕ КОД]

Пример: типичный выигрыш — замена require(cond, "string") на custom error и unchecked { ++i } в цикле. Верифицировать экономию можно через hardhat-gas-reporter и evm.codes — там указана стоимость каждой опкод-инструкции.

7. Промт для генерации скрипта деплоя в тестнет

Задача: задеплоить без ручных танцев с ethers.

Напиши Hardhat-скрипт scripts/deploy.js для деплоя MyToken в Sepolia.
Требования:
- ethers v6, получить signer через ethers.getSigners()
- Дождаться подтверждения: await contract.waitForDeployment()
- Вывести адрес контракта и хэш транзакции
- Добавить проверку: если process.env.ETHERSCAN_API_KEY задан — верифицировать
  контракт через hardhat-verify

Пример: npx hardhat run scripts/deploy.js --network sepolia. Получить тестовые ETH для Sepolia можно через sepoliafaucet.com или Alchemy Sepolia Faucet. Верификация на Etherscan — npx hardhat verify --network sepolia <ADDRESS>.

8. Промт для генерации README и документации для аудитора

Задача: аудитор должен понять контракт за 10 минут, а не за час.

Составь README.md для смарт-контракта MyToken по шаблону:
- Назначение контракта (2-3 предложения)
- Архитектура: роли, ключевые функции, доверенные стороны
- Инварианты (что всегда должно быть истинно)
- Известные ограничения и assumptions
- Как запустить тесты и задеплоить
Пиши так, чтобы это читал аудитор, а не маркетолог.

Пример: инвариант вида «totalSupply == sum(balances)» — именно то, что аудитор проверит в первую очередь. Такой README экономит деньги: час работы аудитора стоит дорого.

9. Промт для проверки контракта на соответствие стандарту

Задача: убедиться, что контракт реально соответствует ERC-20, а не «похож».

Сверь контракт со спецификацией ERC-20 (EIP-20, официальный источник:
https://eips.ethereum.org/EIPS/eip-20). Проверь:
- все обязательные функции и события присутствуют с точными сигнатурами
- возвращаемые значения соответствуют спецификации
- поведение transfer/transferFrom/approve не противоречит EIP-20
- есть ли расхождения с OpenZeppelin v5
Выведи таблицу: элемент EIP-20

| статус | комментарий.
[ВСТАВЬТЕ КОД]

Пример: таблица сразу покажет, что, например, increaseAllowance/decreaseAllowance — не часть EIP-20, а расширение OZ. Это важно для интеграций с DeFi-протоколами.

10. Промт для симуляции аудита перед реальным аудитом

Задача: пройти «тренировочный» аудит и исправить то, что нашли бы за деньги.

Проведи имитацию аудита контракта по методологии Code4rena:
1. Scope: перечисли файлы и функции в скоупе
2. Findings: таблица (ID, severity, title, описание, PoC-идея, рекомендация)
3. QA-раздел: мелкие замечания (стиль, gas, документация)
4. Итоговая оценка риска: Low / Medium / High
Будь строгим. Лучше ложноположительная находка, чем пропущенная дыра.
[ВСТАВЬТЕ КОД]

Пример: такой прогон перед платным аудитом (например, через Code4rena, Sherlock или Spearbit) снижает количество High-находок — а значит, стоимость исправлений и время до релиза. Публичные отчёты Code4rena и Sherlock открыты и служат отличным датасетом для обучения: code4rena.com/reports.

11. Таблица: какие промты для какой стадии

Стадия Промт Что получаете
Генерация №1, №2 Каркас контракта и проекта
Тесты №3, №5 Покрытие + PoC атаки
Безопасность №4, №10 Список находок по severity
Оптимизация №6 Экономия газа
Деплой №7 Контракт в Sepolia + верификация
Документация №8, №9 README и соответствие EIP-20

12. Практические правила, которые дороже любого промта

  • Никогда не деплойте в mainnet контракт, который не прошёл хотя бы внутренний аудит и тесты на 100% ветвей. Тестнет — Sepolia, Holesky — для этого и существует.
  • ИИ-аудит не заменяет человеческий. Модель ловит типовые паттерны, но пропускает логические ошибки в бизнес-логике и экономические эксплойты (например, манипуляция оракулом в связке с flash loan).
  • Версионируйте промты и результаты. Храните сгенерированный код, отчёты и правки в Git — это ваша история решений при разборе инцидента.
  • Проверяйте версии. OpenZeppelin v5, ethers v6, Solidity 0.8.x — синтаксис между мажорными версиями ломается. Всегда просите модель уточнять версии в промте.
  • Ссылайтесь на первоисточники: EIP-20, EIP-721, Solidity Docs, OpenZeppelin Docs.

Цепочка из этих промтов — это не «ИИ напишет за вас контракт», а «ИИ ускорит каждый этап, а вы останетесь тем, кто принимает решения». Начните с промта №1, доведите токен до Sepolia, прогоните имитацию аудита — и вы получите навык, который в Web3 стоит дороже любого диплома. Пробуйте, тестируйте, читайте отчёты реальных аудитов — и не деплойте в mainnet, пока не уверены в каждой строке.

← Все статьи

Комментарии