紹介
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例
- Cargo.tomlに
mpl-core = { version = "x.x.x", features = ["anchor"] }を追加 Account<'info, BaseAssetV1>でAssetsをデシリアライズfetch_plugin::<BaseAssetV1, PluginType>()でプラグインにアクセスCreateV2CpiBuilder、TransferV1CpiBuilderなどで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リスト構造体でBaseAssetV1とBaseCollectionV1アカウントの両方を直接デシリアライズできるようになります:
アカウントのデシリアライゼーション
#[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命令を例にしてみましょう CpiBuilderでnewを呼び出し、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 |
アカウントタイプ
| アカウント | 構造体 |
|---|---|
| Asset | BaseAssetV1 |
| Collection | BaseCollectionV1 |
| Hashed Asset | HashedAssetV1 |
| Plugin Header | PluginHeaderV1 |
| Plugin Registry | PluginRegistryV1 |
FAQ
anchorフィーチャーフラグは必要ですか?
はい、Accounts構造体での直接デシリアライゼーションには必要です。なしの場合は、from_bytes()を手動で使用します。
プラグインが存在するかどうかを確認するにはどうすればよいですか?
Optionを返すfetch_plugin()を使用します。プラグインが存在しない場合でもエラーをスローしません。
外部プラグイン(Oracle、AppData)にアクセスできますか?
はい。適切なキーでfetch_plugin()の代わりにfetch_external_plugin()を使用します。
利用可能なすべての命令はどこで見つけられますか?
mpl-core docs.rs命令モジュールを参照してください。
用語集
| 用語 | 定義 |
|---|---|
| CPI | Cross-Program Invocation - あるプログラムから別のプログラムを呼び出すこと |
| CpiBuilder | CPI呼び出しを構築するためのヘルパー構造体 |
| BaseAssetV1 | デシリアライゼーション用のCore Assetアカウント構造体 |
| fetch_plugin() | アカウントからプラグインデータを読み取る関数 |
| anchorフィーチャー | Anchorネイティブデシリアライゼーションを有効にするCargoフィーチャー |
関連ページ
- Anchorステーキング例 - 完全なステーキングプログラム
- AnchorでAssetを作成 - ステップバイステップガイド
- Rust SDK - スタンドアロンRustクライアントの使用方法
- mpl-core docs.rs - 完全なAPIリファレンス
