Solana上的代币门控 - Solana移动教程

  • Helius
  • 发布于 2024-01-24 12:50
  • 阅读 10

本文介绍了如何使用 Helios DAS API 和 React Native 建立一个基于 Solana Saga 的 token-gated dApp,详细阐述了设置环境和实现的步骤,并讨论了 token-gating 的应用场景,强调了数字资产所有权的价值与社区体验的提升。

8分钟阅读

2024年1月22日

引言

在2023年初,Solana Mobile推出了一款基于区块链的智能手机。现在,Solana Saga已有超过15,000次激活,这是一个自定义的Android设备,通过在钱包体验中集成的芯片级种子保险库来增强链上安全性。然而,移动钱包体验并不仅限于Saga。相同的 mobile wallet adapter 提供了一种标准流,以减轻开发人员发布跨平台应用的复杂性。那么,是什么让Saga与众不同呢?

作为拥有Saga的通行仪式,用户铸造了 Saga Genesis Token – 一个灵魂绑定的NFT代币。该代币集合为Solana Saga用户的主要地址提供了准确的列表,并促使社区的激活。Saga Genesis Token使得为社区进行空投变得比以往任何时候都简单。然而,由于用户的钱包快速充满,就像一个二手商店一样,也许是时候探索定制解决方案来吸引Saga持有者社区。一种可能性是开发基于代币的dApp,为用户提供个性化和独特的体验。

Token-gating是一种根据连接钱包的代币持有情况显示客户端信息的方式。Token-gating决定了个人是否可以访问信息,并可用于允许对像 Saga DAO 这样的社区的独占访问。本教程将覆盖如何使用Helius DAS API 和React Native构建一个Solana的基于代币的dApp,以Saga Genesis Token作为示例门控集合。本教程和演示可以通过更改代币地址和条件来修改,以适配任何代币组。GitHub代码库可以在此找到: @helius_labs/saga-token-gating-tutorial

环境设置

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

要配置Saga以进行移动开发,前往设置并搜索Build Number。连续点击该选项7次,直到‘You are now a developer!’弹出窗口可见。搜索并启用Developer Options,并在同一下拉菜单中启用USB Debugging

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

使用Git Bash,从Helius GitHub克隆demo repository,并在代码编辑器中打开。在git bash命令提示符中,切换到app文件夹并运行yarn来安装应用。要运行应用,请在设备连接或Android模拟器运行的情况下输入以下命令。

代码

yarn react-native run-android

Solana Saga的Token-gating

Token-gating工作流程的高层概述:

  1. 用户用他们的钱包授权一个会话,向dApp提供他们的公钥。
  2. dApp从 searchAssets DAS API endpoint 获取数据。
  3. 响应的JSON被解构以访问结果。
  4. 结果被验证,并确定代币的所有权。
  5. 验证状态被设置,客户端相应地被渲染。

让我们深入到代码中。首先,从构造对Helius DAS API的请求开始,以获取有关用户及其对Solana Genesis Token的所有权的信息。

要接收关于Saga Genesis Token的信息,SagaGenesisToken变量被设置为该集合的代币地址。若要将该变量替换为另一个代币地址,以对其他集合进行门控。

请求需要一个Helius API 密钥,在教程中故意留空。最佳的密钥安全做法是使用代理服务器来转发请求。 @helius_labs/helius_rpc_proxy代码库包含一个可以单击部署的Cloudflare Worker,以用作RPC URL,同时隐藏API密钥。

代码

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

export default async function findSagaGenesisToken(address: PublicKey) {
  // 替换为你想要门控的代币地址
  const SagaGenesisToken = '46pcSL5gmjBrPqGKFaLbbCmR6iVuLJbnQy13hAe7s6CC';

  // 填写你的Helius API密钥
  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(),因为当用户按下连接按钮时,回调函数被调用。

代码

// 检查用户的钱包是否具有Saga Genesis Token
const handleConnectPress = useCallback(async () => {
  return await transact(async (wallet: Web3MobileWallet) => {
    const authorizationResult = await authorizeSession(wallet);

    const message = "确认你拥有此钱包。";
    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);

      // 检查用户是否恰好拥有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在后台完成,以确保账户所有权的合法性。

通过演示应用授权移动钱包适配器连接到Phantom

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

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

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

Mainscreen.tsx中找到条件渲染逻辑,作为根据验证状态显示信息的简化表示。GitHub代码库可以修改或参考以进一步个性化。一种示例实现将是将基于代币的门控连接到 React Native Navigation,以有条件地在屏幕之间导航。

react native navigation

Token-gating的应用

Token-gating是一个在Web3中引入的新概念,资产所有权授予访问内容的权利。该逻辑适用于诸如安全、消费品、出版和分发等领域。

Discord安全工具使用token-gating为社区提供基于代币所有权和持有数量的有限访问。

消费品和服务使商家能够根据token-gating向社区提供优惠券、折扣和销售机会。

这为资产所有权增添了更大的实用性,并为将数字资产用于现实世界功能创造了更直观的方式。

资产所有权增强了媒体和内容行业,通过货币化所有权并提供自定义体验。

以下是可以通过token-gating构建的一些东西:

  • 独家的推荐码和优惠券
  • Substack风格的博客
  • 空投索赔
  • 私密仪表板
  • 游戏化故事dApps
  • 秘密群聊
  • 链上调查
  • 定制游戏福利和活动

使用DAS API,token-gating的美在于任何代币都可以使用。DeFi应用可能要求用户拥有一定数量的Solana才能获得访问权限,就像NFT群聊要求其成员验证他们持有的代币数量一样。人们可以使用相同的逻辑,通过DAS API对SPL代币、NFT、SFT、SBT和cNFT进行门控。

结论

本教程提供了使用DAS API对基于React Native构建的dApp进行token-gating的简化概述。该逻辑可以应用于任何集合或代币,并可适应特定的使用案例。Token-gating体验为社区提供了独占性和价值,Saga Genesis Token支持对强大社区的空投,为创作者和用户创造了许多机会。Web3引入了数字商品的自我托管所有权。这转化为以资产所有权为纽带的社区的出现。当Solana Saga将物理和数字技术结合在一起,以提供Solana原生体验时,必须构建应用程序以增强和奖励这一体验。超越收益,token-gating推动数字资产所有权在新互联网时代的利用。

对Saga移动dApp开发内容感兴趣吗?请加入15,000多名Saga所有者,加入Saga DAO,第一时间了解最新的dApp发布、福利和奖励。如果本教程中的token-gating启发了实施策略,请在Helius Discord与开发者社区交谈,保持对Helius博客的关注。加速区块链的采用,利用Helius构建最具性能的技术。

额外资源

  • 原文链接: helius.dev/blog/token-ga...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Helius
Helius
https://www.helius.dev/