新消息:Helius 收购 Light Protocol
Web3 用户体验
博客/开发

无摩擦且安全的用户体验:助力数百万用户加入 Solana 的技术栈

钱包基础设施X 上的 PrivyLinkedIn 上的 Privy
Privy 首席 Solana 工程师X 上的 Danny B.LinkedIn 上的 Danny B.
阅读需 6 分钟

开发者指南:使用 Privy 和 Helius 实现嵌入式钱包、无 gas 费交易和无摩擦的新用户引导。

如今,大多数面向消费者的加密应用都依赖外部钱包,迫使用户管理助记词、经历多次跳转,并手动批准每笔交易。 

对于不熟悉区块链的普通用户来说,这些要求几乎不可能完成。助记词、gas 费和钱包弹窗不仅会增加操作阻力,还会导致用户流失。这意味着,即使产品出色,应用也可能在用户真正开始使用前就失去他们。

事情本不必如此。

本指南将介绍如何使用 Privy 和 Helius 在 Solana 上打造无缝的链上体验,实现无 gas 费交易、嵌入式钱包,以及延迟低至 < 20 ms 的即时交易。

我们将介绍如何:

  • 通过简单的登录方式(电子邮件、社交账号、SMS)创建自托管嵌入式钱包,同时支持 Phantom、Solflare、Backpack 等外部钱包——所有功能均通过 Privy SDK 实现
  • 通过安全钱包代付费用,启用无 gas 费交易
  • 将 MoonPay 或 Coinbase Pay 等法币入金通道集成到你的 UI 中
  • 将流动性无缝原生桥接至 Solana
  • 构建移动端应用,提供如 Web2 般流畅的链上用户体验

接下来,让我们深入了解如何通过你的 Solana 应用吸引未来数百万用户。

加密应用的新用户引导实践:DeFi 与消费者应用示例

无缝的新用户引导并非锦上添花,而是增长倍增器。采用嵌入式钱包的应用可以实现超过 40% 的月度用户留存率,在面向加密领域新用户时尤其如此。 

对大多数消费者而言,gas、滑点、优先费和小费等加密原生概念既陌生又复杂。 

为了留住用户,应用必须让新用户引导更加简单易懂。这意味着用户可以与USDC 等稳定币交互,或通过赞助交易支付 gas 费。

目标很简单:让用户无需了解加密技术的运行原理,就能完成签名、兑换和质押。

Pump.fun — 代币发行平台

Pump.fun 是 Solana 上增长最快的交易平台之一。它将嵌入式钱包与无 gas 费交易相结合,无需弹窗、批准或切换钱包,即可一键完成即时交易。

高级版体验最初为高频交易者打造,后来因效果出色而向所有用户开放。

如今,任何人都能在几秒内通过移动端发行代币并开始交易。一些用户甚至通过由 Privy 提供支持的钱包完成了数百万美元的交易,全程无需离开移动应用。

Jupiter — DEX 聚合器

Jupiter 的 Quick Account 体验展现了无缝交易的强大能力。无论用户通过 Phantom、Solflare、Backpack,还是仅使用电子邮件或 X 登录,底层交互都由 Privy 的嵌入式钱包基础设施提供支持。

这种架构无需用户签署交易即可即时完成交易,并且每次都能通过无摩擦的执行路径获得最优价格。

准备好后,用户可以将密钥导出至外部钱包,保留完整控制权,并避免供应商锁定。

Moonwalk — 边走边赚移动应用

Moonwalk 允许用户像使用其他 Web2 消费者应用一样,通过电子邮件、社交账号或 SMS 注册,提供无摩擦的移动端新用户引导体验。

在后台,每次注册都会使用 Privy 自动创建一个功能完整的嵌入式钱包。用户无需操心助记词、钱包扩展程序或任何加密领域特有的设置。

他们只需开始走路并赚取奖励,甚至无需意识到自己正在进行链上操作。

打造无缝的链上用户体验:原生账户入金

在后台创建嵌入式钱包只是第一步。要真正提供无缝的应用体验,开发者还必须解决账户入金和跨链流动性问题——这两者是最常见的用户流失原因。 

嵌入式入金通道

优秀的消费者应用会消除每个环节的操作阻力,包括用户需要向钱包充值的时刻。

通过将法币入金通道直接嵌入应用体验,用户无需离开界面即可购买 SOL 或 USDC。

Privy SDK 可轻松集成 MoonPay 和 Coinbase Pay 等入金服务商,让用户只需点击几次即可原生购买 Solana 资产。

原生跨链桥接

另一个关键能力是原生流动性跨链桥接。如果用户的 Solana 钱包资金不足,开发者可以配置其 Privy 钱包,从 Ethereum、Base 或 Polygon 等 EVM 链桥接余额。 

这会让你的应用成为流动性汇聚点,从用户已有资产的任何位置获取资产,并将其直接带入你的 Solana 体验。无需切换应用,无需复制钱包地址,只需无缝完成跨链价值转移。

如何使用 Privy 和 Helius 设置无 gas 费交易

除账户入金和跨链桥接外,与传统密钥对相比,Privy 钱包还提供安全的密钥管理,并专为费用支付方架构而设计。

1. 创建托管钱包

要为用户设置无 gas 费交易,你需要创建一个充当“费用支付方”的托管钱包。

该钱包会代用户支付 gas 费,为他们提供无缝且免费的使用体验。 

在 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. 实现赞助交易

托管钱包设置完成并注入资金后,就可以开始为用户启用无 gas 费交易。 

用户完成身份验证后,Privy 会创建一个与其登录凭据绑定的嵌入式钱包。用户照常签署交易,但交易不会直接提交到区块链,而是发送至你的后端。托管钱包会在那里完成签名,并代用户提交交易。

这种架构在提供无缝用户体验的同时,也让用户保留对密钥的完全控制权。

客户端实现(搭配 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 的优化交易基础设施相结合,你可以在不牺牲可靠性或灵活性的前提下,为用户提供无缝、无 gas 费的体验。

打造无缝应用体验的灵活技术栈

Privy 的模块化 SDK 与 Helius 的高性能 RPC 节点相结合,为开发者打造一流的 Solana 应用提供了强大且灵活的基础。 

无论你是从底层钱包 API 起步并使用自己的身份验证技术栈,还是使用 Privy 实现身份验证及多因素身份验证(MFA)、嵌入式入金通道或原生跨链桥接等高级功能,Privy 的技术栈都能随你的产品需求扩展。

更多资源

订阅 Helius

及时了解 Solana 开发的最新动态,并在我们发布新内容时收到更新