---
title: "什麼是半同質化代幣（SFTs）？"
description: "了解 SFT 是什麼、如何運作，以及與 NFT 和 SPL 代幣的差異"
---

# 什麼是半同質化代幣（SFTs）？

半同質化代幣（Semi-fungible tokens，SFTs）結合了同質化代幣（FTs）與非同質化代幣（NFTs）的特性，是 Solana 區塊鏈上相對較新的創新。SFTs 目前應用於遊戲與元宇宙應用程式中，預期未來還會有許多其他用途。

半同質化代幣的概念最初是在 Ethereum 上以[ERC1155 多重代幣標準](https://www.alchemy.com/blog/comparing-erc-721-to-erc-1155)提出的，現在也以 SFTs 的形式存在於 Solana 上。要理解 SFTs 在 Solana 上如何運作，必須先了解該區塊鏈的架構，它將邏輯與資料分別存放於 Data Accounts 和 Program Accounts，以及 Solana 的 Token Metadata 程式。

## **SFTs 與同質化代幣、非同質化代幣有何不同？**

半同質化代幣在其生命週期的不同階段展現出同質化代幣與非同質化代幣的特質。最初，SFTs 的運作方式類似同質化代幣，可以與相同的代幣交換而不會讓任何一方損失價值。一旦被使用後，它們就會失去交換價值，轉而獲得可收藏的[非同質化代幣](https://www.alchemy.com/overviews/solana-1-of-1-nfts)的屬性。

### **使用 SFTs 而非 NFTs 的主要優勢是什麼？**

在某些情境下，SFTs 比 NFTs 更適用，因為它們效率更高、成本更低、更具彈性，且交易安全性更好。

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

使用 SFTs 相對於 NFTs 最重要的優勢，或許在於代幣轉帳到錯誤地址時可以逆轉並退款。

#### **2. 更有效率且更具成本效益**

NFTs 必須逐一轉帳，SFTs 則支援批次轉帳。這代表多個 SFTs 可以在單一程式呼叫中完成轉帳，節省時間並大幅降低交易成本。

#### **3. 提升安全性**

SFTs 在既有的 NFT 標準基礎上進行改良，能實現高度安全的轉帳。

## **SFTs 有哪些用途？**

**目前 SFTs 主要用於遊戲與元宇宙環境中，鏈上活動可以附加到遊戲內資產上**。以下是兩個範例：管理同一種 NFT 的多個單位，以及記錄遊戲成就。

### **1. Genopets SFT 範例**

Genopets 是一款建構在 [Solana 區塊鏈上的 NFT 遊戲](https://www.alchemy.com/list-of/web3-games-on-solana)，同時運用 NFTs 與 SFTs。玩家可以購買獨特的寵物作為 NFT，而他們收集到的大量資源（例如木材、水、水晶、金屬等）則以 SFTs 的形式存在。

SFTs 在 NFT 遊戲中更受青睞，因為它們讓玩家可以在單筆交易中買賣多項資產（例如 15 個水晶）。同質化代幣可以在單一程式（即智能合約）中容納多項資產，這代表它們的轉移比逐一處理的標準 NFTs 造成更少壅塞、更低的交易費用。

### **2. 遊戲內成就範例**

SFTs 也適合用來記錄遊戲歷程。例如，遊戲內的武器可以做成 SFT，隨著武器被使用，它會逐漸獲得 NFT 的特性，因為記錄下的遊戲內歷程，成為一個全新的獨特物品。

隨著該物品幾經易手，新的歷程也會被記錄下來（例如這把武器被使用過幾次、用來擊殺過其他玩家幾次等），就像 web2 電玩遊戲中傳統的武器特性一樣。

## **SFTs 在 Solana 上如何運作？**

**Solana 上的 SFTs 是一種特殊類型的帳戶，會將 metadata 附加到代幣上，以呈現遊戲或元宇宙環境中的特性。**

Solana 上 SFTs 的運作方式與該區塊鏈獨特的架構有關，具體來說，是將邏輯與資料分別放入兩個不同的元件——**programs** 與 **data** accounts，以及 Token Metadata 程式。

### **Solana 上的 programs 和 accounts 是什麼？**

與大多數區塊鏈不同，Solana 將邏輯與資料分成兩個不同的元件，稱為[programs 與 accounts](https://www.alchemy.com/overviews/solana-data-vs-program-accounts)。與 [Solidity](https://www.alchemy.com/overviews/solidity) 智能合約將資料存放於變數中不同，Solana 的 programs 可以與外部儲存於 data accounts 中的資料互動，並具有修改它們的能力。

這種獨特的結構讓 Solana 上的 programs 效能極高，因為 programs 可以在存取多個帳戶的同時並行執行。可執行程式碼與資料帳戶的分離，讓 Solana 上的 programs 更具模組化，因為它們並非天生就綁定於任何特定資料。

Solana 的帳戶是儲存在特定位址上的位元組陣列。帳戶的位址可以定義為一組密碼學金鑰對的公鑰。要登入某個帳戶，program 也必須能存取該金鑰對的私鑰。某些類型的 programs 具有修改該帳戶中資料的能力。

新建立的帳戶通常是由某個被標記為該帳戶擁有者的 program 進行初始化。該 program 定義了分配給該帳戶的資料結構，並負責提供指令給該帳戶。

**Solana 上的帳戶類型包括：‍**

1. ‍**Mint Accounts** — 儲存代幣的全域資訊
1. **Token Accounts** — 儲存使用者的 Wallet Account 與 Mint Account 之間的關係

<ImageBlock
  src="https://media.alchemy.com/1703698728-types-of-solana-account.png"
  alt="Solana 帳戶類型圖：Mint Accounts 與 Token Accounts"
  width={1000}
  height={257}
  caption="來源：Metaplex 文件"
/>

#### **program derived addresses（PDAs）與 Solana 上其他帳戶有何不同？**

**PDAs 是以演算法方式從擁有該帳戶的 program 之公鑰推導出來的帳戶位址，而非屬於某組密碼學金鑰對的一部分。**

位於 PDAs 上的帳戶被設計成由推導出其位址的特定 program 所控制。由於 [Program Derived Addresses](https://www.alchemy.com/overviews/program-derived-address) 是以演算法從 program 的公鑰推導而來，因此不可能有兩個不同的 program 推導出相同的 PDA。

PDAs 有一些重要用途，例如讓 programs 能夠簽署 [Cross-Program Invocations](https://www.alchemy.com/overviews/cross-program-invocation)，以及讓多個帳戶可以在一個位址內以確定性方式被推導出來。

### **Solana 上的 token metadata 程式是什麼？**

Solana 上 Token Metadata 程式的目的，是讓代幣可以附加額外的 metadata，因為 Mint Accounts 能儲存的資料數量與類型有限。

Token Metadata 程式是 [Metaplex protocol](https://www.alchemy.com/overviews/metaplex) 的一部分，該協議最初是為了簡化在 Solana 上建立 NFTs 而開發的。不過，這個程式也能配合 SFTs 運作。

一個 Mint Account 只儲存少量關於代幣的資料屬性，例如目前的供應量與 authorities。Mint Accounts 無法儲存應用程式與市場所使用的其他資料。為了克服這項限制，Token Metadata 程式提供了一個位於 PDA 的 Metadata Account，該 PDA 是從 Mint 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 Accounts 中的 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 上的 SFTs 有何關聯？**

**Token metadata 是 Solana 上的 SFTs 得以在遊戲或元宇宙環境中，作為武器等 metadata 密集物件發揮作用的方式。**

Solana 上的 Semi-fungible Token 由一個具有以下兩項屬性的 Mint Account 組成：

1. 供應量大於或等於 0（例如流通中的代幣超過 1 個）
1. 沒有小數位數（例如僅限整數）

加入 Metadata Account 後，可透過其 Token Standard 屬性追蹤代幣的同質化程度。該程式會自動指派此屬性，且無法手動更新。此外，FungibleAsset 屬性代表 SFTs 的代幣標準。

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

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>指向定義該資產之外部網址的 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 metadata 的 JSON 範例"
  width={1000}
  height={709}
  caption="Solana SFT metadata 的 JSON 範例"
/>

## **SFTs 對 Web3 未來的意義是什麼？**

SFTs 的混合特性開啟了新的可能性，讓代幣得以用一種具成本效益且高度實用的方式，在各種環境中代表複雜的數位資產。

儘管遊戲與元宇宙用例是 SFTs 目前最普遍的應用，但由於其更強的彈性，以及透過將資料儲存在鏈下來降低成本的機會，SFTs 正吸引著大量的關注。
