メインコンテンツへスキップ

NFT の提示

この例では、特定の非代替性トークン (NFT) またはオンチェーンアセットを所有するユーザーに、アプリケーションの特定のコンテンツや機能へのアクセスを制限する方法を示します。これは、限定メンバーシップ、イベントチケット、または特別なデジタルアイテムに使用される一般的な Web3 パターンです。

DID Connect は、アプリケーションが asset クレームを使用してユーザーのウォレットから直接アセットの所有権証明を要求できるようにすることで、このプロセスを簡素化します。このクレームタイプの詳細については、アセットクレームのドキュメント を参照してください。

仕組み

NFT ゲートアクセスのフローでは、アプリケーションがユーザーにウォレットから特定のアセットを提示するよう要求します。アプリケーションは、発行者、親コレクション、または一意のアドレスなど、要求されるアセットの基準を定義します。ユーザーのウォレットが一致するアセットを保持しており、リクエストを承認すると、アプリケーションは応答を検証してアクセスを許可します。

NFT Gated Access

実装手順

did-connect ハンドラーを使用して NFT ゲートアクセスを実装する方法は次のとおりです。信頼できる発行者からの NFT をユーザーに提示するよう要求するセッションを設定します。

1. ウォレットハンドラーの設定

まず、WalletHandlers を設定します。onConnect コールバックで、要求されたクレームのリストに asset クレームを動的に追加します。

このクレームは、ウォレットに filters 配列で定義された基準に一致するアセットを見つけるよう指示します。この場合、特定の trustedIssers DID によって作成されたアセットを要求しています。

Wallet Handler Setup

javascript
const { WalletHandlers } = require('@arcblock/did-connect');

const handlers = new WalletHandlers({
  authenticator: auth, // WalletAuthenticatorインスタンス
  // ... その他の設定

  onConnect: async ({ claims }) => {
    // リクエストにアセットクレームを追加
    claims.push({
      type: 'asset',
      description: 'このコンテンツにアクセスするには、VIPメンバーシップNFTを提示してください。',
      optional: false, // optionalをfalseに設定すると必須になります
      filters: [
        {
          // NFTを発行した機関のDIDに置き換えてください
          trustedIssuers: ['zNKjDm4Xsoaffb19UE6QxVeevuaTaLCS1n1S'],
        },
      ],
    });
  },

  // ... onAuthなどの他のハンドラー
});

2. 提示されたアセットの検証

ユーザーがリクエストに正常に応答した後に実行される onAuth コールバックで、要求されたアセットが提示されたことを確認する必要があります。

onAuth ペイロードの claims 配列には、ウォレットから返されたデータが含まれます。asset クレームの結果を見つけ、asset アドレスが含まれているかどうかを確認します。含まれている場合、ユーザーは所有権を証明したことになり、アクセスを許可できます。

Verifying the Wallet Response

javascript
const handlers = new WalletHandlers({
  authenticator: auth,
  // ... その他の設定

  onConnect: (req) => { /* ... as above ... */ },

  onAuth: async ({ claims, userDid }) => {
    // アセットクレームリクエストの結果を検索
    const presentedAssetClaim = claims.find(c => c.type === 'asset');

    // `asset`プロパティには、提示されたNFTのアドレスが含まれます
    if (presentedAssetClaim && presentedAssetClaim.asset) {
      console.log(`Access granted to ${userDid}.`);
      console.log(`Presented Asset Address: ${presentedAssetClaim.asset}`);

      // ここでは通常、次のことを行います。
      // 1. ユーザーのセッションを作成します。
      // 2. 保護されたコンテンツにリダイレクトします。
      return {
        status: 'ok',
        message: 'Access Granted',
      };
    }

    console.log(`Access denied for ${userDid}. Required NFT not presented.`);
    // 1. エラーをスローするか、特定のステータスを返してアクセスを拒否します。
    throw new Error('Required NFT was not presented.');
  },
});

アセットクレームのフィルタリング

filters プロパティは非常に柔軟です。さまざまな基準に基づいてアセットを要求できます。

  • address: NFT の特定のアドレス。
  • trustedIssuers: NFT を作成したエンティティの DID。
  • trustedParents: 親コレクション NFT のアドレス。

これらのフィルターを組み合わせることで、特定のイベント主催者からの特定のチケット NFT を要求するなど、アプリケーションの高度なアクセスルールを作成できます。

この例は、アプリケーションに強力で分散型のアクセス制御システムを構築するための強固な基盤を提供します。もう 1 つの一般的なユースケースについては、トランザクション支払いの例 を確認してください。