You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Sol Cerberus限制Solana程序仅对特定NFT持有者开放并测试调用

在Web3应用中通过Sol Cerberus结合NFT认证执行Solana程序指令

你的Rust程序通过#[rule(Stats, View)]宏指定了调用view_stats需要满足Stats规则下的View权限,要在JS中实现基于NFT集合的权限验证并调用该指令,可按以下步骤操作:

1. 安装依赖

首先安装所需的Solana和Sol Cerberus客户端库:

npm install @solana/web3.js @sol-cerberus-client/core @sol-cerberus-client/web3

2. 实现核心逻辑

以下是完整的JavaScript代码示例,包含权限验证和指令调用:

import { Connection, PublicKey, Transaction, sendAndConfirmTransaction } from '@solana/web3.js';
import { SolCerberus } from '@sol-cerberus-client/web3';

// 初始化Solana连接(根据环境切换主网/测试网)
const connection = new Connection('https://api.devnet.solana.com');
// 假设使用Phantom钱包(适配其他钱包逻辑类似)
const wallet = window.solana;

// 替换为你的程序和NFT集合地址
const PROGRAM_ID = new PublicKey('MY_PROGRAM_ID');
const NFT_COLLECTION_MINT = new PublicKey('YOUR_NFT_COLLECTION_MINT_ADDRESS');
const RULE_NAME = 'Stats';
const RULE_ACTION = 'View';

async function executeViewStats() {
  // 1. 构建view_stats基础指令
  // 注意:keys数组需严格匹配Rust程序中Context<Add>定义的账户列表
  const viewStatsIx = new TransactionInstruction({
    programId: PROGRAM_ID,
    keys: [
      { pubkey: wallet.publicKey, isSigner: true, isWritable: false },
      // 添加程序要求的其他账户(如统计数据账户等)
    ],
    data: Buffer.from([0]), // 替换为实际的指令判别码(Rust程序中指令的唯一标识)
  });

  // 2. 初始化Sol Cerberus客户端
  const cerberus = new SolCerberus(connection);

  // 3. 生成NFT集合验证指令:验证用户持有该集合的至少一个NFT
  const nftValidationRules = await cerberus.addNftCollectionRule(
    wallet.publicKey,
    NFT_COLLECTION_MINT,
    RULE_NAME,
    RULE_ACTION
  );

  // 4. 合并验证指令与业务指令到交易
  const transaction = new Transaction()
    .add(...nftValidationRules.instructions)
    .add(viewStatsIx);

  // 5. 发送并确认交易
  try {
    // 请求钱包授权签名
    await wallet.connect();
    const signature = await sendAndConfirmTransaction(
      connection,
      transaction,
      [wallet]
    );
    console.log('交易执行成功,签名:', signature);
  } catch (err) {
    console.error('交易失败:', err);
  }
}

// 触发执行
executeViewStats();

关键注意事项

  • 指令判别码:需与Rust程序中view_stats指令的判别码一致。若使用Anchor框架,判别码是指令名称哈希的前8字节,可通过anchor idl命令生成的IDL文件确认。
  • 账户列表:keys数组必须完全匹配Rust程序Context<Add>结构体中定义的账户顺序和权限(签名者/可写性),否则交易会失败。
  • Sol Cerberus规则:addNftCollectionRule会自动生成一系列验证指令,确保用户持有指定集合的NFT,这些指令会优先于你的业务指令执行,权限验证不通过时整个交易会终止。
  • 钱包适配:示例使用Phantom钱包,若使用其他钱包(如Solflare),只需替换钱包实例的获取方式,核心逻辑保持一致。

内容的提问来源于stack exchange,提问作者Peter Schwarz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 04:13:19