
摩擦がなく安全なUX:数百万人のユーザーをSolanaへ導く技術スタック
PrivyとHeliusを使用して、埋め込みウォレット、ガスレストランザクション、摩擦のないオンボーディングを実現するための開発者向けガイドです。
現在、消費者向け暗号資産アプリの多くは外部ウォレットに依存しているため、ユーザーはシードフレーズを管理し、何度もリダイレクトを経て、すべてのトランザクションを手動で承認しなければなりません。
ブロックチェーンに不慣れな一般ユーザーにとって、これはあまりにも高いハードルです。シードフレーズ、ガス代、ウォレットのポップアップは操作を煩雑にするだけでなく、ユーザー離脱を招きます。その結果、優れたプロダクトを持つアプリでも、ユーザーが使い始める前に離脱してしまいます。
そうである必要はありません。
このガイドでは、PrivyとHeliusを使用してSolana向けのシームレスなオンチェーン体験を構築し、ガスレストランザクション、埋め込みウォレット、< 20 msのレイテンシによる即時取引を実現する方法を解説します。
以下の方法を取り上げます。
- Privy SDKだけで、簡単なログイン(メール、ソーシャル、SMS)によるセルフカストディ型の埋め込みウォレットをプロビジョニングしながら、Phantom、Solflare、Backpackなどの外部ウォレットにも対応する方法
- セキュアなウォレットで手数料を負担し、ガスレストランザクションを実現する方法
- MoonPayやCoinbase Payなどの法定通貨オンランプをUIに統合する方法
- 摩擦なくSolanaへ流動性をネイティブにブリッジする方法
- Web2のように自然なオンチェーンUXでモバイル向けに構築する方法
Solanaアプリを通じて、次の数百万人のユーザーをオンボーディングするために必要な要素を詳しく見ていきます。
暗号資産オンボーディングの実践:DeFiと消費者向けアプリの事例
シームレスなオンボーディングは、単なる「あれば便利」な機能ではなく、成長を加速させる要因です。埋め込みウォレットを活用するアプリでは、特に暗号資産を初めて利用するユーザーを対象とする場合、月間ユーザー継続率が40%以上になることがあります。
多くの消費者にとって、ガス、スリッページ、優先手数料、チップといった暗号資産特有の概念はなじみがなく、難解です。
ユーザーを定着させるには、アプリのオンボーディングをわかりやすくする必要があります。つまり、ユーザーがUSDCなどのステーブルコインを利用したり、スポンサー付きトランザクションを通じてガス代を負担してもらったりできるようにする必要があります。
目標はシンプルです。暗号資産の仕組みを学ばなくても、ユーザーが署名、スワップ、ステーキングを行えるようにします。
Pump.fun — トークンローンチパッド
Pump.funはSolanaで最も急成長している取引プラットフォームの一つです。埋め込みウォレットとガスレストランザクションを組み合わせ、ポップアップ、承認、ウォレットの切り替えを必要としない、ワンタップの即時取引を提供しています。
当初は高頻度トレーダー向けに構築されたAdvanced体験でしたが、非常に高い効果が確認されたため、すべてのユーザーに展開されました。
現在では、誰でも数秒でトークンをローンチし、モバイルで取引を開始できます。モバイルアプリを離れることなく、Privyを基盤とするウォレットを通じて数百万ドル規模の取引を行ったユーザーもいます。
Jupiter — DEXアグリゲーター
JupiterのQuick Account体験は、シームレスな取引がいかに強力であるかを示しています。Phantom、Solflare、Backpackだけでなく、メールやXでサインインする場合でも、すべてのユーザーが内部ではPrivyの埋め込みウォレットインフラストラクチャを利用します。
この構成により、トランザクションへの署名を求めることなく即時取引が可能になり、毎回、摩擦のない最良価格の執行経路を提供できます。
準備ができたら、ユーザーは鍵を外部ウォレットへエクスポートできるため、完全なコントロールを維持しながらベンダーロックインを回避できます。
Moonwalk — 歩いて稼ぐモバイルアプリ
Moonwalkでは、一般的なWeb2消費者向けアプリと同じように、メール、ソーシャル、SMSで登録できるため、摩擦のないモバイルオンボーディング体験を提供しています。
内部では、登録のたびにPrivyを使用して、完全に機能する埋め込みウォレットが自動的にプロビジョニングされます。ユーザーはシードフレーズ、ウォレット拡張機能、暗号資産特有のセットアップを気にする必要がありません。
ユーザーはオンチェーンであることを意識することなく、歩いて報酬を獲得し始めるだけです。
シームレスなオンチェーンUXの構築:ネイティブなアカウント入金
内部で埋め込みウォレットを作成することは、始まりにすぎません。本当にシームレスなアプリ体験を提供するには、ユーザー離脱の主な原因であるアカウントへの入金とクロスチェーン流動性にも対応する必要があります。
埋め込みオンランプ
優れた消費者向けアプリは、ユーザーがウォレットへ入金する場面を含め、あらゆるステップから摩擦を取り除きます。
アプリ体験に法定通貨オンランプを直接埋め込むことで、ユーザーはインターフェースを離れることなくSOLやUSDCを購入できます。
PrivyのSDKを使用すると、MoonPayやCoinbase Payなどのオンランププロバイダーを簡単に統合でき、わずか数回のクリックでSolana資産をネイティブに購入できるようになります。
ネイティブブリッジング
もう一つの重要な要素は、ネイティブな流動性ブリッジングです。ユーザーのSolanaウォレットの残高が不足している場合、Ethereum、Base、PolygonなどのEVMチェーンから残高をブリッジするようにPrivyウォレットを構成できます。
これにより、アプリが流動性の受け皿となり、ユーザーがすでに保有している場所から資産を取り込み、Solana体験へ直接移動できます。アプリの切り替えも、ウォレットアドレスのコピーも不要です。シームレスなクロスチェーン価値移転だけで完結します。
PrivyとHeliusでガスレストランザクションを設定する方法
Privyのウォレットは、アカウントへの入金やクロスチェーンブリッジングに加えて、安全な鍵管理を提供します。また、従来のキーペアと比べ、手数料支払者の構成に特化して設計されています。
1. マネージドウォレットを作成する
ユーザー向けにガスレストランザクションを設定するには、「手数料支払者」として機能するマネージドウォレットをプロビジョニングする必要があります。
このウォレットがユーザーに代わってガス代を処理するため、ユーザーにシームレスかつ無料の体験を提供できます。
Privy Dashboardでマネージドウォレットを有効にすると、Privy Node.js SDKを使用してサーバー側からプログラムで作成できます。
Privy NodeJS SDKの使用方法:
import { PrivyClient } from '@privy-io/server-sdk';
// Initialize the Privy client
const privy = new PrivyClient({
apiKey: process.env.PRIVY_API_KEY
});
// Create a new Solana managed wallet
async function createFeePayerWallet() {
const { id, address, chainType } = await privy.walletApi.create({
chainType: 'solana',
policyIds: ['optional_policy_id'],
idempotencyKey: 'unique_request_identifier'
});
console.log(`Created fee payer wallet with ID: ${id}`);
console.log(`Wallet address: ${address}`);
return { id, address };
}
// Make sure to fund this wallet with SOL to cover transaction fees
ウォレットIDとアドレスは、後続のステップでトランザクションの手数料を負担するために使用します。
2. スポンサー付きトランザクションを実装する
マネージドウォレットの設定と入金が完了したら、ユーザー向けにガスレストランザクションを有効化できます。
ユーザーが認証すると、Privyはログイン認証情報に紐づく埋め込みウォレットをプロビジョニングします。ユーザーは通常どおりトランザクションに署名しますが、ブロックチェーンには直接送信されません。代わりにトランザクションがバックエンドへ送られ、マネージドウォレットがユーザーに代わって署名し、送信します。
このガイドでは、Privyの埋め込みウォレットを中心に説明します。ただし、スポンサー付きトランザクションのパターンは、あらゆるSolanaウォレットで利用できます。ユーザーがトランザクションに署名し、サーバーがガス代を負担してネットワークへブロードキャストします。
この構成により、ユーザーが鍵を完全に管理できる状態を保ちながら、シームレスなユーザー体験を実現できます。
クライアント側の実装(Privy SDKを使用したReact)
import { useSolanaWallets } from '@privy-io/react-auth/solana';
import {
TransactionMessage,
PublicKey,
VersionedTransaction,
Connection
} from '@solana/web3.js';
async function sendGaslessTransaction(instructions) {
// Get user's embedded wallet
const { wallets } = useSolanaWallets();
const embeddedWallet = wallets.find(wallet =>
wallet.walletClientType === 'privy'
);
if (!embeddedWallet) {
throw new Error('No embedded wallet found');
}
// Connect to Solana via Helius for better performance
const connection = new Connection('https://mainnet.helius-rpc.com/?api-key=YOUR_HELIUS_API_KEY');
const { blockhash } = await connection.getLatestBlockhash();
// Set your managed wallet as fee payer
const feePayerAddress = 'YOUR_PRIVY_SERVER_WALLET_ADDRESS';
// Build transaction with managed wallet as payer
const message = new TransactionMessage({
payerKey: new PublicKey(feePayerAddress),
recentBlockhash: blockhash,
instructions
}).compileToV0Message();
const transaction = new VersionedTransaction(message);
// Have user sign the transaction
const provider = await embeddedWallet.getProvider();
const serializedMessage = Buffer.from(
transaction.message.serialize()
).toString('base64');
const { signature } = await provider.request({
method: 'signMessage',
params: { message: serializedMessage }
});
// Add user signature
const userSignature = Buffer.from(signature, 'base64');
transaction.addSignature(
new PublicKey(embeddedWallet.address),
userSignature
);
// Send to your backend for fee payer signature
const serializedTx = Buffer.from(
transaction.serialize()
).toString('base64');
const response = await fetch('/api/sponsor-transaction', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ transaction: serializedTx })
});
const { transactionHash } = await response.json();
return transactionHash;
}
最後に、一部署名済みのトランザクションがクライアントからバックエンドへ送信されます。そこで検証され、マネージドウォレットによって署名された後、Solanaネットワークへブロードキャストされます。
バックエンドの実装(Next.js API Route)
// pages/api/sponsor-transaction.js
import { VersionedTransaction } from '@solana/web3.js';
import { PrivyClient } from '@privy-io/server-sdk';
// Initialize Privy SDK
const privy = new PrivyClient({
apiKey: process.env.PRIVY_API_KEY
});
// For App Router (Next.js 13+)
export async function POST(request) {
try {
const { transaction: serializedTx } = await request.json();
// Deserialize the transaction to verify it (optional)
const txBuffer = Buffer.from(serializedTx, 'base64');
const transaction = VersionedTransaction.deserialize(txBuffer);
// Verify the transaction (check fee payer, validate against policies)
// ...verification logic here...
// Sign AND send with your Privy managed wallet in one step
const serverWalletId = process.env.PRIVY_SERVER_WALLET_ID;
const { hash } = await privy.walletApi.solana.signAndSendTransaction({
walletId: serverWalletId,
caip2: 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1', // Mainnet
transaction: serializedTx,
rpcUrl: 'https://mainnet.helius-rpc.com/?api-key=YOUR_HELIUS_API_KEY',
options: {
maxRetries: 5,
skipPreflight: true
}
});
return Response.json({
transactionHash: hash,
message: 'Transaction sent successfully'
}, { status: 200 });
} catch (error) {
console.error('Error processing transaction:', error);
return Response.json({
error: 'Failed to process transaction',
details: error.message
}, { status: 500 });
}
}
PrivyのセキュアなウォレットとHeliusの最適化されたトランザクションインフラストラクチャを組み合わせることで、信頼性や柔軟性を損なうことなく、ユーザーにシームレスなガスレス体験を提供できます。
シームレスなアプリ体験を構築するための最も柔軟なスタック
Privyのモジュール式SDKとHeliusの高性能RPCノードを組み合わせることで、開発者は世界水準のSolanaアプリを構築するための強力で柔軟な基盤を手に入れられます。
低レベルのウォレットAPIから始めて独自の認証スタックを導入する場合でも、認証や多要素認証(MFA)、埋め込みオンランプ、ネイティブブリッジングなどの高度な機能にPrivyを使用する場合でも、Privyのスタックはプロダクトのニーズに合わせて拡張できます。
その他のリソース
関連記事
Heliusを購読
Solana開発の最新情報や新しい記事の公開通知を受け取れます


