機能
圧縮NFTの更新
Last updated June 19, 2026
Summary
圧縮NFTの更新は、updateMetadataV2命令を使用してメタデータを変更します。このページでは、コレクションベースおよびツリーベースのcNFTの更新権限ルールについて説明します。
- updateMetadataV2を使用してcNFTメタデータ(名前、URI、作成者、版税)を更新する
- コレクション権限はコレクションに属するcNFTを更新する
- ツリー権限はコレクションに属さないcNFTを更新する
- 変更はマークルツリーに反映され、DAS APIプロバイダーによってインデックス化されます
updateMetadataV2に...assetWithProofを展開し、getAssetWithProof.currentMetadata(リーフ正規)を使う
updateMetadataV2命令は、圧縮NFTのメタデータを変更するために使用できます。マークルルートは、データの伝播されたハッシュを反映するように更新され、Metaplex DAS APIに準拠するRPCプロバイダーは、cNFTのインデックスを更新します。
メタデータは、圧縮NFTがコレクション内の検証されたアイテムかどうかによって、2つの権限のうちの1つによって更新できます。
更新権限
cNFTには2つの可能な更新権限があります:ツリー所有者、または(コレクションに属している場合)コレクション権限です。
コレクション権限
cNFTがコレクションに属している場合、そのcNFTの更新権限はコレクションの権限になります。cNFTを更新する際は、更新関数にcoreCollection引数を渡す必要があります。
権限は現在のumiアイデンティティから推測されます。権限が現在のumiアイデンティティと異なる場合は、authority引数をsigner型として渡すか、後で署名するためのnoopSignerを作成する必要があります。
await updateMetadataV2(umi, {
...
authority: collectionAuthority,
coreCollection: publicKey("11111111111111111111111111111111"),
}).sendAndConfirm(umi)
ツリー権限
cNFTがコレクションに属していない場合、cNFTの更新権限は、cNFTが属するツリーの権限になります。この場合、更新関数からcoreCollection引数を省略します。
権限は現在のumiアイデンティティから推測されます。権限が現在のumiアイデンティティと異なる場合は、authority引数をsigner型として渡すか、後で署名するためのnoopSignerを作成する必要があります。
cNFTの更新
圧縮NFTの更新
import {
getAssetWithProof,
updateMetadataV2,
UpdateArgsArgs,
} from '@metaplex-foundation/mpl-bubblegum'
import { some } from '@metaplex-foundation/umi'
// ヘルパーを使用してアセットと証明を取得します。
const assetWithProof = await getAssetWithProof(umi, assetId, {
truncateCanopy: true,
})
// その後、NFTのメタデータを更新するために使用できます。
const updateArgs: UpdateArgsArgs = {
name: some('新しい名前'),
uri: some('https://updated-example.com/my-nft.json'),
}
await updateMetadataV2(umi, {
...assetWithProof,
leafOwner,
updateArgs,
// オプションパラメータ。権限が現在のumiアイデンティティと
// 異なる署名者型の場合、ここでその署名者を割り当てます。
authority: <Signer>,
// オプションパラメータ。cNFTがコレクションに属している場合はここで渡します。
coreCollection: publicKey("22222222222222222222222222222222"),
}).sendAndConfirm(umi)
書き込み命令用のリーフメタデータ
getAssetWithProof は metadata(DAS 表示 / 解決料率)と currentMetadata(リーフ正規の MetadataArgsV2Args、継承時は 65535)の両方を返します。書き込みでは ...assetWithProof を展開し、表示用 metadata を currentMetadata として渡さないでください。UI には metadata / rpcAsset、継承検出には inherited を使います。
アセット読み取り時のDASレスポンスフィールドについては、継承ロイヤリティの読み取りを参照してください。
継承されたロイヤリティ
updateArgs.sellerFeeBasisPoints を some(SELLER_FEE_BASIS_POINTS_INHERIT) に設定することで、cNFTを継承ロイヤリティへ切り替えられます。コレクションには Royalties プラグインが必要で、更新後のメタデータの creators 配列は空である必要があります。
継承ロイヤリティから明示的なパーセンテージに戻すには — 例えばcNFTをコレクションから削除する前に — 希望するベーシスポイントを渡します:
1import {
2 getAssetWithProof,
3 updateMetadataV2,
4 UpdateArgsArgs,
5 mplBubblegum,
6} from '@metaplex-foundation/mpl-bubblegum'
7import { dasApi } from '@metaplex-foundation/digital-asset-standard-api'
8import { keypairIdentity, publicKey, some } from '@metaplex-foundation/umi'
9import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
10import { readFileSync } from 'fs'
11
12// getAssetWithProof calls getAsset and getAssetProof, so this needs a
13// DAS-capable RPC. The public Solana endpoints do not serve DAS methods.
14const umi = createUmi('YOUR_DAS_ENABLED_RPC_URL')
15 .use(mplBubblegum())
16 .use(dasApi())
17
18// The leaf owner or an authorised delegate must sign the update.
19const keypair = umi.eddsa.createKeypairFromSecretKey(
20 new Uint8Array(JSON.parse(readFileSync('./keypair.json', 'utf8')))
21)
22umi.use(keypairIdentity(keypair))
23
24const assetId = publicKey('YOUR_ASSET_ID')
25const collectionPublicKey = publicKey('YOUR_COLLECTION_ADDRESS')
26
27const assetWithProof = await getAssetWithProof(umi, assetId, {
28 truncateCanopy: true,
29})
30
31// Switch from inherited royalties to an explicit seller fee before removing
32// the cNFT from its collection.
33const updateArgs: UpdateArgsArgs = {
34 sellerFeeBasisPoints: some(550), // explicit 5.5%
35}
36
37// Spread includes currentMetadata (leaf-canonical). Do not pass metadata here.
38await updateMetadataV2(umi, {
39 ...assetWithProof,
40 updateArgs,
41 coreCollection: collectionPublicKey,
42}).sendAndConfirm(umi)
43
44// Leaf seller fee updated from inherit sentinel (65535) to 550 basis points
Notes
- 更新権限は、cNFTがコレクションに属しているかどうかによって異なります。コレクションcNFTはコレクション権限を使用し、スタンドアロンcNFTはツリー権限を使用します。
updateMetadataV2に...assetWithProofを展開し、リーフ正規のcurrentMetadataで検証できるようにしてください。- 更新したいフィールドには
some()を使用し、変更しないフィールドは省略します。 - 継承されたセラーフィーには、リーフレベルの空の
creators配列とRoyaltiesプラグインを持つコレクションが必要です。
FAQ
圧縮NFTのメタデータを更新できるのは誰ですか?
cNFTがコレクションに属している場合、更新できるのはコレクション権限のみです。コレクションに属していない場合、ツリー権限(ツリー作成者またはデリゲート)が更新できます。
cNFTで更新できるフィールドは何ですか?
UpdateArgsArgsで定義された名前、URI、セラーフィーベーシスポイント、その他のメタデータフィールドを更新できます。変更したいフィールドにはsome('newValue')を使用します。
更新時にコレクションを渡す必要がありますか?
はい、cNFTがコレクションに属している場合。コレクションの公開鍵とともにcoreCollectionパラメータを渡します。コレクション権限がトランザクションに署名する必要があります。
コレクションからロイヤリティを継承しているcNFTを更新するにはどうすればよいですか?
updateMetadataV2 に ...assetWithProof を展開すると、継承時は currentMetadata にオンチェーンセンチネルが入ります。継承ロイヤリティに切り替えるには updateArgs.sellerFeeBasisPoints に some(SELLER_FEE_BASIS_POINTS_INHERIT) を、離れるには明示的な数値を使います。
Glossary
| 用語 | 定義 |
|---|---|
| updateMetadataV2 | 圧縮NFTメタデータを変更するためのBubblegum V2命令 |
| コレクション権限 | MPL-Coreコレクションの更新権限。そのコレクション内のcNFTを更新する権限がある |
| ツリー権限 | コレクションに属さないcNFTを更新する権限を持つツリー作成者またはデリゲート |
| UpdateArgsArgs | どのメタデータフィールドをOptionラッパーを使用して更新するかを定義するTypeScript型 |
| currentMetadata | 既存リーフメタデータに対する updateMetadataV2 のIDL引数;...assetWithProof 展開時に getAssetWithProof.currentMetadata が供給される |
| SELLER_FEE_BASIS_POINTS_INHERIT | MPL-Coreコレクションからロイヤリティが継承されることを示すセンチネル値 65535 |
