Rust NFT运行时API库pallet-nfts-runtime-api的使用,实现Substrate区块链的NFT铸造、转移与管理功能
以下是关于pallet-nfts-runtime-api库的使用说明和完整示例:
库介绍
pallet-nfts-runtime-api是Substrate区块链框架中用于NFT功能的运行时API库,提供NFT铸造、转移和管理等功能。许可证为Apache-2.0。
安装方法
在项目目录中运行以下Cargo命令:
cargo add pallet-nfts-runtime-api
或在Cargo.toml中添加:
pallet-nfts-runtime-api = "27.0.0"
完整示例代码
use frame_support::traits::Currency;
use pallet_nfts_runtime_api::{NftsApi, CollectionId, ItemId};
use sp_api::ProvideRuntimeApi;
use sp_runtime::AccountId32;
// 创建NFT集合
fn create_collection(api: &impl NftsApi<Block>, owner: AccountId32) -> CollectionId {
let collection_id = api.next_collection_id();
api.create_collection(owner.clone(), collection_id, Default::default())
.unwrap();
collection_id
}
// 铸造NFT
fn mint_nft(
api: &impl NftsApi<Block>,
collection_id: CollectionId,
owner: AccountId32,
recipient: AccountId32,
) -> ItemId {
let item_id = api.next_item_id(collection_id);
api.mint(
owner.clone(),
collection_id,
item_id,
recipient.clone(),
Default::default(),
)
.unwrap();
item_id
}
// 转移NFT
fn transfer_nft(
api: &impl NftsApi<Block>,
collection_id: CollectionId,
item_id: ItemId,
sender: AccountId32,
recipient: AccountId32,
) {
api.transfer(sender, collection_id, item_id, recipient)
.unwrap();
}
// 销毁NFT
fn burn_nft(
api: &impl NftsApi<Block>,
collection_id: CollectionId,
item_id: ItemId,
owner: AccountId32,
) {
api.burn(owner, collection_id, item_id).unwrap();
}
fn main() {
// 初始化运行时客户端
let client = create_runtime_client();
// 获取API实例
let api = client.runtime_api();
// 创建测试账户
let owner = AccountId32::new([1; 32]);
let recipient = AccountId32::new([2; 32]);
// 执行NFT操作
let collection_id = create_collection(&api, owner.clone());
let item_id = mint_nft(&api, collection_id, owner.clone(), recipient.clone());
transfer_nft(&api, collection_id, item_id, recipient.clone(), owner.clone());
burn_nft(&api, collection_id, item_id, owner.clone());
}
主要功能说明
create_collection
- 创建新的NFT集合mint_nft
- 在指定集合中铸造新的NFTtransfer_nft
- 转移NFT所有权burn_nft
- 销毁NFT
注意:实际使用时需要根据具体区块链实现调整账户类型和区块类型参数。
更完整的示例代码
use frame_support::traits::Currency;
use pallet_nfts_runtime_api::{NftsApi, CollectionId, ItemId};
use sp_api::{ProvideRuntimeApi, BlockT};
use sp_runtime::{AccountId32, generic::Block};
use sp_core::sr25519;
use substrate_test_runtime_client::{
runtime::TestAPI,
DefaultTestClientBuilderExt,
TestClientBuilder,
TestClientBuilderExt
};
// 自定义区块类型
type Block = substrate_test_runtime_client::runtime::Block;
// 创建运行时客户端
fn create_runtime_client() -> sp_blockchain::Client<Block> {
TestClientBuilder::new()
.build()
.into()
}
// 创建NFT集合
fn create_collection(api: &impl NftsApi<Block>, owner: AccountId32) -> CollectionId {
let collection_id = api.next_collection_id();
api.create_collection(owner.clone(), collection_id, Default::default())
.unwrap();
collection_id
}
// 铸造NFT
fn mint_nft(
api: &impl NftsApi<Block>,
collection_id: CollectionId,
owner: AccountId32,
recipient: AccountId32,
) -> ItemId {
let item_id = api.next_item_id(collection_id);
api.mint(
owner.clone(),
collection_id,
item_id,
recipient.clone(),
Default::default(),
)
.unwrap();
item_id
}
// 转移NFT
fn transfer_nft(
api: &impl NftsApi<Block>,
collection_id: CollectionId,
item_id: ItemId,
sender: AccountId32,
recipient: AccountId32,
) {
api.transfer(sender, collection_id, item_id, recipient)
.unwrap();
}
// 销毁NFT
fn burn_nft(
api: &impl NftsApi<Block>,
collection_id: CollectionId,
item_id: ItemId,
owner: AccountId32,
) {
api.burn(owner, collection_id, item_id).unwrap();
}
fn main() {
// 初始化运行时客户端
let client = create_runtime_client();
// 获取API实例
let api = client.runtime_api();
// 创建测试账户
let owner = AccountId32::new([1; 32]);
let recipient = AccountId32::new([2; 32]);
// 执行NFT操作
let collection_id = create_collection(&api, owner.clone());
println!("Created collection with ID: {:?}", collection_id);
let item_id = mint_nft(&api, collection_id, owner.clone(), recipient.clone());
println!("Minted NFT with ID: {:?} in collection: {:?}", item_id, collection_id);
transfer_nft(&api, collection_id, item_id, recipient.clone(), owner.clone());
println!("Transferred NFT {:?} back to owner", item_id);
burn_nft(&api, collection_id, item_id, owner.clone());
println!("Burned NFT {:?}", item_id);
}
1 回复