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

Проєктуємо та розробляємо блокчейн-рішення повного циклу: від архітектури смарт-контрактів до запуску DeFi-протоколів, NFT-маркетплейсів та криптобірж. Аудит безпеки, токеноміка, інтеграція з наявною інфраструктурою.
Показано 1 з 1Усі 1306 послуг
Розробка авторизації через Phantom (Solana)
Середній
~2-3 дні
Часті запитання

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

Етапи блокчейн-розробки

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1285
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1198
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    902
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1121
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    589
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    858

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

Phantom — найпопулярніший Solana гаманець (10M+ встановлень). Авторизація через Phantom слідує тій же концепції що й SIWE для Ethereum — підписання повідомлення для доказу володіння адресою, але з Solana-специфічними особливостями: Ed25519 підписи, base58 адреси, різний формат повідомлення.

Phantom Provider API

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

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());
        
        // Формуємо повідомлення
        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 (не ECDSA як Ethereum). Верифікація:

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, тощо
];

// Provider підтримує всі гаманці
<WalletProvider wallets={wallets} autoConnect>
    <YourApp />
</WalletProvider>

Phantom auth — 1-2 дні для backend + frontend інтеграції. Єдиний інтерфейс через wallet-adapter дозволяє підтримувати кілька Solana гаманців з одним кодом.