JavascriptでCore NFT Assetを作成する方法
Last updated January 31, 2026
このガイドでは、@metaplex-foundation/mpl-core Javascript SDKパッケージを使用して、Metaplex CoreオンチェーンプログラムでCore NFT Assetを作成する方法を示します。
Coreとは?
Coreはシングルアカウント設計を使用し、代替ソリューションと比較してミントコストを削減し、Solanaネットワーク負荷を改善します。また、開発者がアセットの動作と機能を変更できる柔軟なプラグインシステムを持っています。
始める前に、Assetsについて説明しましょう:
Assetとは?
SolanaのTokenプログラムなどの既存のAssetプログラムとは異なり、Metaplex CoreとCore NFT Assets(Core NFT Assetsとも呼ばれる)は、Associated Token Accountsのような複数のアカウントに依存しません。代わりに、Core NFT Assetsはウォレットと「ミント」アカウント間の関係をアセット自体の中に保存します。
前提条件
- お好みのコードエディタ(Visual Studio Codeを推奨)
- Node 18.x.x以上。
初期設定
このガイドでは、単一ファイルスクリプトに基づいてJavascriptでNFT Core Assetを作成する方法を教えます。ニーズに合わせて関数を変更・移動する必要があるかもしれません。
初期化
お好みのパッケージマネージャー(npm、yarn、pnpm、bun)で新しいプロジェクトを初期化し(オプション)、プロンプトが表示されたら必要な詳細を入力します。
npm init
必要なパッケージ
このガイドに必要なパッケージをインストールします。
npm i @metaplex-foundation/umi
npm i @metaplex-foundation/umi-bundle-defaults
npm i @metaplex-foundation/mpl-core
npm i @metaplex-foundation/umi-uploader-irys;
インポートとラッパー関数
ここでは、このガイドに必要なすべてのインポートを定義し、すべてのコードを実行するラッパー関数を作成します。
import { create, mplCore } from '@metaplex-foundation/mpl-core'
import {
createGenericFile,
generateSigner,
signerIdentity,
sol,
} from '@metaplex-foundation/umi'
import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
import { irysUploader } from '@metaplex-foundation/umi-uploader-irys'
import { base58 } from '@metaplex-foundation/umi/serializers'
import fs from 'fs'
import path from 'path'
// ラッパー関数を作成
const createNft = async () => {
///
///
/// すべてのコードはここに記述
///
///
}
// ラッパー関数を実行
createNft()
Umiの設定
Umiを設定する際、さまざまなソースからキーペア/ウォレットを使用または生成できます。テスト用に新しいウォレットを作成したり、ファイルシステムから既存のウォレットをインポートしたり、ウェブサイト/dAppを作成する場合はwalletAdapterを使用できます。 注意: この例ではgeneratedSigner()でUmiを設定しますが、以下のすべての設定方法を見つけることができます!
注意: walletAdapterセクションは、walletAdapterがすでにインストールされセットアップされていることを前提として、Umiに接続するために必要なコードのみを提供します。包括的なガイドについては、こちらを参照してください。
Assetのメタデータの作成
ウォレットやExplorerでAssetの認識可能な画像を表示するには、メタデータを保存するURIを作成する必要があります!
画像のアップロード
Umiには、Arweave、NftStorage、AWS、ShdwDriveなどのストレージソリューションにアップロードできるダウンロード可能なストレージプラグインが付属しています。このガイドでは、Arweaveにコンテンツを保存するirysUploader()プラグインを使用します。 この例では、Irysを使用してArweaveにアップロードするローカルアプローチを使用します。ブラウザから別のストレージプロバイダーにファイルをアップロードしたい場合は、別のアプローチが必要です。ブラウザシナリオではfsのインポートと使用は機能しません。
import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
import { irysUploader } from '@metaplex-foundation/umi-uploader-irys'
import fs from 'fs'
import path from 'path'
// Umiを作成しIrysを使用するよう指示
const umi = createUmi('https://api.devnet.solana.com')
.use(irysUploader())
// `fs`を使用して文字列パスでファイルを読み込む
// コンピューティングの観点からパスの概念を理解する必要があります。
const imageFile = fs.readFileSync(
path.join(__dirname, '..', '/assets/my-image.jpg')
)
// `createGenericFile`を使用してファイルをumiが理解できる`GenericFile`型に変換
// mimeタグタイプを正しく設定しないとArweaveは画像を表示する方法がわかりません。
const umiImageFile = createGenericFile(imageFile, 'my-image.jpeg', {
tags: [{ name: 'Content-Type', value: 'image/jpeg' }],
})
// ここでIrys経由でArweaveに画像をアップロードし、
// ファイルが配置されているuriアドレスが返されます。
// これをログ出力できますが、uploaderはファイルの配列を受け取るため
// uriの配列も返します。
// 欲しいuriを取得するには配列のインデックス[0]を呼び出します。
const imageUri = await umi.uploader.upload([umiImageFile]).catch((err) => {
throw new Error(err)
})
console.log(imageUri[0])
メタデータのアップロード
有効で動作する画像URIができたら、アセットのメタデータの作成を開始できます。 ファンジブルトークンのオフチェーンメタデータの標準は以下の通りです。これはJavascript内のオブジェクト{}に記述するか、metadata.jsonファイルに保存する必要があります。 JavaScriptオブジェクトアプローチを見ていきます。
const metadata = {
name: 'My NFT',
description: 'This is an NFT on Solana',
image: imageUri[0],
external_url: 'https://example.com',
attributes: [
{
trait_type: 'trait1',
value: 'value1',
},
{
trait_type: 'trait2',
value: 'value2',
},
],
properties: {
files: [
{
uri: imageUri[0],
type: 'image/jpeg',
},
],
category: 'image',
},
}
ここのフィールドには以下が含まれます:
| フィールド | 説明 |
|---|---|
| name | NFTの名前。 |
| description | NFTの説明。 |
| image | 以前アップロードしたimageUri(または画像のオンライン上の場所)に設定されます。 |
| animation_url | アップロードしたanimation_url(またはビデオ/glbのオンライン上の場所)に設定されます。 |
| external_url | 選択した外部アドレスにリンクします。通常はプロジェクトのウェブサイトです。 |
| attributes | {trait_type: value, "value": "value1"}のオブジェクトを使用 |
| properties | {uri: string, type: mimeType}の[] arrayを取るfilesフィールドを含みます。また、image、audio、video、vfx、htmlに設定できるカテゴリフィールドも含みます |
メタデータを作成したら、Collectionにアタッチするためのuriを取得するためにJSONファイルとしてアップロードする必要があります。これを行うには、UmiのuploadJson()関数を使用します: |
// Umiの`uploadJson()`関数を呼び出してIrys経由でArweaveにメタデータをアップロード
const metadataUri = await umi.uploader.uploadJson(metadata).catch((err) => {
throw new Error(err)
})
この関数は、アップロード前にJavaScriptオブジェクトを自動的にJSONに変換します。 これで、エラーがスローされなければ、metadataUriにJSONファイルのURIが最終的に保存されているはずです。
NFT Core Assetのミント
ここから、@metaplex-foundation/mpl-coreパッケージのcreate関数を使用してCore NFT Assetを作成できます。
const asset = generateSigner(umi)
const tx = await create(umi, {
asset,
name: 'My NFT',
uri: metadataUri,
}).sendAndConfirm(umi)
const signature = base58.deserialize(tx.signature)[0]
そして、以下のように詳細をログ出力します:
// 署名とトランザクションとNFTへのリンクをログ出力
console.log('\nNFT Created')
console.log('View Transaction on Solana Explorer')
console.log(`https://explorer.solana.com/tx/${signature}?cluster=devnet`)
console.log('\n')
console.log('View NFT on Metaplex Explorer')
console.log(`https://core.metaplex.com/explorer/${nftSigner.publicKey}?env=devnet`)
追加アクション
続ける前に、FreezeDelegateプラグインやAppData外部プラグインなど、プラグインや外部プラグインがすでに含まれたアセットを作成したい場合はどうすればよいでしょうか?以下にその方法を示します。 create()命令は、pluginsフィールドを通じて通常のプラグインと外部プラグインの両方の追加をサポートしています。特定のプラグインに必要なすべてのフィールドを簡単に追加するだけで、すべてが命令によって処理されます。 以下はその方法の例です:
const asset = generateSigner(umi)
const tx = await create(umi, {
asset,
name: 'My NFT',
uri: metadataUri,
plugins: [
{
type: "PermanentFreezeDelegate",
frozen: true,
authority: { type: "UpdateAuthority"}
},
{
type: "AppData",
dataAuthority: { type: "UpdateAuthority"},
schema: ExternalPluginAdapterSchema.Binary,
}
]
}).sendAndConfirm(umi)
const signature = base58.deserialize(tx.signature)[0]
注意: 使用するフィールドとプラグインがわからない場合は、ドキュメントを参照してください!
