尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Substrate NFTs Pallet 深度指南:从 Collection 创建到原子交换的完整实现

发布时间:2026/9/26 8:17:01

资讯中心
01
ARTICLE

Substrate NFTs Pallet 深度指南:从 Collection 创建到原子交换的完整实现

Substrate NFTs Pallet 深度指南:从 Collection 创建到原子交换的完整实现
区块链开发框架后端【免费下载链接】substrateSubstrate: The platform for blockchain innovators项目地址https://gitcode.com/gh_mirrors/su/substrate点击查看免费下载本指南以 Substrate 仓库中 frame/nfts/README.md 为骨架深入剖析pallet-nfts的功能设计、权限模型、配置参数与全部 dispatchable 调用并辅以源码级佐证如 lib.rs、types.rs、mock.rs帮助开发者理解如何在 Runtime 中集成 NFT 能力以及如何通过 FRAME 特性启用或禁用交易、属性、审批与原子交换等模块化功能。一、Pallet 概览非同质化资产的一站式管理pallet-nfts是 Substrate FRAME 体系中负责处理**非同质化资产Non-Fungible Assets**的核心模块。它提供了 NFT 全生命周期管理能力涵盖Collection 创建Collection Creation创建新的 NFT 集合NFT 铸造Minting在集合内铸造新的物品ItemNFT 转移与原子交换Transfers and Atomic Swaps物品在账户间流转以及无需第三方即可完成的以物易物NFT 交易方法Trading Methods定价、出售、购买、小费支付等交易机制属性管理Attributes Management为集合或物品附加键值属性如链上元数据、游戏状态NFT 销毁Burning彻底销毁物品。从代码结构看frame/nfts/src/lib.rs 通过#[frame_support::pallet]声明了主 Pallet 结构PalletT, I ()并设置了STORAGE_VERSION StorageVersion::new(1)用于链上升级迁移frame/nfts/Cargo.toml 中pallet-nfts依赖frame-support、frame-system、sp-runtime等 FRAME 核心组件编译为 Wasm 时通过no_std支持 Runtime 内嵌。二、术语速览先弄清这些概念术语含义Collection 创建创建一个新的 NFT 集合CollectionNFT 铸造在集合中创建新物品Item的动作NFT 转移将物品从一个账户发送到另一个账户原子交换在无需第三方服务的情况下账户之间直接交换物品NFT 销毁销毁一个物品非同质化代币NFT每个单元都具有唯一特征、全世界仅存在一个实例、且只有一个持有账户该持有账户可以是代理账户或多签账户的物品灵魂绑定 NFTSoul Bound NFT铸造后即与持有账户绑定、不可转移的物品从源码看灵魂绑定与可转移性是通过位标记bitflags实现的types.rs 中CollectionSetting枚举包含TransferableItems集合内物品可转移、UnlockedMetadata、UnlockedAttributes、UnlockedMaxSupply、DepositRequired等开关物品级则由 types.rs 的ItemSettingTransferable、UnlockedMetadata、UnlockedAttributes控制。lock_collection把集合整体设置为不可转移等价于让集合内所有物品都变成 soul bound。三、设计目标Pallet 想解决的问题从 frame/nfts/README.md 的 Goals 章节可以看出该 Pallet 被设计用来实现以下能力允许账户无许可地创建 NFT 集合允许指定的有权限的账户在集合内铸造与销毁独特物品物品可在账户间无许可地转移允许指定账户冻结/解冻集合内某个物品或整个集合的转移允许物品所有者将转移权限委托给指定的第三方允许第三方在不拥有该 NFT 的情况下向其中存储信息例如保存游戏状态。最后一条不持有即可写入信息的目标正是属性系统与approve_item_attributes委托机制的存在意义游戏服务器可以为玩家物品写入状态属性而无需真正转移所有权。四、在 Runtime 中接入实现nfts::Config要使用该 Pallet需要为 Runtime 实现nfts::Configtrait。以下为测试环境 mock.rs 中的完整配置实现可作为集成参考impl Config for Test { type RuntimeEvent RuntimeEvent; type CollectionId u32; type ItemId u32; type Currency Balances; type CreateOrigin AsEnsureOriginWithArgframe_system::EnsureSignedSelf::AccountId; type ForceOrigin frame_system::EnsureRootSelf::AccountId; type Locker (); type CollectionDeposit ConstU642; type ItemDeposit ConstU641; type MetadataDepositBase ConstU641; type AttributeDepositBase ConstU641; type DepositPerByte ConstU641; type StringLimit ConstU3250; type KeyLimit ConstU3250; type ValueLimit ConstU3250; type ApprovalsLimit ConstU3210; type ItemAttributesApprovalsLimit ConstU322; type MaxTips ConstU3210; type MaxDeadlineDuration ConstU6410000; type MaxAttributesPerCall ConstU322; type Features Features; type OffchainSignature Signature; type OffchainPublic AccountPublic; type WeightInfo (); #[cfg(feature runtime-benchmarks)] type Helper (); }各关联类型与常量的作用如下关联类型/常量作用依据 lib.rs 源码注释CollectionId集合标识符类型需实现Incrementable。若实现返回None则create/force_create的自动 ID 生成不可用应改用手动指定 ID 的函数ItemId集合内唯一物品标识符类型Currency用于押金reserve支付的货币机制需实现ReservableCurrencyForceOrigin可强制创建/销毁物品或修改特权属性的来源CreateOrigin标准集合创建时发起者与该集合必须满足的校验带CollectionId参数的 Origin 校验Locker在下游启用锁定机制的LockertraitCollectionDeposit创建集合必须预留的基础押金ItemDeposit持有物品必须预留的基础押金MetadataDepositBase添加元数据时需预留的基础押金AttributeDepositBase添加属性时需预留的基础押金DepositPerByte元数据/属性按字节计费的额外押金StringLimit链上存储数据的最大长度KeyLimit/ValueLimit属性键/值的最大长度ApprovalsLimit单个物品最多可拥有的转移审批数ItemAttributesApprovalsLimit单个物品最多可拥有的属性审批数MaxTips单次调用最多可发送的小费条数MaxDeadlineDuration截止时间deadline的最大区块数跨度MaxAttributesPerCall单次调用最多可设置的属性数Features用PalletFeatures位标记禁用部分功能详见下文模块化特性开关OffchainSignature/OffchainPublic离线签名类型与公钥用于mint_pre_signed等预签名流程的验签WeightInfo各 extrinsic 的重量信息此外Cargo.toml 提供了runtime-benchmarks基准测试与try-runtime运行时迁移测试两个可选 feature分别引入frame-benchmarking与相关测试支持。五、Dispatchable 调用全景按权限分级Pallet 支持的 dispatchable 函数完整定义在nfts::Call枚举中。下面按原 README 的四级权限体系逐一展开并补充源码中的关键行为。5.1 无许可Permissionlessdispatchables——任何签名账户都可调用函数行为依据 lib.rs 实现create通过押金创建新集合admin 是集合管理团队的初始成员CollectionDeposit资金被预留lib.rsmint在公开铸造public minting模式下于集合内铸造新物品会校验mint_settings的起止区块与类型lib.rstransfer将物品发送给新所有者调用者必须是物品所有者或已获批准的委托账户lib.rsredeposit重新评估若干物品的押金可能释放资金仅在物品押金高于当前应缴金额时解除预留lib.rsapprove_transfer指定可授权转移的委托账户可附带以区块数计的截止期限lib.rscancel_approval撤销此前approve_transfer的效果lib.rsapprove_item_attributes指定可修改物品属性在某个命名空间内的委托账户lib.rscancel_item_attributes_approval撤销此前approve_item_attributes同时清除该委托此前设置的所有属性lib.rsset_price为物品设定价格可传入None清除价格并可指定白名单买家lib.rsbuy_item购买物品出价须不低于标价且购买者不能是物品所有者lib.rspay_tips支付小费可用于向创作者支付版税小费条数受MaxTips限制lib.rscreate_swap创建以物易物要约声明用某物品交换指定物品可附加价格与区块数期限lib.rscancel_swap取消此前创建的交换要约lib.rsclaim_swap以原子方式完成交换需提供双方物品信息与事先商定的价格见证lib.rs说明mint在 README 中被归为无许可但其实际可铸造类型取决于集合的MintSettingsMintType::Public时任何人可铸造MintType::Issuer时仅限 IssuerMintType::HolderOf(collection_id)时仅限持有指定集合物品的账户并借助PalletAttributes::UsedToClaim防止重复领取见 lib.rs。5.2 有许可Permissioneddispatchables——需要集合角色或治理来源函数权限要求与行为依据 lib.rs 实现destroy销毁集合及其全部物品并退还押金。集合须为空或提供DestroyWitness见证item_metadatas / item_configs / attributes 数量否则报WitnessRequired/BadWitnesslib.rsforce_mint强制在集合内铸造物品调用者须为ForceOrigin或集合 Issuerlib.rsburn销毁集合内某个物品调用者须为ForceOrigin或物品所有者lib.rslock_item_transfer阻止单个物品转移调用者须为集合 Freezerlib.rsunlock_item_transfer恢复单个物品的可转移性调用者须为 Freezerlib.rsclear_all_transfer_approvals清除某个物品上通过approve_transfer设置的全部转移审批lib.rslock_collection阻止集合内所有物品转移等价于让全部物品变为 soul bound可同时锁定其他集合设置且只能锁定不能解锁lib.rslock_item_properties锁定物品的元数据或属性lock_attributes仅影响CollectionOwner命名空间的属性锁定后不可逆lib.rstransfer_ownership更改集合所有者并转移相关押金单个物品的所有权不受影响新所有者须先调用set_accept_ownership表达接受意愿lib.rsset_team更改集合的权限账户团队Issuer / Admin / Freezer将某角色设为None后只有ForceOrigin能再次修改lib.rsset_collection_max_supply修改集合的最大供应量受UnlockedMaxSupply设置约束lib.rsupdate_mint_settings更新集合的铸造设置铸造类型、价格、起止区块、默认物品设置lib.rs从源码看集合的三种角色定义在 types.rsIssuer可铸造、Freezer可冻结、Admin可解冻、强制转移、销毁任意账户的物品角色位标记由CollectionRoleOf存储映射维护lib.rs。5.3 元数据Metadatadispatchables——集合与物品的链上信息函数行为依据 lib.rs 实现set_attribute为物品或集合设置属性键值对。命名空间规则CollectionOwner仅限集合 Admin 修改ItemOwner仅限物品所有者Account(AccountId)需获得授权。押金公式AttributeDepositBase DepositPerByte * (key.len value.len)lib.rsclear_attribute移除物品或集合的某个属性押金退还lib.rsset_metadata设置物品的通用元数据例如 IPFS 地址形式的图片 URL长度受StringLimit限制押金公式MetadataDepositBase DepositPerByte * data.lenlib.rsclear_metadata移除物品的通用元数据lib.rsset_collection_metadata设置集合的通用元数据lib.rsclear_collection_metadata移除集合的通用元数据lib.rs元数据与属性数据的类型定义位于 types.rsCollectionMetadata/ItemMetadata均包含deposit押金与data受StringLimit约束的BoundedVecu8AttributeNamespace定义了四种命名空间Pallet、CollectionOwner、ItemOwner、Account(AccountId)见 types.rs。5.4 Force治理dispatchables——ForceOrigin专用函数行为依据 lib.rs 实现force_create创建新集合集合 ID 不可手动选择由NextCollectionId递增生成且不预留任何押金lib.rsforce_collection_owner更改集合的所有者无需新所有者预先接受lib.rsforce_collection_config更改集合的配置含集合设置、最大供应量、铸造设置lib.rsforce_set_attribute强制设置属性若属性已由其他账户设置押金将退还原设置者lib.rs另有set_accept_ownership签名账户表达/取消对某集合所有权的接受意愿lib.rs等辅助调用。完整函数清单与每个函数的参数说明均可查阅Call枚举及其变体lib.rs。六、模块化特性开关用Features按需裁剪功能types.rs 定义了PalletFeature位标记枚举通过Config::Features关联类型GetPalletFeatures可整体启用/禁用 Pallet 的四大类功能PalletFeature控制的能力Trading交易操作set_price、buy_item、pay_tipsAttributes属性设置set_attribute等Approvals转移审批approve_transfer等Swaps原子交换create_swap、claim_swap等实现方式为位标记bitflag包装PalletFeatures::all_enabled()返回空标记全部功能可用PalletFeatures::from_disabled(features)可显式禁用部分功能types.rs。被禁用的功能对应的 extrinsic 会返回MethodDisabled错误。这一设计让运行时可以按链上治理需求灵活裁剪 NFT 能力面。七、核心存储结构数据如何落盘Pallet 的存储项lib.rs清晰映射了 NFT 领域模型存储项类型与语义CollectionStorageMapCollectionId, CollectionDetails集合详情所有者、押金、物品/元数据/配置/属性计数OwnershipAcceptanceStorageMapAccountId, CollectionId账户愿意接受所有权的集合AccountStorageNMap(owner, CollectionId, ItemId)按所有者枚举其持有的物品CollectionAccountStorageDoubleMapAccountId, CollectionId按账户枚举其拥有的集合CollectionRoleOfStorageDoubleMapCollectionId, AccountId, CollectionRoles集合角色Issuer/Freezer/AdminItemStorageDoubleMapCollectionId, ItemId, ItemDetails物品详情所有者、审批、押金CollectionMetadataOf/ItemMetadataOf集合/物品元数据押金 数据AttributeStorageNMap(CollectionId, OptionItemId, AttributeNamespace, Key)键值属性及其押金ItemPriceOfStorageDoubleMapCollectionId, ItemId, (ItemPrice, OptionAccountId)物品标价与白名单买家ItemAttributesApprovalsOf物品属性审批集合NextCollectionId下一个可用的集合 ID每次创建后递增PendingSwapOf待执行的原子交换要约CollectionConfigOf/ItemConfigOf集合/物品配置设置位标记、最大供应量、铸造设置types.rs 中的结构体CollectionDetails、ItemDetails、PendingSwap、PreSignedMint、PreSignedAttributes等为上述存储提供了编解码类型并通过MaxEncodedLen保证存储尺寸可预测。八、事件与错误链上反馈机制Pallet 定义了大量事件lib.rs例如Created、Issued、Transferred、Burned、ItemTransferLocked、OwnerChanged、TeamChanged、TransferApproved、ItemPriceSet、ItemBought、TipSent、SwapCreated、SwapClaimed、AttributeSet、PalletAttributeSet等覆盖集合生命周期、物品流转、交易、交换、属性等全部操作供链下索引器与客户端监听。错误类型lib.rs覆盖典型失败场景NoPermission、UnknownCollection、AlreadyExists、ApprovalExpired、BadWitness、ItemsNonTransferable、MaxSupplyReached、MaxSupplyLocked、NotForSale、BidTooLow、ReachedApprovalLimit、DeadlineExpired、MethodDisabled、MintNotStarted、MintEnded、AlreadyClaimed、WrongSignature、CollectionNotEmpty、WitnessRequired等便于开发者精确诊断调用失败原因。九、预签名流程离线授权铸币与属性写入Pallet 还支持**预签名pre-signed**操作允许权威方Issuer / Admin在链下对操作内容签名链上验证后执行mint_pre_signed提供PreSignedMint数据集合、物品 ID、附加属性、元数据、限定的领取账户、截止区块、可选铸币价格与签名任何人在截止前可代为铸造lib.rsset_attributes_pre_signed提供PreSignedAttributes数据集合、物品、属性键值对、命名空间、截止区块与签名物品所有者可触发属性批量写入lib.rs。这两类调用通过Config::OffchainSignature/OffchainPublic完成验签validate_signature相关数据类型定义于 types.rs。该机制非常适合项目方在链下签名铸造凭证用户自行领取的运营场景。十、相关模块与进一步阅读NFT 能力的落地通常依赖以下 FRAME 模块对应 README 的 Related Modules 章节Systemframe-system提供账户、区块号等基础能力Pallet 依赖其ConfigSupportframe-support提供#[pallet]宏、存储类型、trait如ReservableCurrency、Incrementable、Locker等基础设施Assetspallet-assets同质的可替代资产模块与 NFTs 组合可搭建完整的可替代 不可替代资产体系例如原子交换中附带的可替代资产部分。想深入理解实现细节推荐继续阅读仓库中的以下资源frame/nfts/README.md本文的原始骨架文档frame/nfts/src/lib.rsPallet 主实现含全部存储、事件、错误与 dispatchable 定义frame/nfts/src/types.rs核心数据结构与位标记类型frame/nfts/src/mock.rs测试环境配置可直接作为 Runtime 集成示例frame/nfts/src/tests.rs功能测试用例frame/nfts/src/benchmarking.rs重量基准测试frame/nfts/Cargo.tomlPallet 依赖与 feature 声明。结语pallet-nfts以一套清晰的四级权限体系无许可、有许可、元数据、治理强制覆盖了 NFT 从创建、铸造、转移、交易到销毁的全生命周期并通过Features位标记实现功能的模块化裁剪配合预签名流程与丰富的存储/事件设计为 Substrate 链上 NFT 业务提供了完整的基座能力。开发者只需按上文Config示例接入 Runtime即可按需启用集合创建、公开铸造、市场交易与原子交换等场景。赞分享区块链开发框架后端【免费下载链接】substrateSubstrate: The platform for blockchain innovators项目地址https://gitcode.com/gh_mirrors/su/substrate点击查看免费下载相关推荐Substrate 原子交换 Palletpallet-atomic-swap深度解析基于哈希证明的跨链资金原子发送机制Substrate 原子交换 Palletpallet atomic swap深度解析基于哈希证明的跨链资金原子发送机制 本篇技术指南以 Substrat区块链开发框架后端MiniMax-H3-Turbo-Lora-ComfyUI核心文件对比EMA与非EMA版本如何选择MiniMax H3 Turbo Lora ComfyUI核心文件对比EMA与非EMA版本如何选择 MiniMax H3 Turbo Lora ComfyU人工智能大模型LoRA媒体生成视频本地部署Substrate 赏金模块pallet-bounties完全指南从提案到赔付的完整治理流程Substrate 赏金模块pallet bounties完全指南从提案到赔付的完整治理流程 导读 本文围绕 Substrate 开源仓库中的 frame区块链开发框架后端上一篇终极屏幕翻译工具使用指南5分钟快速上手开源翻译软件下一篇NVIDIA Profile Inspector 深度解析从驱动层参数调控到性能优化实践创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。