紹介

AnchorでMetaplex Coreを使用する

Last updated January 31, 2026

Anchorを使用してCore Assetsと対話するオンチェーンプログラムを構築します。このガイドでは、インストール、アカウントのデシリアライゼーション、プラグインアクセス、CPIパターンについて説明します。

学べること

  • AnchorプロジェクトでのMpl-coreのインストールと設定
  • プログラムでのCore AssetsとCollectionsのデシリアライズ
  • プラグインデータ(Attributes、Freezeなど)へのアクセス
  • Assetsの作成、転送、管理のためのCPI呼び出し

概要

mpl-core Rustクレートは、AnchorプログラムからCoreと対話するために必要なすべてを提供します。ネイティブAnchorアカウントのデシリアライゼーションのためにanchorフィーチャーフラグを有効にします。

  • features = ["anchor"]付きでmpl-coreを追加
  • Accounts構造体でAssets/Collectionsをデシリアライズ
  • fetch_plugin()を使用してプラグインデータを読み取り
  • CPIビルダーが命令呼び出しを簡素化

対象外

クライアントサイドJavaScript SDK(JavaScript SDKを参照)、スタンドアロンRustクライアント(Rust SDKを参照)、およびクライアントからのCore Assetsの作成。

クイックスタート

ジャンプ先: インストール · アカウントのデシリアライゼーション · プラグインアクセス · CPI例

  1. Cargo.tomlにmpl-core = { version = "x.x.x", features = ["anchor"] }を追加
  2. Account<'info, BaseAssetV1>でAssetsをデシリアライズ
  3. fetch_plugin::<BaseAssetV1, PluginType>()でプラグインにアクセス
  4. CreateV2CpiBuilderTransferV1CpiBuilderなどでCPI呼び出し

インストール

AnchorプロジェクトでCoreの使用を開始するには、まず以下を実行してプロジェクトに最新バージョンのクレートを追加していることを確認してください:

cargo add mpl-core

または、cargo.tomlファイルでバージョンを手動で指定することもできます:

[dependencies]
mpl-core = "x.x.x"

フィーチャーフラグ

Coreクレートでは、cargo.tomlの依存関係エントリを変更することで、mpl-coreクレートのanchorフィーチャーフラグを有効にしてAnchor固有の機能にアクセスできます:

[dependencies]
mpl-core = { version = "x.x.x", features = [ "anchor" ] }

Core Rust SDKモジュール

Core Rust SDKはいくつかのモジュールで構成されています:

  • accounts: プログラムのアカウントを表します
  • errors: プログラムのエラーを列挙します
  • instructions: 命令、命令引数、CPI命令の作成を容易にします
  • types: プログラムで使用される型を表します 異なる命令がどのように呼び出され、使用されるかの詳細については、mpl-core docs.rsウェブサイトを参照するか、命令上でcmd + 左クリック(mac)またはctrl + 左クリック(windows)を使用して展開できます。

アカウントのデシリアライゼーション

デシリアライズ可能なアカウント

以下のアカウント構造体は、mpl-coreクレート内でデシリアライゼーションに使用できます:

- BaseAssetV1
- BaseCollectionV1
- HashedAssetV1
- PluginHeaderV1
- PluginRegistryV1

Anchor内でCoreアカウントをデシリアライズするには2つの方法があります。

  • AnchorのAccountリスト構造体を使用(ほとんどの場合に推奨)
  • <Account>::from_bytes()を使用して命令関数の本体内で直接

Anchor Accountsリストメソッド

anchorフラグを有効にすることで、Anchor Accountsリスト構造体でBaseAssetV1BaseCollectionV1アカウントの両方を直接デシリアライズできるようになります:

アカウントのデシリアライゼーション

#[derive(Accounts)]
pub struct ExampleAccountStruct<'info> {
...
pub asset: Account<'info, BaseAssetV1>,
}

Account from_bytes()メソッド

try_borrow_data()関数を使用してアセット/コレクションアカウント内のデータを借用し、それらのバイトからアセット/コレクション構造体を作成します:

アカウントのデシリアライゼーション

let data = ctx.accounts.asset.try_borrow_data()?;
let base_asset: BaseAssetV1 = BaseAssetV1::from_bytes(&data.as_ref())?;

プラグインのデシリアライズ

AssetまたはCollectionアカウント内の個々のプラグインにアクセスするには、fetch_plugin()関数を使用します。この関数は、プラグインデータを返すか、ハードエラーをスローせずにnullレスポンスを返すため、データにアクセスせずにプラグインが存在するかどうかを確認できます。 fetch_plugin()関数は、AssetsとCollectionsアカウントの両方に使用でき、適切な型を指定することですべてのプラグインタイプを処理できます。プラグイン内のデータにアクセスする場合は、この関数が返す中間値を使用します。

プラグインのデシリアライゼーション

let (_, attribute_list, _) = fetch_plugin::<BaseAssetV1, Attributes>(&ctx.accounts.asset.to_account_info(), mpl_core::types::PluginType::Attributes)?;

注意: fetch_plugin()関数は非外部プラグインにのみ使用されます。外部プラグインを読み取るには、fetch_plugin()と同じ方法で動作するfetch_external_plugin()関数を使用します。

CPI命令ビルダー

Coreクレートの各命令にはCpiBuilderバージョンが付属しています。CpiBuilderバージョンは命令の名前 + CpiBuilderを使用して作成され、多くのボイラープレートコードを抽象化してコードを大幅に簡素化します! Coreで利用可能なすべての命令について詳しく知りたい場合は、mpl-core docs.rsウェブサイトで見つけることができます。

CPIの例

CreateCollectionV2CpiBuilder命令を例にしてみましょう CpiBuildernewを呼び出し、CoreプログラムをAccountInfoとして渡すことでビルダーを初期化します:

CreateCollectionV2CpiBuilder::new(ctx.accounts.mpl_core_program.to_account_info);

次に、Cmd + 左クリック(Windowsユーザーの場合はCtrl + 左クリック)を使用して、このCPI呼び出しに必要なすべてのCPI引数を表示します:

CreateCollectionV2CpiBuilder::new(&ctx.accounts.core_program)
.collection(&ctx.accounts.collection)
.payer(&ctx.accounts.payer)
.system_program(&ctx.accounts.system_program)
.name("Test Collection".to_string())
.uri("https://test.com".to_string())
.invoke()?;

一般的なエラー

AccountNotInitialized

AssetまたはCollectionアカウントが存在しないか、まだ作成されていません。

PluginNotFound

取得しようとしているプラグインがAssetに存在しません。安全にNoneを返すfetch_plugin()で確認してください。

InvalidAuthority

署名者がこの操作の権限を持っていません。正しい権限が署名していることを確認してください。

注意事項

  • ネイティブデシリアライゼーションのために常にfeatures = ["anchor"]を有効にする
  • 組み込みプラグインにはfetch_plugin()を、外部にはfetch_external_plugin()を使用
  • CPIビルダーがアカウント順序の複雑さを抽象化
  • 完全なAPIリファレンスはdocs.rs/mpl-coreを確認

クイックリファレンス

一般的なCPIビルダー

操作CPIビルダー
Assetの作成CreateV2CpiBuilder
Collectionの作成CreateCollectionV2CpiBuilder
Assetの転送TransferV1CpiBuilder
AssetのバーンBurnV1CpiBuilder
Assetの更新UpdateV1CpiBuilder
プラグインの追加AddPluginV1CpiBuilder
プラグインの更新UpdatePluginV1CpiBuilder

アカウントタイプ

アカウント構造体
AssetBaseAssetV1
CollectionBaseCollectionV1
Hashed AssetHashedAssetV1
Plugin HeaderPluginHeaderV1
Plugin RegistryPluginRegistryV1

FAQ

anchorフィーチャーフラグは必要ですか?

はい、Accounts構造体での直接デシリアライゼーションには必要です。なしの場合は、from_bytes()を手動で使用します。

プラグインが存在するかどうかを確認するにはどうすればよいですか?

Optionを返すfetch_plugin()を使用します。プラグインが存在しない場合でもエラーをスローしません。

外部プラグイン(Oracle、AppData)にアクセスできますか?

はい。適切なキーでfetch_plugin()の代わりにfetch_external_plugin()を使用します。

利用可能なすべての命令はどこで見つけられますか?

mpl-core docs.rs命令モジュールを参照してください。

用語集

用語定義
CPICross-Program Invocation - あるプログラムから別のプログラムを呼び出すこと
CpiBuilderCPI呼び出しを構築するためのヘルパー構造体
BaseAssetV1デシリアライゼーション用のCore Assetアカウント構造体
fetch_plugin()アカウントからプラグインデータを読み取る関数
anchorフィーチャーAnchorネイティブデシリアライゼーションを有効にするCargoフィーチャー

関連ページ