Введение
Мир Web3 стремительно меняется. Если в 2021 году для написания смарт-контракта нужно было штудировать документацию Solidity часами, то к 2026 году любой разработчик может использовать нейросети для генерации, аудита и оптимизации кода. Но промпты — это не магия. Это инженерный инструмент, который требует понимания блокчейн-архитектуры, газовых моделей и безопасности. В этой статье я собрал 10 промптов для трёх языков смарт-контрактов — Solidity (Ethereum, Polygon), Rust (Solana, Near) и Vyper (Ethereum). Каждый промпт — это готовый запрос с примером результата, который вы можете адаптировать под свою задачу.
Почему промпты для блокчейна — это сложно
Смарт-контракты работают в детерминированной среде. Ошибка в коде может стоить миллионы долларов (вспомните взлом The DAO в 2016 году или уязвимость в Poly Network в 2021-м). Поэтому промпт должен быть точным: указывать версию компилятора, спецификацию токена (ERC-20, ERC-721, SPL) и требования к безопасности. Без этого нейросеть может сгенерировать код с reentrancy-уязвимостью или неправильной обработкой газа.
10 промптов для смарт-контрактов
1. Базовый контракт ERC-20 на Solidity
Задача: Сгенерировать минимальный контракт токена ERC-20 с функциями mint и burn для владельца.
Промт:
Напиши смарт-контракт на Solidity версии 0.8.20 для токена ERC-20 с именем "MyToken" и символом "MTK". Используй библиотеку OpenZeppelin v5.0.0. Добавь функции mint и burn, доступные только владельцу контракта. Используй Ownable для управления правами. Включи события Transfer и Approval.
Пример результата:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract MyToken is ERC20, Ownable {
constructor() ERC20("MyToken", "MTK") {
_mint(msg.sender, 1000000 * 10**decimals());
}
function mint(address to, uint256 amount) public onlyOwner {
_mint(to, amount);
}
function burn(uint256 amount) public {
_burn(msg.sender, amount);
}
}
2. Контракт NFT (ERC-721) с метаданными на Solidity
Задача: Создать контракт для NFT с возможностью установки base URI для метаданных.
Промт:
Напиши контракт ERC-721 на Solidity 0.8.20 с использованием OpenZeppelin v5.0.0. Добавь функцию mint для владельца и возможность установить baseURI. Используй ERC721URIStorage для хранения URI каждого токена. Включи счетчик токенов с помощью Counters.
Пример результата:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
contract MyNFT is ERC721, ERC721URIStorage, Ownable {
using Counters for Counters.Counter;
Counters.Counter private _tokenIdCounter;
constructor() ERC721("MyNFT", "MNFT") {}
function safeMint(address to, string memory uri) public onlyOwner {
uint256 tokenId = _tokenIdCounter.current();
_tokenIdCounter.increment();
_safeMint(to, tokenId);
_setTokenURI(tokenId, uri);
}
function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
super._burn(tokenId);
}
function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) {
return super.tokenURI(tokenId);
}
}
3. Аудит безопасности контракта на Solidity
Задача: Проверить контракт на reentrancy-уязвимости и gas-оптимизацию.
Промт:
Проведи аудит безопасности следующего контракта на Solidity. Найди reentrancy-уязвимости, проблемы с переполнением целых чисел и предложи gas-оптимизации. Контракт: [вставьте код]. Используй чеклист из OWASP Smart Contract Top 10.
Пример результата:
Найдено 2 проблемы:
1. Reentrancy в функции withdraw: вызов external до обновления баланса. Исправление: используй паттерн Checks-Effects-Interactions.
2. Переполнение в unchecked блоке для переменной totalSupply. Исправление: используй SafeMath или Solidity 0.8+ с встроенной проверкой.
4. Контракт стейкинга на Rust (Solana)
Задача: Написать программу для стейкинга токенов SPL на Solana с начислением вознаграждения.
Промт:
Напиши программу на Rust для Solana с использованием Anchor v0.30.0. Реализуй стейкинг SPL-токенов: пользователь может застейкать токены, а через 7 дней снять их с наградой 10% APY. Используй инструкции: stake, unstake, claim_reward. Добавь проверки на время и баланс.
Пример результата (фрагмент):
use anchor_lang::prelude::*;
use anchor_spl::token::{self, Token, TokenAccount, Transfer};
#[program]
pub mod staking {
use super::*;
pub fn stake(ctx: Context<Stake>, amount: u64) -> Result<()> {
// Переводим токены от пользователя на контракт
let transfer_ix = Transfer {
from: ctx.accounts.user_token.to_account_info(),
to: ctx.accounts.vault.to_account_info(),
authority: ctx.accounts.user.to_account_info(),
};
token::transfer(ctx.accounts.transfer_ctx(), amount)?;
// Обновляем состояние стейкинга
ctx.accounts.stake_account.amount += amount;
ctx.accounts.stake_account.stake_time = Clock::get()?.unix_timestamp;
Ok(())
}
}
5. Контракт мультисиг-кошелька на Vyper
Задача: Создать мультисиг-кошелек с 3 подписантами, где нужно 2 подписи для транзакции.
Промт:
Напиши смарт-контракт на Vyper 0.4.0 для мультисиг-кошелька с 3 владельцами и порогом 2 подписи. Реализуй функции: submit_transaction, confirm_transaction, execute_transaction. Добавь проверку на повторное подтверждение и защиту от переполнения.
Пример результата:
# @version 0.4.0
owners: public(address[3])
required: public(uint256)
transactions: HashMap[uint256, Transaction]
transaction_count: public(uint256)
confirmations: HashMap[uint256, HashMap[address, bool]]
@external
def __init__(_owners: address[3], _required: uint256):
self.owners = _owners
self.required = _required
@external
def submit_transaction(to: address, value: uint256, data: Bytes[1024]) -> uint256:
# ... логика создания транзакции
6. Оптимизация газа для Solidity
Задача: Уменьшить газовые затраты контракта на 30%.
Промт:
Оптимизируй следующий контракт Solidity для уменьшения газа. Используй: упаковку переменных в struct, unchecked блоки для безопасных операций, замена require на revert с кастомной ошибкой. Исходный код: [вставьте код].
Пример результата:
Было:
- address public owner;
- uint256 public totalSupply;
Стало:
- struct Storage { address owner; uint256 totalSupply; }
- Использовать Storage storage s = _storage;
Экономия: ~15% газа.
7. Интеграция с Chainlink Oracles на Solidity
Задача: Получить цену ETH/USD через Chainlink.
Промт:
Напиши контракт на Solidity, который получает актуальную цену ETH/USD с помощью Chainlink AggregatorV3Interface. Используй сеть Sepolia. Добавь функцию getLatestPrice, которая возвращает цену с 8 десятичными знаками.
Пример результата:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
contract PriceConsumerV3 {
AggregatorV3Interface internal priceFeed;
constructor() {
priceFeed = AggregatorV3Interface(0x694AA1769357215DE4FAC081bf1f309aDC325306);
}
function getLatestPrice() public view returns (int) {
(, int price, , , ) = priceFeed.latestRoundData();
return price;
}
}
8. Контракт DeFi для обмена токенов (Uniswap V3-like)
Задача: Написать простую AMM-биржу на Solidity.
Промт:
Создай контракт на Solidity для децентрализованного обмена двух токенов ERC-20 по формуле x*y=k. Реализуй функции: addLiquidity, removeLiquidity, swap. Используй библиотеку Math для вычислений. Добавь защиту от фронтраннинга через минимальный вывод.
Пример результата:
function swap(address tokenIn, uint amountIn, address tokenOut, uint minAmountOut) external returns (uint) {
// Проверка резервов
(uint reserveIn, uint reserveOut) = getReserves(tokenIn, tokenOut);
uint amountOut = (amountIn * reserveOut) / (reserveIn + amountIn);
require(amountOut >= minAmountOut, "Slippage too high");
// Перевод токенов
IERC20(tokenIn).transferFrom(msg.sender, address(this), amountIn);
IERC20(tokenOut).transfer(msg.sender, amountOut);
// Обновление резервов
}
9. Генерация тестов для контракта (Foundry)
Задача: Создать тесты для контракта ERC-20.
Промт:
Напиши тесты на Solidity для контракта MyToken с использованием Foundry (forge). Проверь функции mint, burn и transfer. Используй fuzzing для тестирования переполнения. Добавь проверку событий.
Пример результата:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "forge-std/Test.sol";
import "../src/MyToken.sol";
contract MyTokenTest is Test {
MyToken public token;
address public owner = address(0x123);
function setUp() public {
token = new MyToken();
vm.prank(owner);
token.mint(owner, 1000);
}
function testMint() public {
assertEq(token.balanceOf(owner), 1000);
}
function testBurn() public {
vm.prank(owner);
token.burn(100);
assertEq(token.balanceOf(owner), 900);
}
function testTransferFuzz(uint256 amount) public {
vm.assume(amount <= token.balanceOf(owner));
vm.prank(owner);
token.transfer(address(0x456), amount);
assertEq(token.balanceOf(address(0x456)), amount);
}
}
10. Контракт для управления DAO на Rust (Solana)
Задача: Создать программу для голосования в DAO.
Промт:
Напиши программу на Rust с Anchor для DAO на Solana. Реализуй: создание предложения, голосование за/против, выполнение предложения при достижении кворума. Используй SPL-токены для взвешенного голосования.
Пример результата (фрагмент):
#[derive(Accounts)]
pub struct CreateProposal<'info> {
#[account(init, payer = proposer, space = 8 + 32 + 8 + 8 + 1)]
pub proposal: Account<'info, Proposal>,
#[account(mut)]
pub proposer: Signer<'info>,
pub system_program: Program<'info, System>,
}
pub fn create_proposal(ctx: Context<CreateProposal>, description: String, vote_start: i64, vote_end: i64) -> Result<()> {
ctx.accounts.proposal.proposer = *ctx.accounts.proposer.key;
ctx.accounts.proposal.description = description;
ctx.accounts.proposal.vote_start = vote_start;
ctx.accounts.proposal.vote_end = vote_end;
ctx.accounts.proposal.executed = false;
Ok(())
}
Заключение
Промпты для смарт-контрактов — это мощный инструмент, но они не заменяют понимание блокчейн-архитектуры. Всегда проверяйте сгенерированный код на тестовой сети (Sepolia, Devnet), используйте формальные верификаторы (например, Certora) и следите за обновлениями компиляторов. В 2026 году нейросети стали отличными помощниками для рутинных задач — генерации токенов, тестов и документации. Но безопасность и оптимизация газа по-прежнему требуют человеческого глаза. ASI Biont поддерживает интеграцию с популярными Web3-инструментами через API — подробнее на asibiont.com/courses. Экспериментируйте с промптами, но не забывайте: код — это закон.
Комментарии