非同质化代币
在数字资产的世界里,并非所有的代币都一样。这在*房地产*、*投票权*或*收藏品*等情况下变得非常重要,在这些情况下,由于它们的实用性、稀有性等,某些物品比其他物品更有价值。 在 Stellar 上,你可以创建非同质化代币 (NFT),其中每个代币都是独一无二的,代表着不同的东西,所有权通过 Soroban 智能合约进行跟踪。
概述
non-fungible 模块 提供了三种不同的 NFT 变体,它们在某些功能(如所有权跟踪、代币创建和销毁)的处理方式上有所不同:
-
基础: 实现 NonFungibleToken 接口的基础逻辑的合约变体。适用于大多数用例。
-
连续: 用于优化批量铸造代币的合约变体。构建在基本变体之上,并覆盖
Base
变体中的必要函数。 -
可枚举: 允许链上枚举代币的合约变体。构建在基本变体之上,并覆盖
Base
变体中的必要函数。
这三个变体共享核心功能和一个公共接口,公开相同的合约函数作为入口点。但是,组合自定义流程必须格外小心。这是因为不同 NFT 变体之间的业务逻辑不兼容,或者需要用额外的逻辑来包装基本功能。
用法
我们将使用 NFT 来跟踪游戏物品,每个物品都有自己独特的属性。每当要把一个物品奖励给玩家时,它将被铸造并发送给他们。玩家可以自由地保留或销毁他们的代币,或者根据自己的意愿与其他玩家交易。请注意,任何帐户都可以调用 award_item
,我们可能希望实施访问控制来限制谁可以铸造。
以下是代币化物品的合约示例:
use soroban_sdk::{contract, contractimpl, Address, Env, String};
use stellar_macros::default_impl;
use stellar_tokens::non_fungible::{
burnable::NonFungibleBurnable,
Base, ContractOverrides, NonFungibleToken,
};
#[contract]
pub struct GameItem;
#[contractimpl]
impl GameItem {
pub fn __constructor(e: &Env) {
Base::set_metadata(
e,
String::from_str(e, "www.mygame.com"),
String::from_str(e, "My Game Items Collection"),
String::from_str(e, "MGMC"),
);
}
pub fn award_item(e: &Env, to: Address) -> u32 {
// 可能需要访问控制
Base::sequential_mint(e, &to)
}
}
#[default_impl]
#[contractimpl]
impl NonFungibleToken for GameItem {
type ContractType = Base;
}
#[default_impl]
#[contractimpl]
impl NonFungibleBurnable for GameItem {}
扩展
提供以下可选扩展以增强功能:
- 连续
NonFungibleConsecutive
扩展针对具有连续 ID 的代币的批量铸造进行了优化。这种方法通过仅在边界处存储所有权并推断其他代币的所有权,从而大大减少了铸造期间的存储写入。有关详细文档,请参见 非同质化连续。
此扩展围绕合约变体 Consecutive
构建。这是一个用法示例: