Разработка смарт-контрактов — это не просто код, а ответственность за миллионы долларов. По данным Rekt.news, только в 2024 году из-за уязвимостей в DeFi-протоколах потеряно более $1.8 млрд. Ошибка в 10 строк может стоить проекта. Но AI уже сегодня помогает писать безопаснее, быстрее и дешевле. В этой подборке — 12 промтов, которые я использую в ежедневной работе над Solidity-проектами: от генерации ERC-20 до поиска reentrancy и газ-оптимизации. Каждый промт — с примером и пояснением.
1. Генерация безопасного ERC-20 с защитой от overflow
Задача: быстро получить шаблон токена с проверенными библиотеками.
Промт:
Напиши смарт-контракт ERC-20 на Solidity 0.8.20 с использованием OpenZeppelin. Добавь: mint, burn, pause, cap. Объясни, почему SafeMath не нужен в 0.8+.
Пример использования:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract MyToken is ERC20, ERC20Burnable, Pausable, Ownable {
uint256 public immutable cap;
constructor(uint256 _cap) ERC20("MyToken", "MTK") {
cap = _cap;
}
function mint(address to, uint256 amount) public onlyOwner {
require(totalSupply() + amount <= cap, "Cap exceeded");
_mint(to, amount);
}
function pause() public onlyOwner { _pause(); }
function unpause() public onlyOwner { _unpause(); }
function _beforeTokenTransfer(address from, address to, uint256 amount) internal override whenNotPaused {
super._beforeTokenTransfer(from, to, amount);
}
}
В Solidity 0.8+ арифметика проверяется автоматически, поэтому SafeMath избыточен. Промт сразу даёт рабочий контракт с pause и cap.
2. Поиск reentrancy-уязвимостей
Задача: проверить контракт на классическую атаку повторного входа.
Промт:
Проанализируй контракт ниже на reentrancy. Если найдёшь — покажи эксплойт и исправь с помощью ReentrancyGuard.
Пример:
function withdraw() public {
uint256 balance = balances[msg.sender];
(bool success, ) = msg.sender.call{value: balance}("");
require(success, "Failed");
balances[msg.sender] = 0; // уязвимость: состояние обновляется после вызова
}
AI укажет, что нужно сначала обнулить баланс, затем вызвать call. Или добавить nonReentrant из OpenZeppelin.
3. Аудит на overflow/underflow (для старых версий)
Промт:
Проверь контракт на Solidity 0.7 на integer overflow. Покажи, где SafeMath отсутствует, и добавь его.
Пример: uint256 total = a + b; без SafeMath в 0.7 — уязвимо. AI предложит a.add(b).
4. Проверка контроля доступа
Задача: найти функции без onlyOwner или require.
Промт:
Найди все публичные функции, которые меняют состояние, но не имеют модификатора onlyOwner или ролевой модели. Предложи исправления.
Пример: функция setFee(uint) без ограничений — любой может изменить комиссию. AI добавит onlyOwner.
5. Газ-оптимизация
Промт:
Оптимизируй этот контракт по газу. Используй calldata вместо memory, unchecked для счётчиков, immutable и constant. Покажи разницу в газе до/после.
Пример: замена for (uint i = 0; i < arr.length; i++) на unchecked { ++i; } экономит ~30 газ за итерацию.
6. Написание тестов на Foundry
Промт:
Сгенерируй Foundry-тесты для контракта ERC-20: testMint, testBurn, testPause, testCap. Используй forge-std.
Пример:
function testMint() public {
token.mint(address(this), 100);
assertEq(token.balanceOf(address(this)), 100);
}
7. Тесты на Hardhat с проверкой revert
Промт:
Напиши Hardhat-тест, который проверяет, что mint сверх cap ревертит с сообщением "Cap exceeded".
Пример:
await expect(token.mint(addr, cap.add(1))).to.be.revertedWith("Cap exceeded");
8. Генерация ERC-721 с метаданными
Промт:
Создай ERC-721 контракт с baseURI, onlyOwner mint и сжиганием. Используй OpenZeppelin 5.0.
Пример:
contract MyNFT is ERC721, Ownable {
string private _baseURI;
constructor() ERC721("MyNFT", "MNFT") {}
function mint(address to, uint256 tokenId) public onlyOwner {
_safeMint(to, tokenId);
}
function _baseURI() internal view override returns (string memory) {
return _baseURI;
}
}
9. Деплой через скрипт Hardhat
Промт:
Напиши скрипт деплоя для Hardhat с проверкой на Etherscan. Учти, что контракт принимает аргумент cap.
Пример:
const Token = await ethers.getContractFactory("MyToken");
const token = await Token.deploy(1000000);
await token.deployed();
await hre.run("verify:verify", { address: token.address, constructorArguments: [1000000] });
10. Проверка на front-running
Промт:
Есть ли в контракте уязвимость к front-running? Если да, предложи commit-reveal схему.
Пример: аукцион без commit-reveal позволяет перебить ставку, увидев чужую транзакцию в мемпуле.
11. Аудит с помощью Slither и AI
Промт:
Объясни вывод Slither для этого контракта и предложи исправления для каждого предупреждения.
Пример: Slither выдаёт reentrancy-eth, AI объясняет и даёт патч.
12. Генерация документации NatSpec
Промт:
Добавь NatSpec-комментарии ко всем публичным функциям контракта.
Пример:
/// @notice Минтит токены указанному адресу
/// @param to Адрес получателя
/// @param amount Количество токенов
function mint(address to, uint256 amount) public onlyOwner { ... }
Сравнение инструментов аудита
| Инструмент | Тип | Промт-поддержка |
|---|---|---|
| Slither | Статический анализ | Да, через объяснение вывода |
| MythX | Динамический анализ | Да, через API |
| Foundry | Тестирование | Да, генерация тестов |
| Hardhat | Тестирование | Да, генерация тестов |
Выводы
AI не заменит полноценный аудит, но ускоряет разработку и снижает риск ошибок. Используйте промты для генерации, проверки и оптимизации. Всегда тестируйте на testnet и проводите независимый аудит перед mainnet. Безопасность — это процесс, а не чек-лист.
Comments