Разработка авторизации через Phantom (Solana)
Phantom — самый популярный Solana кошелёк ($10M+ installs). Авторизация через Phantom следует той же концепции что и SIWE для Ethereum — подписание сообщения для доказательства владения адресом, но с Solana-специфичными особенностями: Ed25519 подписи, base58 адреса, другой message format.
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 (не 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, etc.
];
// Провайдер поддерживает все кошельки
<WalletProvider wallets={wallets} autoConnect>
<YourApp />
</WalletProvider>
Phantom auth — 1-2 дня для backend + frontend интеграции. Единый интерфейс через wallet-adapter позволяет поддерживать несколько Solana кошельков одним кодом.







