---
title: "セミファンジブルトークン(SFT)とは?"
description: "SFTとは何か、どのように機能するか、NFTやSPLトークンとの違いを解説"
---

# セミファンジブルトークン(SFT)とは?

セミファンジブルトークン（SFT）はファンジブルトークン（FT）とノンファンジブルトークン（NFT）の特性を組み合わせたもので、Solanaブロックチェーンにおいては比較的新しいイノベーションです。SFTは現在ゲームやメタバースのアプリケーションで使用されており、将来的には他にも多くの用途があると見込まれています。

セミファンジブルトークンという概念は、もともとEthereum上の[ERC1155マルチトークン規格](https://www.alchemy.com/blog/comparing-erc-721-to-erc-1155)で生まれたもので、現在はSolana上でSFTとして存在しています。Solana上でSFTがどのように機能するかを理解するには、ロジックとデータをData AccountとProgram Accountに分けるブロックチェーンのアーキテクチャ、およびSolanaのToken Metadataプログラムについて理解する必要があります。

## **SFTはファンジブルトークンやノンファンジブルトークンとどう違うのか**

セミファンジブルトークンは、そのライフサイクルの異なる時点でファンジブルトークンとノンファンジブルトークンの性質を示します。初期段階では、SFTはファンジブルトークンのように機能し、同一のトークンとの間で価値を失うことなく交換できます。一度使用されると、交換価値を失い、収集可能な[ノンファンジブルトークン](https://www.alchemy.com/overviews/solana-1-of-1-nfts)の属性を獲得します。

### **NFTではなくSFTを使う主な利点は何か**

SFTは特定の文脈においてNFTよりも好ましいとされます。これは、より効率的でコスト効果が高く、柔軟性があり、トランザクションのセキュリティも向上しているためです。

#### **1. 可逆的なトランザクション**

SFTをNFTより優先して使う上でおそらく最も重要な利点は、誤ったアドレスへのトークン取引が取り消し可能で返金できることです。

#### **2. より効率的でコスト効果が高い**

個別に転送する必要があるNFTとは異なり、SFTはバッチ転送をサポートしています。これにより、複数のSFTを1回のプログラム呼び出しで転送でき、時間の節約とトランザクションコストの大幅な削減が可能になります。

#### **3. セキュリティの向上**

SFTは、既存のNFT規格を改良することで、高度に安全な転送を可能にしています。

## **SFTは何に使われるのか**

**現在、SFTは主にゲームやメタバース環境で使用されており、オンチェーンのアクティビティをゲーム内アセットに紐付けることができます**。ここでは2つの例を見てみましょう。同一NFTの多数のユニットの管理と、ゲーム内の実績の記録です。

### **1. GenopetsのSFT事例**

Genopetsは[Solanaブロックチェーン上のNFTゲーム](https://www.alchemy.com/list-of/web3-games-on-solana)で、NFTとSFTの両方を活用しています。プレイヤーはユニークなペットをNFTとして購入でき、収集する豊富な資源（木材、水、クリスタル、金属など）はSFTとして利用できます。

SFTはNFTゲームにおいて好ましいとされます。プレイヤーが複数のアセット（例：水のクリスタル15個）を1回のトランザクションで売買できるためです。ファンジブルトークンは複数のアセットを1つのプログラム（すなわちスマートコントラクト）内に収めることができるため、その転送は個別に処理される標準的なNFTよりも輻輳が少なく、トランザクション手数料も低くなります。

### **2. ゲーム内実績の事例**

SFTはゲームの履歴を記録する上でも有用です。例えば、ゲーム内の武器をSFTとして作成し、その武器が使用されるにつれてNFTの特性を獲得し、記録されたゲーム内履歴によって新たなユニークアイテムになります。

そのアイテムが時間の経過とともに持ち主を変える中で、新たな履歴が保存されていきます（例：その武器が使用された回数、他のプレイヤーを倒すために使われた回数など）。これはweb2のビデオゲームにおける従来の武器の特性と同様です。

## **SolanaでSFTはどのように機能するのか**

**Solana上のSFTは、ゲームやメタバース環境における特性を表現するためにトークンにメタデータが付加された、独自のタイプのアカウントとして動作します。**

Solana上でのSFTの機能は、このブロックチェーン独自のアーキテクチャ、具体的にはロジックとデータを**プログラム**とデータアカウントという2つの異なる要素に分けている点、およびToken Metadataプログラムと関係しています。

### **Solanaにおけるプログラムとアカウントとは何か**

ほとんどのブロックチェーンとは異なり、Solanaはロジックとデータを[プログラムとアカウント](https://www.alchemy.com/overviews/solana-data-vs-program-accounts)という2つの異なる要素に分けています。[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 AccountsとToken Accounts"
  width={1000}
  height={257}
  caption="出典:Metaplex Documentation"
/>

#### **プログラム派生アドレス（PDA）は、Solanaの他のアカウントとどう違うのか**

**PDAは、暗号鍵ペアの一部を構成するのではなく、そのアカウントを所有するプログラムの公開鍵からアルゴリズムによって派生したアカウントアドレスです。**

PDAに配置されたアカウントは、そのアドレスが生成されるもととなった特定のプログラムによって制御されるように設計されています。[Program Derived Addresses](https://www.alchemy.com/overviews/program-derived-address)はプログラムの公開鍵からアルゴリズムによって生成されるため、2つの異なるプログラムが同じPDAを生成することは不可能です。

PDAには重要な用途がいくつかあります。例えば、プログラムが[Cross-Program Invocations](https://www.alchemy.com/overviews/cross-program-invocation)に署名できるようにすることや、決定論的に導出可能な複数のアカウントを1つのアドレス内に作成できるようにすることなどです。

### **SolanaにおけるToken Metadataプログラムとは何か**

SolanaにおけるToken Metadataプログラムの目的は、トークンに追加のメタデータを付加できるようにすることです。というのも、Mint Accountが保存できるデータの量とタイプには限りがあるためです。

Token Metadataプログラムは[Metaplexプロトコル](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="オフチェーンのJSONオブジェクトにリンクするMetadata Account URIの図"
  width={1000}
  height={619}
  caption="オフチェーンJSONオブジェクト"
/>

### **Token MetadataプログラムはSolana上のSFTにとってどのような意味を持つのか**

**Token Metadataは、Solana上のSFTが武器のようなメタデータの多いオブジェクトとして、ゲームやメタバース環境で機能するようになる仕組みです。**

SolanaにおけるSemi-fungible Tokenは、以下の2つの特性を持つ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の最も一般的な用途ではありますが、柔軟性の向上や、データをオフチェーンで保存することによるコスト削減の機会から、多くの注目を集めています。
