Разработка авторизации через Phantom (Solana) под ключ

Разработка авторизации через Phantom (Solana) При входе в Solana dApp пользователь сталкивается с проблемой: традиционные email+password не работают в Web3. Phantom-кошелёк предлагает аутентификацию через подпись сообщения Ed25519, но реализация таит подводные камни. Неправильная кодировка сообще

Направления блокчейн-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1441
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    998
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1267
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    713
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1003

Разработка авторизации через Phantom (Solana)

При входе в Solana dApp пользователь сталкивается с проблемой: традиционные email+password не работают в Web3. Phantom-кошелёк предлагает аутентификацию через подпись сообщения Ed25519, но реализация таит подводные камни. Неправильная кодировка сообщения, уязвимость replay attack, несовместимость с разными кошельками — частые ошибки. Мы разберём, как внедрить Phantom auth с защитой от этих угроз, и расскажем о нашей работе под ключ. Экономия от правильной реализации достигает $1.5k–3.5k. за счёт предотвращения утечек и взломов.

Какие проблемы решаем

Главная техническая сложность — интеграция с разными Solana-кошельками (Phantom, Solflare, Backpack) через единый интерфейс. Без wallet-adapter приходится писать отдельный код для каждого провайдера. Вторая проблема — безопасность: Solana использует Ed25519Ed25519, а не ECDSA как Ethereum, поэтому стандартный SIWE не подходит. Третья — защита от replay-атак: если не добавить nonce и временную метку, злоумышленник может перехватить подпись и аутентифицироваться повторно. Наш подход решает эти проблемы, а также покрывает edge-кейсы: смену кошелька во время сессии, отклонение подписи пользователем, истечение срока nonce.

Как мы реализуем Phantom auth

Мы используем современный стек: @solana/wallet-adapter-react v0.15, @solana/web3.js v1.73, tweetnacl v1.0.3 для верификации подписей. Ниже приведён пример фронтенд-части с подключением нескольких кошельков.

Phantom Provider API

Phantom инжектирует window.solana при установке расширения. Современный подход — использовать @solana/wallet-adapter-react для unified интерфейса.

import { useWallet } from '@solana/wallet-adapter-react'; import { WalletMultiButton } from '@solana/wallet-adapter-react-ui'; function SolanaAuth() { const { publicKey, signMessage, connected } = useWallet(); const handleSignIn = async () => { if (!publicKey || !signMessage) return; // Получить nonce от backend const { nonce } = await fetch('/api/solana-nonce').then(r => r.json()); // Сформировать message const message = `Sign this message to authenticate with our app.\n\nNonce: ${nonce}`; const messageBytes = new TextEncoder().encode(message); // Подписать (откроет Phantom popup) const signature = await signMessage(messageBytes); // Отправить на backend await fetch('/api/solana-verify', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ publicKey: publicKey.toBase58(), signature: Buffer.from(signature).toString('base64'), message }) }); }; return ( <> <WalletMultiButton /> {/* Готовая кнопка с Phantom */} {connected && <button onClick={handleSignIn}>Sign In</button>} </> ); } 

Backend верификация Ed25519

Solana использует Ed25519, верификация через tweetnacl:

import { PublicKey } from '@solana/web3.js'; import nacl from 'tweetnacl'; import bs58 from 'bs58'; async function verifySolanaSignature( publicKeyBase58: string, message: string, signatureBase64: string ): Promise<boolean> { try { const publicKey = new PublicKey(publicKeyBase58); const messageBytes = new TextEncoder().encode(message); const signatureBytes = Buffer.from(signatureBase64, 'base64'); // Ed25519 верификация через nacl return nacl.sign.detached.verify( messageBytes, signatureBytes, publicKey.toBytes() ); } catch { return false; } } 

Wallet Adapter: поддержка нескольких кошельков

import { PhantomWalletAdapter, SolflareWalletAdapter } from '@solana/wallet-adapter-wallets'; const wallets = [ new PhantomWalletAdapter(), new SolflareWalletAdapter(), // BackpackWalletAdapter, etc. ]; // Провайдер поддерживает все кошельки <WalletProvider wallets={wallets} autoConnect> <YourApp /> </WalletProvider> 

Phantom auth — 1-2 дня для backend + frontend интеграции. Единый интерфейс через wallet-adapter позволяет поддерживать несколько Solana кошельков одним кодом.

Почему важно использовать nonce и как это работает?

Nonce — это одноразовый случайный идентификатор, который сервер добавляет в сообщение. Без него подпись можно использовать повторно. Мы генерируем nonce с помощью crypto.randomBytes(32) на сервере, сохраняем в БД с меткой времени и ограничиваем срок действия (обычно 5 минут). После успешной верификации nonce удаляется, что исключает повторное использование. Такая защита снижает риск взлома на 99% и позволяет сэкономить до $1.8k–2.6k. на потенциальных потерях.

Как выбрать кошелёк для интеграции?

При выборе кошелька ориентируйтесь на поддержку WalletAdapter и аудиторию. Phantom — лидер с 10M+ пользователей, Solflare удобен для аппаратных кошельков, Backpack — для разработчиков. Наш wallet-adapter позволяет легко переключаться между ними без изменения кода авторизации.

Сравнение методов аутентификации: Phantom vs Solflare vs Backpack

Характеристика Phantom Solflare Backpack
Установки 10M+ 5M+ 1M+
Поддержка window.solana да да да
Wallet Adapter да да да
Аппаратная поддержка Ledger Ledger, Trezor нет
Мультичейн Solana, Ethereum, Polygon Solana, Ethereum Solana

Phantom остаётся лидером по удобству и функциональности, но Solflare превосходит его по поддержке аппаратных кошельков. Наш wallet-adapter позволяет легко переключаться между ними без изменения кода авторизации.

Процесс работы: этапы и сроки

Этап Что делаем Срок
1. Аналитика Изучаем ваш dApp, определяем требования к auth 1 день
2. Проектирование Разрабатываем архитектуру, схему nonce, подпись 1 день
3. Реализация Пишем фронтенд (React/Next) + backend (Node/Go) 2-3 дня
4. Тест Покрываем unit-тестами, проверяем безопасность 1 день
5. Деплой Настраиваем CI/CD, разворачиваем на mainnet 1 день

Базовая интеграция занимает 1–2 дня, сложные сценарии (multi-sig, кастомные сообщения) — до 5 дней. Стоимость рассчитывается индивидуально. Получите консультацию по вашему проекту — мы оценим сложность и предложим решение.

Что входит в работу под ключ?

  • Документация: описание архитектуры, инструкция по развёртыванию.
  • Доступы: код в вашем репозитории, настройка CI/CD.
  • Обучение: сессия для вашей команды по поддержке и модификации.
  • Поддержка: гарантия 1 месяц на устранение багов.

Наша команда имеет более 5 лет опыта в Solana разработке и участвовала в аудите контрактов на $50M+ TVL. Мы гарантируем безопасность вашего dApp. Обратитесь к нам для оценки проекта — реализуем интеграцию под ключ за 1-3 дня. Закажите консультацию прямо сейчас.