От идеи токена до тестнета: цепочка промтов, которая проведёт вас через 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, пока не уверены в каждой строке.
Комментарии