下一代 Solana NFT 标准之Metaplex Core(“Core”)
文章目录
下一代 Solana NFT 标准之Metaplex Core(“Core”)
官方:https://developers.metaplex.com/core
一、什么是Metaplex Core(“Core”)
Metaplex Core(“Core”)摆脱了以前标准的复杂性和技术债务,为数字资产提供了一个干净简单的核心规范。与替代方案相比,下一代 Solana NFT 标准使用单一账户设计,降低了铸币成本并提高了 Solana 网络负载。它还具有灵活的插件系统,允许开发人员修改资产的行为和功能。
快来 https://core.metaplex.com/
试用 Core 的功能,并自己铸造资产!
Metaplex Core 是 Metaplex 协议中的新 NFT 标准。与其他标准(包括Metaplex令牌元数据计划)相比,它具有以下优势:
-
前所未有的成本效益:与可用的替代品相比,Metaplex Core 提供最低的铸造成本。例如,一个带有代币元数据的 .022 SOL 或带有代币扩展的 .0046 SOL 的 NFT 可以用 Core 以 .0029 SOL 的价格铸造。
-
低计算:核心操作的计算单元占用空间较小。这允许将更多的交易包含在一个区块中,而不是 205000 CU,因为铸造 Core 只需要 17000 CU。
-
单一账户设计:Core 不依赖 SPL 代币或代币扩展(又名 Token22)等可替代的代币标准,而是专注于 NFT 标准的需求。这允许 Core 只使用一个跟踪所有者的帐户。
-
强制版税:默认情况下,Core 允许强制执行版税。
-
一流的集合支持:资产可以分组到集合中。虽然这也可以通过令牌元数据实现,但在核心集合中,它们有自己的资产类,现在允许其他功能,如下所示:
- 集合级别操作:Core 允许用户在集合级别对所有资产进行更改。例如,所有收款资产都可以被冻结,或者通过单笔交易同时更改其版税详细信息!
- 高级插件支持:从内置质押到基于资产的点系统,Metaplex Core 的插件架构开辟了广阔的实用性和定制版图。插件允许开发人员通过挂钩任何资产生命周期事件(如创建、传输和刻录)来添加自定义行为。您可以将插件添加到您的资产中。例如,委托权限或添加由 DAS 自动索引的链上属性:
- 开箱即用的索引:许多支持 DAS 的 RPC 提供程序已经支持 Core。
数字资产标准 (DAS) API
数字资产标准 (DAS) API 是一个开源规范和系统,为与数字资产(代币、NFT 等)交互提供统一接口。该 API 支持同质化代币、常规 NFT 和压缩 NFT。某些方法(例如“getAssetProof”)专门用于压缩资产。
DAS API is an open specification by Metaplex to streamline access of NFTs and compressed NFTs’
RPC Providers
官方:https://developers.metaplex.com/rpc-providers
For Mainnet Beta in the picture above, from the Solana Docs, we can view the rate limits from using the mainnet api node. The Mainnet Node does not support the Metaplex DAS API currently.
对于上图中的主网 Beta,我们可以从 Solana 文档中查看使用主网 api 节点的速率限制。主网节点目前不支持 Metaplex DAS API。
我们将继续定义 RPC 节点的一些功能,然后为您提供几个选项。我们建议您根据项目需求选择一个。
RPC 的另一个显着特征是它们是否支持 Metaplex DAS API。Metaplex 数字资产标准 (DAS) API 代表了一个统一的接口,用于与 Solana 上的数字资产进行交互,支持标准(代币元数据)和压缩(泡泡糖)资产。API 定义了 RPC 实现的一组方法,以便提供资产数据。
对于开发人员来说,DAS API 需要与 cNFT 交互,但它也可以使 TM 资产的使用更轻松、更快捷。因此,在从链上读取时,我们强烈建议使用具有 DAS 支持的 RPC 节点,以尽可能快地提供用户体验。
RPCs with DAS Support
Extrnode
Helius
Hello Moon
QuickNode
Shyft
Triton
RPCs without DAS Support
Alchemy
Ankr
Blockdaemon
Chainstack
Figment
GetBlock
NOWNodes
Syndica
Extrnode:
QuickNode:
MPL Core Asset MPL 核心资产
Metaplex Core 与现有的Asset programs(如Solana’s Token program)不同,它不依赖多个账户,如关联代币账户。相反,Core将钱包和“铸币”账户之间的关系存储在资产本身中。
The Core Asset account represents the bare minimum data for a digital asset. This structure provides an unopinionated blockchain primitive for on-chain ownership.
核心资产账户代表数字资产的最低限度数据。这种结构为链上所有权提供了一个无主见的区块链原语。
我的资产在集合中吗?
MPL 核心资产可以属于集合。MPL Core Asset数据中的 updateAuthority
字段提供两项职责,要么报告资产的更新权限,要么提供它所属的 MPL Core Collection的公钥。
直接通过资产或通过 MPL 核心资产 collectionAddress 的帮助程序访问 updateAuthority
字段时,返回的结果将是以下结果之一:
- Collection:资产属于给定地址的集合。
- Address: 资产具有更新权限集,并且不属于集合。
- None: 资产未设置更新权限。
链下元数据
资产账户的一个重要属性是指向链下JSON文件的 URI 属性。这用于安全地提供额外的数据,同时不受存储链上数据所涉及的费用的限制。该 JSON 文件遵循某个标准,任何人都可以使用它来查找有关令牌的有用信息。
链下元数据可以存储在任何可公开访问的位置。托管 json 文件的热门位置包括;
- Arweave
- NFT.Storage/IPFS
- Amazon AWS S3/Google Cloud
- 亚马逊 AWS S3/谷歌云
请注意,此 JSON 文件可以使用永久存储解决方案(如 Arweave)进行存储,以确保它无法更新。此外,可以将 Update Authority
字段设置为“无”以使其不可变,因此禁止 URI 更改 and Name 属性。使用这种组合,我们可以保证链下JSON文件的不变性。
二、安装 Umi 框架
和 Core JavaScript 库
Metaplex 提供了一个 JavaScript 库,可用于与Core asset进行交互。多亏了 Umi 框架,它没有很多自以为是的依赖关系,因此提供了一个可以在任何 JavaScript 项目中使用的轻量级库。
首先,您需要安装 Umi 框架
和 Core JavaScript 库
。
npm install @metaplex-foundation/umi
npm install @metaplex-foundation/umi-bundle-defaults
npm install @solana/web3.js
npm install @metaplex-foundation/mpl-core
您应该创建实例 Umi 并像这样安装 mplCore 插件。
import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
import { mplCore } from '@metaplex-foundation/mpl-core'
// Use the RPC endpoint of your choice.
const umi = createUmi('http://127.0.0.1:8899').use(mplCore())
MetaPlex 的库和插件提供了便捷的方式来处理与 NFT 相关的元数据和交互。这段代码的主要目的是初始化和配置一个 umi实例,使其具备与 MetaPlex 相关功能的能力,以便后续可以使用 umi 实例提供的方法进行 NFT 管理和交互
操作。
然后指示 umi 使用哪个钱包。这可以是密钥对或 solana 钱包适配器。
const keypair = umi.eddsa.createKeypairFromSecretKey(bs58.decode(
privateKey
));
// Register it to the Umi client.
umi.use(keypairIdentity(keypair))
就是这样,您现在可以通过使用库提供的各种函数并将您的 umi 实例传递给它们来与核心资产和核心集合进行交互。下面是创建资产的示例:
const result = createV1(umi, {
asset: asset,
name: 'My Nft',
uri: 'https://example.com/my-nft',
}).sendAndConfirm(umi)
要获取新创建的资产的数据,您可以使用:
import { fetchAssetV1 } from '@metaplex-foundation/mpl-core'
const asset = await fetchAssetV1(umi, asset.publicKey)
console.log(asset)
关于umi
https://github.com/metaplex-foundation/umi
A Solana Framework for JS Clients.
三、功能
Creating Assets 创建资产
正如 Core 概述中所讨论的,Core 上的数字资产仅由一个链上账户和描述代币的链下数据组成。在此页面上,我们将介绍铸造这些资产的过程。
solana的设计里, nft是有一个账户,这个账户归你的账户所有, 也就是nft属于你的。
The Creation Process 创建NFT资产过程
1. 上传链下数据。
首先,我们必须确保我们的链下数据准备就绪。这意味着我们必须将 JSON 文件存储在描述我们资产的某个位置。JSON 文件的存储方式或位置无关紧要,只要可以通过 URI 访问即可。链下元数据可能看起来类似于旧的代币元数据标准。
- name 资产的名称。
- description 资产的描述。
- image 指向资产logo的 URI
- animation_url 指向资产动画的 URI。
- external_url URI 指向定义资产的外部 URL,例如游戏的主站点。
- attributes 定义资产特征的属性数组。
- trait_type (string): 属性的类型。
- value (string):该属性的值。
- properties 定义资产的其他属性。
- files (array):要包含在资产中的其他文件。
- uri (string):文件的 URI。
- type (string):文件的类型。例如 image/png ,, video/mp4 等。
- cdn(boolean,可选):是否从 CDN 提供文件。
- category(字符串):资产的媒体类别。例如 video ,, image 等。
- files (array):要包含在资产中的其他文件。
例子:
{
"name": "SolanaArtProject #1",
"description": "Generative art on Solana.",
"image": "https://arweave.net/26YdhY_eAzv26YdhY1uu9uiA3nmDZYwP8MwZAultcE?ext=jpeg",
"animation_url": "https://arweave.net/ZAultcE_eAzv26YdhY1uu9uiA3nmDZYwP8MwuiA3nm?ext=glb",
"external_url": "https://example.com",
"attributes": [
{
"trait_type": "trait1",
"value": "value1"
},
{
"trait_type": "trait2",
"value": "value2"
}
],
"properties": {
"files": [
{
"uri": "https://www.arweave.net/abcd5678?ext=png",
"type": "image/png"
},
{
"uri": "https://watch.videodelivery.net/9876jkl",
"type": "unknown",
"cdn": true
},
{
"uri": "https://www.arweave.net/efgh1234?ext=mp4",
"type": "video/mp4"
}
],
"category": "video",
}
}
2. 创建链上资产账户。
然后,我们必须创建链上资产账户来保存我们资产的数据。
链上资产账户,是通过generateSigner
随机创建的,不是钱包公钥。
关于url参数
在创建 NFT 时,URI(Uniform Resource Identifier)用于指向 NFT 的元数据。每个不同的 NFT 都应该有一个唯一的 URI,以便在区块链上标识和访问该 NFT 对应的元数据。URI 的设计通常遵循一些最佳实践和约定,这里给出一些设计上的建议:
- 唯一性:确保每个 NFT 的 URI 是唯一的。可以考虑包含 NFT 的特定标识符或哈希值来确保唯一性。
- 易于访问:URI 应该指向可以公开访问的位置,以便其他人可以查看和验证该 NFT 的元数据。通常使用 HTTPS 协议来确保安全性。
- 包含元数据信息:URI 应该直接指向包含 NFT 元数据的 JSON 文件或者类似的结构化数据。这些元数据可以包括 NFT 的名称、描述、创作者信息、图片或其他媒体文件的 URL 等。
基于以上建议,可以将您的 NFT 的 URI 设计为类似于以下格式:
https://example.com/nft-metadata/{nft-id}.json
上传链下数据
您可以使用任何存储服务(Arweave、IPFS、AWS等)上传您的链下数据,或者只是将其存储在您自己的服务器上。为了使用户 Umi 更容易使用其中一些插件,有一些专用插件,包括 Irys (uploads to Arweave)
和 nftStorage (uploads to IPFS)
等。选择插件后,这将为用户提供一个统一的界面,供您上传数据。
Fetching Assets 获取资产
要获取单个资产,可以使用fetchAsset
函数:
const asset = await fetchAsset(umi, assetAddress.publicKey, {
skipDerivePlugins: false,
})
const umi = createUmi(solanaApiUrl)
.use(mplCore());
const keypair = umi.eddsa.createKeypairFromSecretKey(bs58.decode(
privateKey
));
// Register it to the Umi client.
umi.use(keypairIdentity(keypair))
const assetSigner = generateSigner(umi)
// console.log('assetSigner: ', assetSigner)
console.log('assetSigner.publicKey: ', assetSigner.publicKey)
const mypublicKey = "6R5j1ZQaxH7ftxqzG6ord7D9i7exjB77rJmeoahGF4fu"
// 获取资产信息
async function fetchAndPrintAsset() {
try {
// 调用 fetchAsset 函数获取资产信息
const asset = await fetchAsset(umi, mypublicKey, {
skipDerivePlugins: false,
});
// 打印资产信息到控制台
console.log('资产信息:', asset);
} catch (error) {
console.error('获取资产信息失败:', error);
}
}
// 调用函数获取并打印资产信息
fetchAndPrintAsset();
获取多个资产
可以使用 getProgramAccounts
(GPA) 调用来获取多个资产,这可能非常昂贵且 RPC 速度较慢,也可以使用 API, Digital Asset Standard
速度更快,但需要特定的 RPC 提供商。
Fetch Assets By Owner 按所有者获取资产
import { publicKey } from '@metaplex-foundation/umi'
import { fetchAssetsByOwner } from '@metaplex-foundation/mpl-core'
const owner = publicKey('11111111111111111111111111111111')
const assetsByOwner = await fetchAssetsByOwner(umi, owner, {
skipDerivePlugins: false,
})
console.log(assetsByOwner)
四、插件
插件概述
生命周期
在 Core Assets 生命周期中,可以触发多个事件,例如:
- Creating 创建
- Transfering 传输
- Updating 更新
- Burning 销毁
- Add Plugin 添加插件
- Approve Authority Plugin 批准权限插件
- Remove Authority Plugin 删除权限插件
生命周期事件以各种方式影响资产,从创建到钱包之间的转移,一直到资产销毁。附加到资产级别或集合级别的插件将在这些生命周期事件期间通过验证过程运行 approve 到 、 reject 或 force approve 执行事件。
什么是插件?
插件就像您的 NFT 的链上应用程序,可以存储数据或为资产提供附加功能。
Types of Plugins 插件的类型
- Owner Managed Plugins 所有者管理插件
所有者管理插件是只有在交易中存在资产所有者签名时才能添加到核心资产的插件。 - Authority Managed Plugins 授权管理插件
- Permanent Plugins 永久插件
永久插件是只能在创建时添加到核心资产中的插件。如果资产已经存在,则无法添加永久插件。- Permanent Transfer Delegate
- Permanent Freeze Delegate
- Permanent Burn Delegate
External Plugins外部插件
什么是外部插件
外部插件由授权管理插件,由 2 个部分组成,即Adapter适配器和Plugin插件。插件适配器被分配给 Assets/Collection,并允许从外部插件传递数据和验证。外部插件为插件适配器提供数据和验证。
每个外部插件都能够将生命周期检查分配给生命周期事件,从而影响尝试发生的生命周期事件的行为。可用的生命周期检查包括:
- Create 创造
- Transfer 转移
- Update 更新
- Burn 烧
每个生命周期事件都可以通过以下检查进行分配:
- Can Listen 可以听
一个 web3 类型的 webhook,用于提醒插件生命周期事件已发生。这对于跟踪数据或根据发生的事件执行其他任务非常有用。 - Can Reject 可以拒绝
该插件能够拒绝生命周期事件操作。 - Can Approve 可以批准
该插件能够批准生命周期事件。
数据授权
外部插件有一个数据区域,项目可以在其中安全地将数据存储到该特定插件。
外部插件的数据授权(Data Authority)是唯一允许写入外部插件数据权限。插件的更新没有权限,除非他们也是数据授权(Data Authority)。
AppData 插件
什么是 AppData 插件?
AppData
外部插件存储并包含可由 dataAuthority
写入的任意数据。请注意,这与存储在ExternalRegistryRecord
中的整个插件权限不同, 它无法更新/撤销权限或更改插件的其他元数据。
将 AppData 视为一个资产的数据分区,只有特定授权才能更改和写入。
这对于第三方网站/应用程序存储在其产品/应用程序中执行某些功能所需的数据非常有用。
将 AppData 插件添加到资产
dataAuthority 插件授权
const dataAuthority = {
type: 'Address',
address: publicKey('11111111111111111111111111111111'),
}
将 AppData 插件添加到资产
import { addPlugin } from '@metaplex-foundation/mpl-core';
await addPlugin(umi, {
asset: asset, // 传入现有资产的信息
plugin: {
type: 'AppData',
dataAuthority,
schema: ExternalPluginAdapterSchema.Json,
},
});
添加插件到现有资产:
使用 addPlugin 函数向现有资产添加插件,传入以下参数:
- umi 表示当前的上下文或账户。
- asset 是一个对象,包含现有资产的信息。
- plugin 是一个对象,定义了要添加的插件的详细信息:
- type: ‘AppData’ 表示要添加的插件类型为 AppData。
- dataAuthority 是具有写入权限的实体的公钥。
- schema: ExternalPluginAdapterSchema.Json 定义了插件的数据架构为 JSON 格式。
ExternalPluginAdapterSchema
这个枚举类型定义了三种可能的插件适配器模式:Binary(二进制)、Json(JSON)、MsgPack(MessagePack)。
将数据写入 AppData 插件
只有 dataAuthority 地址可以将数据写入 AppData 插件。
要将数据写入 AppData 插件,我们将使用一个 writeData() 辅助程序,该辅助程序采用以下参数。
await writeData(umi, {
key: {
type: 'AppData',
dataAuthority,
},
authority: dataAuthoritySigner,
data: Uint8Array.from(Buffer.from(data)),
asset: asset.publicKey,
}).sendAndConfirm(umi)
五、FAQ
使用 Core 需要付费吗?
Core currently charges a very small fee of 0.0015 SOL per Asset mint to the caller. More details can be found on the Protocol Fees page.
Core 目前向调用方收取每个资产铸币厂 0.0015 SOL 的非常小的费用。更多详细信息可以在协议费用页面上找到。
原文地址:https://blog.csdn.net/inthat/article/details/140115994
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!