
Полный прикладной трек: Rust, CLI и Anchor, PDA/CPI и escrow, SPL и Token-2022, TypeScript-клиент, Pyth, Jito/MEV, security lab и итоговый проект на devnet.
Кто есть кто в приложении на Solana: клиент, кошелёк, RPC, программа и индексатор — и где границы доверия.
Аккаунт как запись: lamports, data, владелец; сколько стоит хранение и как вернуть депозит.
Зачем появились v0-транзакции, что такое address lookup tables и когда это нужно вашему dApp.
Лимит вычислений и ставка за место в блоке: две независимые ручки транзакции, цена ошибки каждой и порядок настройки через симуляцию.
Пара ключей живёт в JSON-файле и это приватный секрет; CLI закрывает быт: адрес, баланс, учебный кран, переключение сетей.
Своя песочница с мгновенным бесплатным деплоем и общая учебная сеть с краном: что где прогонять и в каком ритме.
Каркас проекта одной командой и три команды жизненного цикла: сборка с keypair и IDL, тесты на локальной сети, деплой.
Первая Anchor-программа без состояния: declare_id, #[program], контекст аккаунтов и лог msg! как единственный наблюдаемый эффект.
Балансы и счётчики — u64 без f64, переполнение валит транзакцию, а отказ оформляется enum с кодами от 6000.
Владение переезжает вместе со значением, ссылки читают и меняют по правилам компилятора, а Anchor прячет lifetimes за контекстом аккаунтов.
Соберите authority, Signer и custom error в одно правило: require! в начале инструкции, enum ошибок и негативный тест, который это правило охраняет.
IDL — машиночитаемый интерфейс программы: anchor build генерирует его в target/idl, по нему живут TS-клиент и документация, а контракт и клиент обязаны говорить на одном языке.
Constraints — декларативные проверки аккаунтов до входа в handler: signer, init, seeds, has_one, close и произвольные предикаты с кастомными ошибками.
Адрес PDA выводится из seeds и program id, приватного ключа у него нет; канонический bump сохраняют в аккаунте и проверяют на каждом входе.
CPI — вызов одной программы из другой; подпись от имени PDA программа доказывает через invoke_signed теми же seeds и bump.
Собираете vault под PDA: bump в state, constraints на входе, перевод токенов через CPI — и негативные тесты на каждый инвариант.
Три канала обратной связи: именованные custom-ошибки с номерами в IDL, события для клиентских подписок и close, который возвращает лампорты и зануляет данные.
Обмен токенами без доверия: PDA-vault держит активы мейкера, три инструкции — внесение, отмена и обмен — и проверки, которые не обойти мимо программы.
Как программа переводит чужие токены: CpiContext, где роль подписи играет PDA, ATA, вычисляемый из пары (владелец, mint), и три опорных вызова token program.
transfer-fee, interest-bearing, non-transferable и заморозка по умолчанию: расширения при создании mint меняют поведение переводов, и это проверяют до интеграции.
Чек-лист практики: mint с decimals = 9, собственный ATA, небольшая эмиссия через mint_to и тест, который доказывает authority изменением баланса.
Клиент Anchor: provider и program, репетиция через simulate, а после отправки — confirmed, finalized и чтение по сигнатуре.
Цена из фида Pyth — подписанный снимок: статус Trading, свежесть publish_time и conf проверяет контракт, а не фронтенд.
Восемь ловушек — от UncheckedAccount до переполнения: что ломается, как атакуют и чем закрывается каждая дыра.
От падающего теста до regression-теста: owner-check, канонический bump, отказ от init_if_needed и whitelist для CPI.
Лидер блока сам упорядочивает транзакции: sandwich на обменах реален, bundle у Jito атомарен, а slippage, priority fee и молчаливое memo — рабочие ручки разработчика.
Ключи не покидают кошелёк: Wallet Standard подключает его к React, Metaplex Core упрощает NFT; учимся видеть границы доверия в клиенте.
Один проект вместо суммы уроков: Anchor-CRUD или PDA-vault с CPI, зелёные тесты, деплой в devnet и README, по которому всё воспроизводится.
Войдите и запишитесь, чтобы открывать уроки и сохранять прогресс.