---
title: "什么是半同质化代币(SFTs)?"
description: "了解 SFTs 是什么、如何运作,以及与 NFTs 和 SPL Tokens 的区别"
---

# 什么是半同质化代币(SFTs)?

半同质化代币（SFT）结合了同质化代币（FT）和非同质化代币（NFT）的特性，是 Solana 区块链上一项相对较新的创新。SFT 目前主要用于游戏和元宇宙应用，预计未来还会有更多其他用途。

半同质化代币的概念最初在 Ethereum 上通过[ERC1155 多代币标准](https://www.alchemy.com/blog/comparing-erc-721-to-erc-1155)提出，现在在 Solana 上以 SFT 的形式存在。要理解 SFT 在 Solana 上的运作方式，需要先了解该区块链的架构——它将逻辑和数据分为 Data Account 和 Program Account——以及 Solana 的 Token Metadata 程序。

## **SFT 与同质化代币、非同质化代币有何不同？**

半同质化代币在其生命周期的不同阶段分别体现出同质化代币和非同质化代币的特性。最初，SFT 的运作方式与同质化代币相同，可以与相同的代币互换，双方均不会有价值损失。一旦被使用，它们就会失去交换价值，转而获得可收藏的[非同质化代币](https://www.alchemy.com/overviews/solana-1-of-1-nfts)的属性。

### **使用 SFT 而非 NFT 的主要优势是什么？**

在某些场景下，SFT 比 NFT 更具优势，因为它们效率更高、成本更低、更灵活，并且交易安全性更好。

#### **1. 可逆交易**

使用 SFT 相较于 NFT 最显著的优势或许在于，发送到错误地址的代币交易是可逆且可退款的。

#### **2. 更高效、更低成本**

与必须逐个转移的 NFT 不同，SFT 支持批量转移。这意味着可以在单次程序调用中转移多个 SFT，从而节省时间并大幅降低交易成本。

#### **3. 更强的安全性**

SFT 在现有 NFT 标准的基础上进行了改进，支持高度安全的转移。

## **SFT 有什么用途？**

**目前，SFT 主要用于游戏和元宇宙环境，链上活动可以与游戏内资产相关联**。我们来看两个例子：管理同一 NFT 的多个单位，以及记录游戏成就。

### **1. Genopets SFT 示例**

Genopets 是 [Solana 区块链上的一款 NFT 游戏](https://www.alchemy.com/list-of/web3-games-on-solana)，同时使用了 NFT 和 SFT。玩家可以购买一只独特的宠物作为 NFT，而他们收集到的大量资源（例如木材、水、水晶、金属等）则以 SFT 的形式存在。

对于 NFT 游戏来说，SFT 更具优势，因为它们允许玩家在单笔交易中买卖多个资产（例如 15 个水晶）。同质化代币可以在单个程序（即智能合约）中容纳多个资产，这意味着它们的转移产生的拥堵更少、交易费用也比逐个处理的标准 NFT 更低。

### **2. 游戏内成就示例**

SFT 对记录游戏历史也很有用。例如，一件游戏内武器可以做成 SFT，随着武器的使用，它会获得 NFT 的特性，因其记录的游戏内历史而成为一件新的独特物品。

随着物品几经易手，新的历史记录会不断被存储（例如该武器被使用过多少次、用它击杀过多少其他玩家等），就像 Web2 电子游戏中传统的武器属性一样。

## **SFT 在 Solana 上是如何运作的？**

**Solana 上的 SFT 以一种特殊类型的账户运作，通过为代币附加元数据来表示其在游戏或元宇宙环境中的特性。**

SFT 在 Solana 上的运作方式与该区块链独特的架构有关，具体来说，是将逻辑和数据分为两个不同的组件——**程序（program）**和**数据（data）**账户——以及 Token Metadata 程序。

### **Solana 上的程序和账户是什么？**

与大多数区块链不同，Solana 将逻辑和数据分为两个不同的组件，即[程序和账户](https://www.alchemy.com/overviews/solana-data-vs-program-accounts)。与将数据存储在变量中的 [Solidity](https://www.alchemy.com/overviews/solidity) 智能合约不同，Solana 中的程序可以与存储在数据账户中的外部数据进行交互，并能够改变这些数据。

这种独特的结构使得 Solana 上的程序在访问多个账户时能够并行运行，从而具有很高的性能。可执行代码与数据账户的分离，使 Solana 上的程序更加模块化，因为它们本质上不与任何单个数据绑定。

Solana 账户是存储在特定地址上的字节数组。账户的地址可以定义为一对密码学密钥对中的公钥。要登录某个账户，程序还必须能够访问该密钥对的私钥。某些类型的程序有能力改变该账户中的数据。

新创建的账户通常由被标记为该账户所有者的程序进行初始化。该程序定义分配给该账户的数据结构，并负责向该账户提供指令。

**Solana 上的账户类型包括：‍**

1. ‍**Mint Account**——存储代币的全局信息
1. **Token Account**——存储用户 Wallet Account 与 Mint Account 之间的关联关系

<ImageBlock
  src="https://media.alchemy.com/1703698728-types-of-solana-account.png"
  alt="Solana 账户类型示意图:Mint Account 与 Token Account"
  width={1000}
  height={257}
  caption="来源:Metaplex 文档"
/>

#### **程序派生地址（PDA）与 Solana 上其他账户有何不同？**

**PDA 是通过算法从拥有该账户地址所有权的程序的公钥推导而来的账户地址，而不是密码学密钥对的一部分。**

位于 PDA 上的账户被设计为由生成其地址所依据的特定程序所控制。由于[程序派生地址](https://www.alchemy.com/overviews/program-derived-address)是通过算法从某个程序的公钥生成的，因此两个不同的程序不可能生成相同的 PDA。

PDA 有一些重要用途，例如允许程序对[跨程序调用（Cross-Program Invocation）](https://www.alchemy.com/overviews/cross-program-invocation)进行签名，以及支持在一个地址内以确定性方式派生创建多个账户。

### **Solana 上的 token metadata 程序是什么？**

Solana 上 Token Metadata 程序的作用是允许为代币添加额外的元数据，因为 Mint Account 能够存储的数据数量和类型是有限的。

Token Metadata 程序是 [Metaplex protocol](https://www.alchemy.com/overviews/metaplex) 的一部分，该协议最初是为简化 Solana 上 NFT 的创建而开发的。不过，该程序同样适用于 SFT。

Mint Account 仅存储代币的少量数据属性，例如其当前供应量和权限信息。Mint Account 无法容纳应用和市场所使用的其他数据。为克服这一限制，Token Metadata 程序提供了一个位于由 Mint Account 地址派生出的 PDA 上的 Metadata Account。Metadata Account 包含许多有价值的属性，使普通的链上代币能够被打造成数字资产。

<ImageBlock
  src="https://media.alchemy.com/1703698814-metadata-account.png"
  alt="示意图:位于 Mint Account 地址派生出的 PDA 上的 Solana Metadata Account"
  width={1000}
  height={619}
  caption="Metadata Account"
/>

#### **JSON 标准是什么？**

JSON 标准是一种为代币添加链下存储数据的方式，以节省在链上存储额外数据所需的费用。Metadata Account 中的 URI 属性链接到一个链下 JSON 文件，该文件按照特定标准存储了关于代币的有用信息。

为确保该 JSON 文件不可被更改，可以使用诸如 Arweave 之类的永久存储方案来存储它。此外，Metadata Account 中的 **Is Mutable** 属性可用于防止 URI 属性及其他属性被更改。

<ImageBlock
  src="https://media.alchemy.com/1703698932-off-chain-json-object.png"
  alt="示意图:Metadata Account 的 URI 链接到链下 JSON 对象"
  width={1000}
  height={619}
  caption="链下 JSON 对象"
/>

### **token metadata 程序与 Solana 上的 SFT 有何关联？**

**Token metadata 是使 Solana 上的 SFT 能够在游戏或元宇宙环境中作为元数据丰富的对象（例如武器）发挥作用的方式。**

Solana 中的一个 Semi-fungible Token 由具有以下两个属性的 Mint Account 组成：

1. 供应量大于或等于 0（例如流通中的代币数量超过 1 个）
1. 没有小数位（例如仅为整数）

Metadata Account 的加入通过其 Token Standard 属性来跟踪代币的同质化程度。该属性由程序自动分配，无法手动更新。此外，FungibleAsset 属性代表了 SFT 的代币标准。

<ImageBlock
  src="https://media.alchemy.com/1703699032-token-standard-for-sfts.png"
  alt="示意图:SFT 的 FungibleAsset 代币标准属性"
  width={985}
  height={216}
  caption="SFT 的代币标准"
/>

Metadata Account 还包含其他重要信息，用于将该 SFT 指定为某个特定的游戏内武器，例如。这些信息包括动画或图标，在 JSON 标准下，这些内容可以通过 URI 属性存储在链下。

<EmbeddedTable
  table={{
    columns: [
      { key: "1", width: 200, title: "Field", dataType: "object" },
      { key: "2", width: 200, title: "Type", dataType: "object" },
      { key: "3", width: 200, title: "Description", dataType: "object" },
    ],
    data: [
      {
        "1": { title: "<p><strong>name</strong></p>", tooltip: "", icon: "" },
        "2": { title: "<p>string</p>", tooltip: "", icon: "" },
        "3": { title: "<p>资产的名称。</p>", tooltip: "", icon: "" },
        id: 0,
      },
      {
        "1": { title: "<p><strong>symbol</strong></p>", tooltip: "", icon: "" },
        "2": { title: "<p>string</p>", tooltip: "", icon: "" },
        "3": { title: "<p>资产的符号。</p>", tooltip: "", icon: "" },
        id: 1,
      },
      {
        "1": { title: "<p><strong>description</strong></p>", tooltip: "", icon: "" },
        "2": { title: "<p>string</p>", tooltip: "", icon: "" },
        "3": { title: "<p>资产的描述。</p>", tooltip: "", icon: "" },
        id: 2,
      },
      {
        "1": { title: "<p><strong>image</strong></p>", tooltip: "", icon: "" },
        "2": { title: "<p>string</p>", tooltip: "", icon: "" },
        "3": { title: "<p>指向该资产图标的 URI。</p>", tooltip: "", icon: "" },
        id: 3,
      },
      {
        "1": { title: "<p><strong>animation_url</strong></p>", tooltip: "", icon: "" },
        "2": { title: "<p>string</p>", tooltip: "", icon: "" },
        "3": { title: "<p>指向该资产动画的 URI。</p>", tooltip: "", icon: "" },
        id: 4,
      },
      {
        "1": { title: "<p><strong>external_url</strong></p>", tooltip: "", icon: "" },
        "2": { title: "<p>string</p>", tooltip: "", icon: "" },
        "3": { title: "<p>指向定义该资产的外部 URL 的 URI——例如该游戏的主站点。</p>", tooltip: "", icon: "" },
        id: 5,
      },
      {
        "1": { title: "<p><strong>attributes</strong></p>", tooltip: "", icon: "" },
        "2": { title: "<p>array</p>", tooltip: "", icon: "" },
        "3": { title: "<p>定义该资产特性的属性数组。</p>", tooltip: "", icon: "" },
        id: 6,
      },
      {
        "1": { title: "<p><strong>trait_type</strong></p>", tooltip: "", icon: "" },
        "2": { title: "<p>string</p>", tooltip: "", icon: "" },
        "3": { title: "<p>属性的类型。</p>", tooltip: "", icon: "" },
        id: 7,
      },
      {
        "1": { title: "<p><strong>value</strong></p>", tooltip: "", icon: "" },
        "2": { title: "<p>string</p>", tooltip: "", icon: "" },
        "3": { title: "<p>该属性对应的值。</p>", tooltip: "", icon: "" },
        id: 8,
      },
    ],
  }}
/>

<ImageBlock
  src="https://media.alchemy.com/1703699212-json-example-of-solana-sft-metadata.png"
  alt="Solana SFT 元数据的 JSON 示例"
  width={1000}
  height={709}
  caption="Solana SFT 元数据的 JSON 示例"
/>

## **SFT 对 Web3 未来发展意味着什么？**

SFT 的混合特性为如何以一种低成本、高功能性的方式，在各种环境中用代币表示复杂的数字资产，开辟了新的可能性。

尽管游戏和元宇宙用例是目前 SFT 最普遍的应用场景，但由于其增强的灵活性以及通过链下存储数据来降低成本的机会，它们正吸引着大量关注。
