Введение
Разработка на блокчейне — это не про «написать код и забыть». Каждый смарт-контракт — это финансовый инструмент, ошибка в котором может стоить миллионы. Я сам писал на Solidity, Rust (для Near и Solana) и Vyper, и знаю, как сложно бывает найти баг или оптимизировать газ. Чтобы ускорить работу, я использую AI-промты — не для замены себя, а для рутины. В этой подборке — 15 проверенных промтов, которые я применяю в реальных проектах. Они помогут с аудитом, генерацией кода, рефакторингом и тестами.
1. Генерация базового контракта ERC-20 на Solidity
Промт: «Сгенерируй смарт-контракт ERC-20 на Solidity 0.8.x с функциями mint, burn, transferFrom. Добавь проверки на переполнение и события. Используй OpenZeppelin v4.9.»
Пример кода:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract MyToken is ERC20 {
constructor() ERC20("MyToken", "MTK") {}
function mint(address to, uint256 amount) external {
_mint(to, amount);
}
function burn(uint256 amount) external {
_burn(msg.sender, amount);
}
}
Пояснение: Этот промт экономит время на написание шаблонного кода. Важно указать версию Solidity и библиотеку — тогда AI не использует устаревшие конструкции.
2. Аудит на уязвимости reentrancy
Промт: «Проверь этот код на reentrancy-атаку. Найди места, где внешние вызовы (call, transfer) происходят до изменения состояния. Предложи исправления с использованием паттерна Checks-Effects-Interactions.»
Пример кода (уязвимый участок):
function withdraw(uint256 amount) external {
require(balances[msg.sender] >= amount);
(bool success, ) = msg.sender.call{value: amount}("");
require(success);
balances[msg.sender] -= amount;
}
Исправление:
function withdraw(uint256 amount) external {
require(balances[msg.sender] >= amount);
balances[msg.sender] -= amount;
(bool success, ) = msg.sender.call{value: amount}("");
require(success);
}
Пояснение: Reentrancy — одна из самых частых уязвимостей (взлом DAO 2016 года на $60 млн). Промт заставляет AI искать именно эту проблему.
3. Оптимизация газа для Solidity
Промт: «Оптимизируй этот контракт для уменьшения газа. Используй uint256 вместо uint8, упаковку структур в storage, избегай лишних SLOAD. Покажи разницу в газе.»
Пример до:
struct User {
uint8 age;
uint16 score;
}
После:
struct User {
uint128 age;
uint128 score;
}
Пояснение: AI может предложить упаковку переменных в 256-битные слоты. Это снижает газ на 20-30%.
4. Написание тестов на Hardhat
Промт: «Напиши тесты для ERC-20 контракта на Hardhat с использованием chai и ethers. Проверь mint, burn, transferFrom, включая негативные сценарии (недостаток баланса, нулевой адрес).»
Пример:
const { expect } = require("chai");
describe("MyToken", function () {
it("should mint tokens", async function () {
const [owner] = await ethers.getSigners();
const Token = await ethers.getContractFactory("MyToken");
const token = await Token.deploy();
await token.mint(owner.address, 1000);
expect(await token.balanceOf(owner.address)).to.equal(1000);
});
});
Пояснение: AI генерирует тесты с покрытием edge-кейсов. Я использую это для ускорения CI/CD.
5. Генерация NFT-контракта (ERC-721) с метаданными
Промт: «Создай ERC-721 контракт с функцией mint для ограниченной серии (maxSupply = 10000). Добавь baseURI для метаданных и reveal. Используй OpenZeppelin.»
Пример:
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
uint256 public maxSupply = 10000;
uint256 public totalSupply;
function mint() external {
require(totalSupply < maxSupply);
_safeMint(msg.sender, totalSupply);
totalSupply++;
}
Пояснение: Промт полезен для старта NFT-проекта. AI добавляет проверки на лимиты и URI.
6. Конвертация Solidity в Vyper
Промт: «Конвертируй этот Solidity-контракт (ERC-20) в Vyper 0.3.x. Сохрани всю логику, включая события. Учти синтаксические отличия Vyper.»
Пример Vyper:
# @version 0.3.7
from vyper.interfaces import ERC20
implements: ERC20
name: public(String[64])
symbol: public(String[32])
@external
def __init__(_name: String[64], _symbol: String[32]):
self.name = _name
self.symbol = _symbol
Пояснение: Vyper проще для аудита, но менее гибок. Промт помогает перенести логику без потери функциональности.
7. Написание контракта на Rust (Near Protocol)
Промт: «Напиши смарт-контракт на Rust для Near Protocol с функцией create_poll и vote. Используй near-sdk 4.1. Храни голоса в LookupMap.»
Пример:
use near_sdk::borsh::{self, BorshSerialize, BorshDeserialize};
use near_sdk::collections::LookupMap;
#[near_bindgen]
#[derive(BorshSerialize, BorshDeserialize)]
pub struct Contract {
polls: LookMap<u64, Poll>,
}
Пояснение: Rust — основной язык для Near и Solana. Промт генерирует структуру контракта с хранилищем.
8. Генерация ABI и интерфейса для веб-приложения
Промт: «На основе этого Solidity-контракта сгенерируй ABI и TypeScript-интерфейс для взаимодействия с ethers.js. Включи все функции и события.»
Пример вывода:
interface MyToken {
balanceOf(account: string): Promise<BigNumber>;
transfer(to: string, amount: BigNumber): Promise<TransactionResponse>;
}
Пояснение: Экономит часы на ручной типизации.
9. Поиск race condition в мультичейн-контрактах
Промт: «Найди race condition в этом bridge-контракте между Ethereum и BSC. Учти, что функция finalizeTransfer может быть вызвана дважды.»
Пояснение: Bridge-атаки (как Wormhole на $326 млн) часто из-за гонок. AI находит такие места.
10. Генерация upgradeable контракта (UUPS)
Промт: «Создай upgradeable ERC-20 контракт по паттерну UUPS. Используй OpenZeppelin Upgrades. Добавь функцию initialize вместо constructor.»
Пример:
import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";
contract MyTokenUpgradeable is ERC20Upgradeable {
function initialize() initializer public {
__ERC20_init("MyToken", "MTK");
}
}
Пояснение: Upgradeable контракты — стандарт для DeFi. Промт добавляет правильный паттерн.
11. Логирование событий для аналитики
Промт: «Добавь события в этот контракт для отслеживания всех операций mint, burn, swap. Используй indexed параметры для фильтрации.»
Пример:
event Mint(address indexed user, uint256 amount, uint256 timestamp);
event Burn(address indexed user, uint256 amount, uint256 timestamp);
Пояснение: События критичны для The Graph и Dune Analytics. AI подсказывает, что индексировать.
12. Генерация контракта стейкинга с вознаграждениями
Промт: «Напиши контракт стейкинга ERC-20 с вознаграждением в том же токене. Используй механизм распределения на основе времени блоков.»
Пример:
function claimRewards() external {
uint256 reward = calculateReward(msg.sender);
_mint(msg.sender, reward);
}
Пояснение: Стандартный паттерн для DeFi. AI генерирует расчет rewardPerBlock.
13. Рефакторинг контракта под многопользовательское управление (DAO)
Промт: «Рефактори этот контракт, чтобы добавить multi-sig управление через Gnosis Safe. Сделай функции только для owner вызываемыми через DAO.»
Пояснение: AI переписывает модификаторы и добавляет проверки на голосование.
14. Генерация контракта для аукциона (English Auction)
Промт: «Создай контракт English Auction для NFT. Включи функции bid, withdraw, finalize. Добавь минимальный шаг ставки.»
Пример:
function bid() external payable {
require(msg.value > highestBid + minBidStep);
// возврат предыдущей ставки
}
Пояснение: Полезно для NFT-маркетплейсов. AI добавляет защиту от front-running.
15. Создание контракта для пула ликвидности (AMM)
Промт: «Напиши простой AMM контракт (как Uniswap V2) для двух токенов. Функции addLiquidity, removeLiquidity, swap. Используй формулу x*y=k.»
Пример:
function swap(uint256 amountIn, address tokenIn) external returns (uint256 amountOut) {
// расчет по резервам
}
Пояснение: Базовый паттерн DeFi. AI генерирует логику торговли и комиссий.
Заключение
Эти 15 промтов — мой личный набор, который я использую каждый день. Они не заменяют понимание блокчейна, но ускоряют рутину в 2-3 раза. Помните: всегда проверяйте код, сгенерированный AI, особенно в финансовых контрактах. Начните с малого — попробуйте промт для ERC-20, а потом переходите к сложным DeFi-логикам. Если хотите углубиться, читайте документацию OpenZeppelin и Near SDK. Удачи в Web3!
Комментарии