非同质化代币

在数字资产的世界里,并非所有的代币都一样。这在*房地产*、*投票权*或*收藏品*等情况下变得非常重要,在这些情况下,由于它们的实用性、稀有性等,某些物品比其他物品更有价值。 在 Stellar 上,你可以创建非同质化代币 (NFT),其中每个代币都是独一无二的,代表着不同的东西,所有权通过 Soroban 智能合约进行跟踪。

概述

non-fungible 模块 提供了三种不同的 NFT 变体,它们在某些功能(如所有权跟踪、代币创建和销毁)的处理方式上有所不同:

  1. 基础: 实现 NonFungibleToken 接口的基础逻辑的合约变体。适用于大多数用例。

  2. 连续: 用于优化批量铸造代币的合约变体。构建在基本变体之上,并覆盖 Base 变体中的必要函数。

  3. 可枚举: 允许链上枚举代币的合约变体。构建在基本变体之上,并覆盖 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 {}

扩展

提供以下可选扩展以增强功能:

- 可销毁

NonFungibleBurnable trait 扩展了 NonFungibleToken trait,提供了销毁代币的功能。

- 连续

NonFungibleConsecutive 扩展针对具有连续 ID 的代币的批量铸造进行了优化。这种方法通过仅在边界处存储所有权并推断其他代币的所有权,从而大大减少了铸造期间的存储写入。有关详细文档,请参见 非同质化连续

此扩展围绕合约变体 Consecutive 构建。这是一个用法示例:

- 可枚举

NonFungibleEnumerable 扩展启用了地址拥有的代币的链上枚举。有关详细文档,请参见 非同质化可枚举

此扩展围绕合约变体 Enumerable 构建。这是一个用法示例:

- 版税

NonFungibleRoyalties trait 扩展了 NonFungibleToken trait,以提供代币的版税信息,类似于 ERC-2981 标准。这允许市场查询版税信息并向创作者支付适当的费用。

注意:版税扩展允许集合范围的默认版税和每个代币的版税设置。