Розробка авторизації через Phantom (Solana)
При вході в Solana dApp користувач стикається з проблемою: традиційні email+password не працюють у Web3. Phantom-гаманець пропонує аутентифікацію через підпис повідомлення Ed25519, але реалізація приховує підводні камені. Неправильне кодування повідомлення, вразливість replay attack, несумісність з різними гаманцями — часті помилки. Ми розберемо, як впровадити Phantom auth із захистом від цих загроз, і розповімо про нашу роботу під ключ. Економія від правильної реалізації є значною за рахунок запобігання витокам і зломам.
Які проблеми вирішуємо
Головна технічна складність — інтеграція з різними 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% і дозволяє уникнути значних фінансових втрат.
Як вибрати гаманець для інтеграції?
При виборі гаманця орієнтуйтеся на підтримку 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 дні. Замовте консультацію прямо зараз.







