---
title: "세미펀저블 토큰(SFT)이란?"
description: "SFT란 무엇인지, 어떻게 작동하는지, NFT 및 SPL 토큰과 어떻게 다른지 알아보기"
---

# 세미펀저블 토큰(SFT)이란?

대체 가능 토큰\(FT\)과 대체 불가능 토큰\(NFT\)의 특성을 결합한 세미 펀저블 토큰\(SFT\)은 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 program을 이해해야 한다.

## **SFT는 대체 가능 토큰 및 대체 불가능 토큰과 어떻게 다른가?**

세미 펀저블 토큰은 생애 주기의 각 시점에 따라 대체 가능 토큰과 대체 불가능 토큰의 특성을 나타낸다. 처음에는 SFT가 대체 가능 토큰처럼 작동해서 동일한 토큰과 가치 손실 없이 교환될 수 있다. 사용된 이후에는 교환 가치를 잃고 수집 가능한 [대체 불가능 토큰](https://www.alchemy.com/overviews/solana-1-of-1-nfts)의 속성을 갖게 된다.

### **NFT 대신 SFT를 사용할 때의 주요 이점은 무엇인가?**

SFT는 특정 상황에서 NFT보다 선호되는데, 이는 더 효율적이고, 비용 효율적이며, 유연하고, 개선된 거래 보안을 제공하기 때문이다.

#### **1. 되돌릴 수 있는 거래**

SFT를 NFT 대신 사용할 때 아마도 가장 중요한 이점은 잘못된 주소로의 토큰 거래를 되돌리고 환불할 수 있다는 점이다.

#### **2. 더 효율적이고 비용 효율적**

개별적으로 전송해야 하는 NFT와 달리, SFT는 일괄 전송을 지원한다. 즉, 여러 개의 SFT를 하나의 프로그램 호출로 전송할 수 있어 시간을 절약하고 거래 비용을 크게 줄일 수 있다.

#### **3. 개선된 보안**

SFT는 기존 NFT 표준을 개선함으로써 매우 안전한 전송을 가능하게 한다.

## **SFT는 어디에 사용되는가?**

**현재 SFT는 주로 온체인 활동을 게임 내 자산에 연결할 수 있는 게임 및 메타버스 환경에서 사용된다.** 동일한 NFT의 여러 단위를 관리하는 경우와 게임 성과를 기록하는 경우, 두 가지 예시를 살펴보자.

### **1. Genopets SFT 예시**

Genopets는 NFT와 SFT를 모두 활용하는 [Solana 블록체인 기반 NFT 게임](https://www.alchemy.com/list-of/web3-games-on-solana)이다. 플레이어는 고유한 펫을 NFT로 구매할 수 있으며, 그들이 수집하는 다양한 자원\(예: 나무, 물, 크리스탈, 금속 등\)은 SFT로 제공된다.

SFT는 NFT 게임에서 플레이어가 하나의 거래로 여러 자산\(예: 물 크리스탈 15개\)을 사고팔 수 있게 해주기 때문에 선호된다. 대체 가능 토큰은 하나의 프로그램\(즉 스마트 컨트랙트\) 내에서 여러 자산을 처리할 수 있어서, 개별적으로 처리되는 일반 NFT보다 전송 시 혼잡도가 낮고 거래 수수료도 더 낮다.

### **2. 게임 내 성과 기록 예시**

SFT는 게임 이력을 기록하는 데도 유용하다. 예를 들어 게임 내 무기를 SFT로 만들 수 있고, 무기가 사용됨에 따라 기록된 게임 내 이력 덕분에 새로운 고유 아이템이 되면서 NFT의 특성을 갖게 된다.

시간이 지나 아이템의 소유자가 바뀌면서 새로운 이력이 저장될 수 있다\(예: 무기가 사용된 횟수, 다른 플레이어를 죽이는 데 사용된 횟수 등\). 이는 web2 비디오 게임의 전통적인 무기 특성과 유사하다.

## **SFT는 Solana에서 어떻게 작동하는가?**

**Solana에서 SFT는 게임이나 메타버스 환경에서 특성을 나타내기 위해 토큰에 메타데이터가 첨부된 고유한 유형의 계정으로 작동한다.**

Solana에서 SFT의 작동 방식은 블록체인의 고유한 아키텍처, 구체적으로는 로직과 데이터를 **program**과 **data** 계정이라는 두 개의 구별된 구성 요소로 나누는 방식, 그리고 Token Metadata program과 관련이 있다.

### **Solana의 program과 account란 무엇인가?**

대부분의 블록체인과 달리, Solana는 로직과 데이터를 [program과 account](https://www.alchemy.com/overviews/solana-data-vs-program-accounts)라는 두 개의 구별된 구성 요소로 나눈다. [Solidity](https://www.alchemy.com/overviews/solidity) 스마트 컨트랙트처럼 변수에 데이터를 저장하는 대신, Solana의 program은 data account에 저장된 외부 데이터와 상호작용하고 이를 변경할 수 있는 능력을 갖는다.

이 고유한 구조는 program이 여러 account에 접근하면서 병렬로 실행될 수 있게 함으로써 Solana의 program을 매우 고성능으로 만든다. 실행 코드와 data account 간의 분리는 Solana의 program을 개별 데이터에 본질적으로 묶이지 않도록 하여 더 모듈화되게 만든다.

Solana account는 특정 주소에 저장된 바이트 배열이다. account의 주소는 암호화 키 쌍의 공개 키로 정의될 수 있다. account에 접근하려면 program도 해당 키 쌍의 개인 키에 접근할 수 있어야 한다. 일부 유형의 program은 해당 account의 데이터를 변경할 수 있는 권한을 갖는다.

새로 생성된 account는 일반적으로 해당 account의 소유자로 지정된 program에 의해 초기화된다. program은 account에 할당된 데이터의 구조를 정의하며, account에 지시를 제공하는 역할도 담당한다.

**Solana의 account 유형에는 다음이 포함된다:**

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 문서"
/>

#### **program derived address\(PDA\)는 Solana의 다른 account와 어떻게 다른가?**

**PDA는 암호화 키 쌍의 일부를 이루는 대신, 해당 account를 소유한 program의 공개 키로부터 알고리즘적으로 도출되는 account 주소다.**

PDA에 위치한 account는 해당 주소가 생성된 특정 program에 의해 제어되도록 설계되어 있다. [Program Derived Address](https://www.alchemy.com/overviews/program-derived-address)는 program의 공개 키로부터 알고리즘적으로 생성되기 때문에, 두 개의 서로 다른 program이 동일한 PDA를 생성하는 것은 불가능하다.

PDA는 program이 [Cross-Program Invocation](https://www.alchemy.com/overviews/cross-program-invocation)에 서명할 수 있게 하고, 결정론적으로 도출될 수 있는 여러 account를 하나의 주소 내에서 생성할 수 있게 하는 등 몇 가지 중요한 용도를 갖는다.

### **Solana의 token metadata program이란 무엇인가?**

Solana의 Token Metadata program의 목적은 Mint Account가 저장할 수 있는 데이터의 양과 유형에 제한이 있기 때문에 토큰에 추가 메타데이터를 첨부할 수 있게 하는 것이다.

Token Metadata program은 [Metaplex protocol](https://www.alchemy.com/overviews/metaplex)의 일부로, 원래 Solana에서 NFT 생성을 단순화하기 위해 개발되었다. 그러나 이 program은 SFT와도 함께 작동한다.

Mint Account는 현재 공급량과 권한 등 토큰에 관한 소수의 데이터 속성만 저장한다. Mint Account는 앱과 마켓플레이스가 사용하는 다른 데이터를 저장할 수 없다. 이러한 제한을 극복하기 위해 Token Metadata program은 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 standard란 무엇인가?**

JSON standard는 추가 데이터를 온체인에 저장하는 데 드는 수수료를 절약하기 위해, 오프체인에 저장되는 데이터를 토큰에 추가하는 방식이다. 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 program은 Solana의 SFT와 어떤 관련이 있는가?**

**token metadata는 무기와 같이 메타데이터가 많은 오브젝트로서, Solana의 SFT가 게임이나 메타버스 환경에서 기능하도록 만드는 방식이다.**

Solana의 세미 펀저블 토큰은 다음 두 가지 속성을 가진 Mint Account로 구성된다:

1. 공급량이 0 이상이다\(예: 1개 이상의 토큰이 유통 중\)
1. 소수점 자리가 없다\(예: 정수만 가능\)

Metadata Account를 추가하면 Token Standard 속성을 통해 토큰의 펀저빌리티를 추적할 수 있다. 이 속성은 program이 자동으로 할당하며, 수동으로 업데이트할 수 없다. 또한 FungibleAsset 속성은 SFT의 token standard를 나타낸다.

<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 standard에 따라 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의 가장 인기 있는 활용처지만, 향상된 유연성과 데이터를 오프체인에 저장함으로써 비용을 줄일 수 있는 기회 때문에 많은 관심을 받고 있다.
