アセットクレームは、非代替性トークン(NFT)などの特定のオンチェーンデジタルアセットの所有権証明をユーザーに要求するために使用されます。これは、特定のアセットの所有者にサービスやコンテンツへのアクセスを制限する、NFTゲートアクセスのようなシナリオで特に役立ちます。
このクレームにより、アプリケーションはアセットのアドレス、発行者、または親コレクションなどのさまざまな基準を指定して、アセットの所有権を検証できます。
アセットまたは検証可能な資格情報のいずれかを受け入れることができるより一般的なリクエストについては、アセットまたはVCクレームを参照してください。
仕組み
アセットクレームを要求すると、DID Connectはユーザーにウォレットから適格なアセットを選択するよう促します。ウォレットは、クレームリクエストで定義した基準に基づいてユーザーのアセットをフィルタリングします。ユーザーが有効なアセットを選択して提示すると、アプリケーションはその詳細を検証のために受け取ります。
パラメータ
asset クレームは、次のプロパティを持つオブジェクトを使用して設定されます。リクエストの中核は filters 配列で、これにより1つ以上の基準セットを定義できます。
| Parameter | Type | Description |
|---|---|---|
description | string | **必須。**アセットを提示する必要がある理由をユーザーに説明するために表示されるメッセージ。 |
optional | boolean | true の場合、ユーザーはこのクレームをスキップできます。デフォルトは false です。 |
filters | Array<Object> | フィルターオブジェクトの配列。ウォレットは、フィルターの いずれか に一致するアセットを見つけます(ORロジック)。 |
acquireUrl | string | ユーザーがまだ必要なアセットを所有していない場合に、それを取得するためのオプションのURL。 |
フィルターオブジェクトのプロパティ
filters 配列内の各オブジェクトには、次のプロパティを含めることができます。単一のフィルター内のすべてのプロパティは、ANDロジックで結合されます。
| Property | Type | Description |
|---|---|---|
address | string | アセットの特定のDIDアドレス。 |
trustedIssuers | Array<string | Object> | 信頼できるアセット発行者のDIDのリスト。発行者は、単純なDID文字列またはオブジェクト { did: string, endpoint: string } にすることができます。 |
trustedParents | Array<string> | 信頼できる親アセットのDIDのリスト。これは、NFTが特定のコレクションに属しているかどうかを確認するためによく使用されます。 |
tag | string | アセットに関連付けられている必要がある特定のタグ。 |
ownerDid | Array<string> | DIDの配列。アセットの所有者は、このリスト内のDIDのいずれかである必要があります。 |
consumed | boolean | アセットが消費済み(true)か未消費(false)の状態でなければならないかを指定します。 |
アセットのリクエスト
以下は、オーセンティケーターに渡される claims オブジェクト内で asset クレームリクエストを構造化する方法のいくつかの例です。
例1:NFTコレクションによるアクセスゲート
この例では、親が特定のNFTコレクションDIDである任意のアセットを要求します。これは、特定のNFTプロジェクトの所有者にアクセスを許可する一般的な方法です。
Requesting an NFT from a specific collection
const claims = {
asset: {
description: 'Please present your Membership NFT to access the private community.',
filters: [
{
// NFTコレクションの親DID
trustedParents: ['zNKjDm4Xsoaffb19UE6QxVeevuaTaLCS1n1S'],
},
],
acquireUrl: 'https://example.com/mint-nft',
},
};
// ルートハンドラー内
const { authInfo } = await authenticator.sign({ context, claims });例2:アドレスによる特定のアセットのリクエスト
ユーザーに非常に特定のアセットを提示してもらう必要がある場合は、その一意のアドレスでフィルタリングできます。
Requesting a specific asset by its address
const claims = {
asset: {
description: 'Please present your Golden Ticket NFT to proceed.',
filters: [
{
// ゴールデンチケットNFTの一意のDIDアドレス
address: 'zjddPDAK5rm1E4syjTkgoiskGBAfve5YYN2s',
},
],
},
};例3:複数のフィルターの使用
複数のフィルターオブジェクトを提供して、ユーザーにより多くの選択肢を与えることができます。この例では、ユーザーは信頼できる発行者のアセットまたは信頼できるコレクションのアセットのいずれかを提示できます。
Using multiple filters for more flexibility
const claims = {
asset: {
description: 'Present an asset from our official issuer or a partner collection.',
optional: true, // これをオプションにする
filters: [
{
// オプション1:信頼できる発行者のアセット
trustedIssuers: ['zNKjDm4Xsoaffb19UE6QxVeevuaTaLCS1n1S'],
tag: 'official-badge',
},
{
// オプション2:パートナーNFTコレクションのアセット
trustedParents: ['z9f9aE3E6d4c4b2A1c8f8b6e2d0F0g2H2i4j6k8m'],
},
],
},
};ウォレットのレスポンス
ユーザーが有効なアセットを正常に提示した場合、ハンドラーの onAuth または onConnect コールバックがアセットの詳細を受け取ります。提示されたアセットは、セッションコンテキストの claims 配列に含まれます。
次のようにアクセスできます:
Handling the wallet response
const handlers = new WalletHandlers({
authenticator,
// ...他のハンドラー
onAuth: async (req, res) => {
const { userDid, claims } = req.context.did_connect;
// レスポンスで提示されたアセットクレームを見つける
const presentedAsset = claims.find(x => x.type === 'asset');
if (presentedAsset) {
console.log(`User ${userDid} presented asset:`, presentedAsset.asset);
// `presentedAsset.asset` には、提示されたNFTの完全な詳細が含まれます
// 例:アドレス、発行者、所有者など
} else {
console.log('User did not present the required asset.');
}
res.redirect('/profile');
},
});次に、ユーザーの属性を検証するもう1つの強力な方法である、検証可能な資格情報を要求する方法を探ります。