新消息:Helius 收购 Light Protocol
Solana 代币门控——Solana Mobile 教程
博客/开发

Solana 代币门控——Solana Mobile 教程

集成工程师X 上的 0xSolanaGirl
阅读需 8 分钟

简介

2023 年初,Solana Mobile 推出了一款由区块链驱动的智能手机。如今,Solana Saga 的激活量已超过 15,000 台。它是一款定制 Android 设备,通过集成到钱包体验中的芯片级助记词保险库,增强链上安全性。不过,移动钱包体验并非 Saga 独有。同一个移动钱包适配器提供标准流程,降低开发者发布跨平台应用的复杂度。那么,Saga 的独特之处是什么?

作为拥有 Saga 的必经仪式,用户会铸造 Saga Genesis Token——一种灵魂绑定 NFT。该代币集合提供准确的 Solana Saga 用户主地址列表,并支持围绕社区开展各种活动。Saga Genesis Token 让向社区空投变得前所未有地简单。不过,随着用户的钱包迅速塞得像旧货店一样满,现在或许该探索定制解决方案来吸引 Saga 持有者社区了。一种可行方案是开发代币门控 dApp,为用户提供个性化的专属体验。 

代币门控是一种根据已连接钱包的代币所有权显示客户端信息的方式。代币门控决定个人能否访问信息,也可用于为 Saga DAO 等社区提供专属访问权限。本教程将介绍如何使用 Helius DAS API 和 React Native 构建 Solana 代币门控 dApp,并以 Saga Genesis Token 作为示例门控集合。你可以通过更改代币地址和条件来修改本教程及演示,为任意代币组设置门控。GitHub 仓库位于:@helius_labs/saga-token-gating-tutorial。

环境设置

本教程使用通过 USBC 线缆连接到 Solana Saga 的 PC。如果没有 Saga,也可以使用 Android 模拟器或 Android 设备。如果要在已启用开发者模式的 Saga 上测试,并且 PC 已安装 Android SDK 工具和最新版 NodeJS,则可跳过这些步骤。

要配置用于移动开发的 Saga,请前往设置并搜索版本号。连续点击该选项 7 次,直到出现“你现在是开发者了!”弹窗。搜索并启用开发者选项,然后在同一下拉菜单中启用 USB 调试。

在计算机上,确保已安装 NodeJS 并升级到 v20.9.0。安装 Android SDK 工具并设置 ANDROID_HOME 变量。

使用 Git Bash 从 Helius GitHub 克隆演示仓库,并在代码编辑器中打开。使用 git bash 命令提示符 cd 进入 app 文件夹,然后运行 yarn 安装应用。要运行应用,请在设备已连接或 Android 模拟器正在运行时输入以下命令。

代码
yarn react-native run-android

为 Solana Saga 设置代币门控

代币门控工作流概览:

  1. 用户使用钱包授权会话,并向 dApp 提供其公钥。
  2. dApp 从 searchAssets DAS API 端点获取数据。
  3. 对响应的 JSON 进行解构以访问结果。
  4. 验证结果并确定代币所有权。
  5. 设置验证状态,客户端据此进行渲染。

接下来深入了解代码。首先构建向 Helius DAS API 发出的请求,以获取用户及其 Saga Genesis Token 所有权的相关信息。

为了获取 Saga Genesis Token 的信息,将 SagaGenesisToken 变量设为该集合的代币地址。若要为其他集合设置代币门控,请将此变量替换为其他代币地址。

该请求需要 Helius API 密钥,本教程有意将其留空。保护密钥的最佳做法是使用代理服务器转发请求。@helius_labs/helius_rpc_proxy 仓库包含一个可一键部署的 Cloudflare Worker,可在隐藏 API 密钥的同时用作 RPC URL。

代码
import { PublicKey } from "@solana/web3.js";

export default async function findSagaGenesisToken(address: PublicKey) {
  // Replace this with the token address you want to gate for
  const SagaGenesisToken = '46pcSL5gmjBrPqGKFaLbbCmR6iVuLJbnQy13hAe7s6CC';

  // Populate your Helius API key
  const HELIUS_APIKEY = '';
  const url = `https://mainnet.helius-rpc.com/?api-key=${HELIUS_APIKEY}`

  const response = await fetch(url, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      jsonrpc: '2.0',
      id: 'my-id',
      method: 'searchAssets',
      params: {
        ownerAddress: address.toString(),
        grouping: ["collection", SagaGenesisToken],
        page: 1,
        limit: 10
      },
    }),
  });

  const { result } = await response.json();
  return (result.items)
};

findSagaGenesisToken 函数接收用户的钱包地址作为参数,并将其用于发送到 Helius RPC URL 的 POST 请求参数中。

此请求使用 searchAssets 方法,查询 ownerAddress 拥有并按特定 collection 分组的资产。随后,API 响应会被构造成 JSON,并通过解构来访问结果。

以下响应表明钱包拥有 Saga Genesis Token:

代码
{
   "items":[
      {
         "authorities":[Array],
         "burnt":false,
         "compression":[Object],
         "content":[Object],
         "creators":[Array],
         "grouping":[Array],
         "id":[Token_Address],
         "interface":"V1_NFT",
         "mutable":true,
         "ownership":[Object],
         "royalty":[Object],
         "supply":[Object]
      }
   ],
   "limit":10,
   "page":1,
   "total":1
}

以下是没有 Saga Genesis Token 的钱包响应:

代码
{
   "items":[],
   "limit":10,
   "page":1,
   "total":0
}

要使用此函数,请前往 screens 文件夹并找到 MainScreen.tsx。应用会将这个函数组件渲染为主屏幕,并可在用户界面中导入和使用函数等其他组件。

要调用代币门控函数,请导入 findSagaGenesisToken 函数并将其放入回调函数中。这里,该函数命名为 handleConnectPress(),因为用户按下连接按钮时会调用此回调函数。

代码
// Checks if the user's wallet has a Saga Genesis Token
const handleConnectPress = useCallback(async () => {
  return await transact(async (wallet: Web3MobileWallet) => {
    const authorizationResult = await authorizeSession(wallet);

    const message = "Confirm that you own this wallet.";
    const messageBuffer = new Uint8Array(
      message.split("").map((c) => c.charCodeAt(0))
    );

    const signedMessages = await wallet.signMessages({
      addresses: [authorizationResult.address],
      payloads: [messageBuffer],
    });

    const verified = sign.detached.verify(
      messageBuffer,
      signedMessages[0],
      authorizationResult.publicKey.toBytes()
    );

    if (verified) {
      const result = await findSagaGenesisToken(authorizationResult.publicKey);

      // Checks that user has exactly 1 Saga Genesis Token
      if (result.length === 1) {
        setVerified(true);
      } else {
        setVerified(false);
      }
    } else {
      setVerified(false);
    }
  });
}, [authorizeSession]);

在异步回调函数中,调用 @solana-mobile/mobile-wallet-adapter 的 transact 函数,以公开可用于授权会话的 Web3MobileWallet 对象。

该协议会跳转到可用钱包(默认为 Phantom)并启动会话。用户必须先在钱包界面中授权应用,然后才会被重定向回应用。用户必须签署消息,以验证其对钱包的所有权。

在本教程中,验证在服务端进行。但在生产应用中,必须通过 API 在后端完成消息验证,以确保账户所有权真实有效。

用户的钱包获得授权后,可以通过解构授权结果来获取其公钥。现在,可以使用其 publicKey 搜索 Saga Genesis Token 的所有权。

使用用户的公钥调用 findSagaGenesisToken,会向 DAS API 发送请求,并以数组形式返回找到的代币结果。如果用户恰好拥有一个 Saga Genesis Token,则将验证状态设为 true。否则,将验证状态设为 false。 

根据验证状态有条件地渲染屏幕和组件。本教程中的状态包括:等待连接、已验证和未验证。

在 Mainscreen.tsx 中查找条件渲染逻辑,它以简化方式展示了如何根据验证状态显示信息。你可以修改或参考 GitHub 仓库,以进一步进行个性化定制。例如,可以将代币门控与 React Native Navigation 连接起来,根据条件在不同屏幕之间导航。

代币门控的应用

代币门控是 Web3 带来的一种新概念,资产所有权会授予内容访问权。这套逻辑适用于安全、消费品、出版和分发等垂直领域。

Discord 安全工具为社区使用代币门控,根据用户拥有的代币及其数量提供受限访问权限。

消费品和服务商家可以基于代币门控向社区提供优惠券、折扣和促销机会。

这提升了资产所有权的实用价值,并提供了一种更具象的方式,让数字资产能够服务于现实场景。

资产所有权通过所有权变现和提供定制体验,赋能媒体和内容行业。

以下是一些可以使用代币门控构建的内容:

  • 专属推荐码和优惠券
  • Substack 风格的博客
  • 空投资格申领 
  • 私密仪表板 
  • 游戏化叙事 dApp
  • 私密群聊 
  • 链上调查
  • 定制游戏权益和活动

使用 DAS API 实现代币门控的优势在于,可以使用任何代币。DeFi 应用可以要求用户至少持有一定数量的 Solana 才能获得访问权限,就像 NFT 群聊要求成员验证自己至少持有一定数量的代币一样。使用 DAS API 和相同逻辑,可以用 SPL 代币、NFT、SFT、SBT 和 cNFT 为 dApp 设置门控。

总结

本教程简要介绍了如何使用 DAS API 为 React Native 构建的 dApp 设置代币门控。这套逻辑可应用于任何集合或代币,也可以针对具体用例进行调整。代币门控体验为社区带来专属感和价值。Saga Genesis Token 能够向活跃社区进行空投,并为创作者和用户带来大量机会。Web3 引入了数字商品的自主托管所有权,由此催生了因资产所有权而紧密联系的社区。Solana Saga 将实体技术与数字技术结合起来,提供 Solana 原生体验,因此必须构建能够增强并奖励这种体验的应用。除了收益,代币门控还推动数字资产所有权在互联网新时代得到实际应用。

想了解更多 Saga 移动 dApp 开发内容?加入 Saga DAO,与超过 15,000 名 Saga 用户一起,第一时间了解最新的 dApp 发布、权益和奖励。如果这篇代币门控教程为你带来了实现思路,欢迎加入 Helius Discord 与开发者社区交流,并通过 Helius 博客掌握最新动态。使用 Helius,在性能最强的技术上进行构建,加速区块链普及。

其他资源

订阅 Helius

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

放大图片