---
title: "O que são tokens semifungíveis (SFTs)?"
description: "Saiba o que são SFTs, como funcionam e o que os diferencia de NFTs e tokens SPL"
---

# O que são tokens semifungíveis (SFTs)?

Tokens semi-fungíveis \(SFTs\) combinam as características de tokens fungíveis \(FTs\) e tokens não fungíveis \(NFTs\), e são uma inovação relativamente recente para a blockchain Solana. Os SFTs estão sendo usados atualmente em aplicações de jogos e metaverso, e devem ter muitos outros usos no futuro.

A ideia de tokens semi-fungíveis foi criada inicialmente na Ethereum com [o padrão multi-token ERC1155](https://www.alchemy.com/blog/comparing-erc-721-to-erc-1155), e agora existe na Solana como SFTs. Para entender como os SFTs funcionam na Solana é necessário compreender a arquitetura da blockchain, que divide lógica e dados em Data Accounts e Program Accounts, além do programa Token Metadata da Solana.

## **Em que os SFTs diferem dos tokens fungíveis e não fungíveis?**

Os tokens semi-fungíveis exibem as qualidades de tokens fungíveis e tokens não fungíveis em diferentes pontos do seu ciclo de vida. Inicialmente, os SFTs funcionam como tokens fungíveis e podem ser trocados por tokens idênticos sem perda de valor para nenhuma das partes. Uma vez usados, perdem seu valor de troca e ganham os atributos de [tokens não fungíveis](https://www.alchemy.com/overviews/solana-1-of-1-nfts) colecionáveis.

### **Quais são as principais vantagens de usar SFTs em vez de NFTs?**

Os SFTs são preferíveis aos NFTs em certos contextos, pois são mais eficientes, econômicos, flexíveis e envolvem maior segurança nas transações.

#### **1. Transações reversíveis**

Talvez a vantagem mais significativa de usar SFTs em vez de NFTs seja que transações de tokens para endereços incorretos são reversíveis e reembolsáveis.

#### **2. Mais eficientes e econômicos**

Diferente dos NFTs, que precisam ser transferidos individualmente, os SFTs suportam transferências em lote. Isso significa que múltiplos SFTs podem ser transferidos em uma única chamada de programa, economizando tempo e reduzindo significativamente os custos de transação.

#### **3. Segurança aprimorada**

Os SFTs permitem transferências altamente seguras ao aprimorar os padrões existentes para NFTs.

## **Para que servem os SFTs?**

**Atualmente, os SFTs são usados principalmente em ambientes de jogos e metaverso, onde a atividade on-chain pode ser vinculada a ativos dentro do jogo**. Vejamos dois exemplos: gerenciar várias unidades do mesmo NFT e registrar conquistas em jogos.

### **1. Exemplo de SFT do Genopets**

Genopets é um [jogo de NFT na blockchain Solana](https://www.alchemy.com/list-of/web3-games-on-solana) que utiliza tanto NFTs quanto SFTs. Os jogadores podem comprar um pet único como NFT, e os recursos abundantes que coletam \(por exemplo, madeira, água, cristais, metal etc.\) estão disponíveis como SFTs.

Os SFTs são preferíveis para jogos com NFT porque permitem que os jogadores comprem e vendam múltiplos ativos \(por exemplo, 15 cristais de água\) em uma única transação. Os tokens fungíveis podem acomodar múltiplos ativos em um único programa \(ou seja, smart contract\), o que significa que sua transferência gera menos congestionamento e taxas de transação mais baixas do que os NFTs padrão, que são tratados individualmente.

### **2. Exemplo de conquistas dentro do jogo**

Os SFTs também são úteis para registrar o histórico de um jogo. Por exemplo, uma arma dentro do jogo pode ser criada como um SFT e, à medida que a arma é usada, ela ganha as características de um NFT, tornando-se um item único novo por causa do seu histórico registrado no jogo.

À medida que o item muda de mãos ao longo do tempo, novo histórico pode ser armazenado \(por exemplo, quantas vezes a arma foi usada, quantas vezes foi usada para matar outros jogadores etc.\), como as características tradicionais de armas em jogos web2.

## **Como os SFTs funcionam na Solana?**

**Os SFTs na Solana operam como um tipo único de conta ao qual metadados são anexados a um token para representar características em um ambiente de jogo ou metaverso.**

O funcionamento dos SFTs na Solana está relacionado à arquitetura única da blockchain, especificamente, à divisão de lógica e dados em dois componentes distintos chamados **programs** e **data accounts**, além do programa Token Metadata.

### **O que são programs e accounts na Solana?**

Diferente da maioria das blockchains, a Solana divide lógica e dados em dois componentes distintos chamados [programs e accounts](https://www.alchemy.com/overviews/solana-data-vs-program-accounts). Em vez de armazenar dados em variáveis como os smart contracts em [Solidity](https://www.alchemy.com/overviews/solidity), os programs na Solana podem interagir com dados externos armazenados em data accounts, e têm a capacidade de alterá-los.

Essa estrutura única torna os programs na Solana altamente performáticos, ao permitir que eles rodem em paralelo enquanto acessam várias accounts. A separação entre código executável e data accounts torna os programs na Solana mais modulares, já que não estão vinculados inerentemente a nenhum dado individual.

As accounts na Solana são arrays de bytes armazenados em um endereço específico. O endereço de uma account pode ser definido como a chave pública de um par criptográfico. Para acessar uma account, um program também precisa ter acesso à chave privada do par de chaves. Alguns tipos de programs têm a capacidade de alterar os dados dessa account.

Contas recém-criadas geralmente são inicializadas por um program marcado como o proprietário da account. O program define a estrutura dos dados alocados à account e também é responsável por fornecer instruções para a account.

**Os tipos de accounts na Solana incluem:‍**

1. ‍**Mint Accounts** - armazenam as informações globais de um token
1. **Token Accounts** - armazenam a relação entre a Wallet Account de um usuário e uma Mint Account.

<ImageBlock
  src="https://media.alchemy.com/1703698728-types-of-solana-account.png"
  alt="Diagrama dos tipos de conta do Solana: Mint Accounts e Token Accounts"
  width={1000}
  height={257}
  caption="Fonte: Documentação da Metaplex"
/>

#### **Em que os program derived addresses \(PDAs\) diferem de outras accounts na Solana?**

**PDAs são endereços de account derivados algoritmicamente da chave pública do program que é o proprietário da account onde residem, em vez de fazerem parte de um par criptográfico.**

As accounts localizadas em PDAs são projetadas para serem controladas pelo program específico a partir do qual seu endereço é gerado. Como os [Program Derived Addresses](https://www.alchemy.com/overviews/program-derived-address) são gerados algoritmicamente a partir da chave pública de um program, é impossível que dois programs diferentes gerem o mesmo PDA.

Os PDAs têm alguns usos importantes, como permitir que programs assinem [Cross-Program Invocations](https://www.alchemy.com/overviews/cross-program-invocation) e possibilitar a criação de múltiplas accounts dentro de um endereço que podem ser derivadas de forma determinística.

### **O que é o programa Token Metadata na Solana?**

O propósito do programa Token Metadata na Solana é permitir a adição de metadados extras a tokens, já que as Mint Accounts têm limitações na quantidade e nos tipos de dados que podem armazenar.

O programa Token Metadata faz parte do [protocolo Metaplex](https://www.alchemy.com/overviews/metaplex), que foi desenvolvido inicialmente para simplificar a criação de NFTs na Solana. No entanto, o programa também funciona com SFTs.

Uma Mint Account armazena apenas alguns atributos de dados sobre um token, como seu suprimento atual e authorities. As Mint Accounts não conseguem armazenar outros dados que apps e marketplaces usam. Para superar essa limitação, o programa Token Metadata oferece uma Metadata Account localizada em um PDA derivado do endereço da Mint Account. A Metadata Account incorpora muitos atributos valiosos, permitindo que tokens on-chain comuns se tornem ativos digitais.

<ImageBlock
  src="https://media.alchemy.com/1703698814-metadata-account.png"
  alt="Diagrama de uma Metadata Account do Solana em uma PDA derivada do endereço de uma Mint Account"
  width={1000}
  height={619}
  caption="Metadata Account"
/>

#### **O que é o padrão JSON?**

O padrão JSON é uma forma de adicionar dados a tokens armazenados off-chain, a fim de economizar nas taxas envolvidas em armazenar dados adicionais on-chain. O atributo URI nas Metadata Accounts aponta para um arquivo JSON off-chain que armazena informações úteis sobre tokens seguindo um determinado padrão.

Para garantir que o arquivo JSON não possa ser atualizado, ele pode ser armazenado usando uma solução de armazenamento permanente como o Arweave. Além disso, o atributo **Is Mutable** na Metadata Account pode ser usado para impedir que o atributo URI, e outros atributos, sejam alterados.

<ImageBlock
  src="https://media.alchemy.com/1703698932-off-chain-json-object.png"
  alt="Diagrama de um URI de Metadata Account apontando para um objeto JSON off-chain"
  width={1000}
  height={619}
  caption="Objeto JSON Off-Chain"
/>

### **Qual é a relevância do programa Token Metadata para os SFTs na Solana?**

**O token metadata é a forma como os SFTs na Solana se tornam funcionais em jogos ou ambientes de metaverso como objetos ricos em metadados, como armas.**

Um Semi-fungible Token na Solana consiste em uma Mint Account com duas propriedades:

1. Tem um supply maior ou igual a 0 \(por exemplo, mais de 1 token em circulação\)
1. Não tem casas decimais \(por exemplo, apenas números inteiros\)

A adição da Metadata Account mantém o controle da fungibilidade de um token por meio do seu atributo Token Standard. O programa atribui esse atributo automaticamente, e ele não pode ser atualizado manualmente. Além disso, o atributo FungibleAsset representa o token standard para SFTs.

<ImageBlock
  src="https://media.alchemy.com/1703699032-token-standard-for-sfts.png"
  alt="Diagrama do atributo de padrão de token FungibleAsset para SFTs"
  width={985}
  height={216}
  caption="Padrão de token para SFTs"
/>

A Metadata Account também contém outras informações importantes que especificam o SFT como uma arma específica dentro do jogo, por exemplo. Essas informações incluem a animação ou o logo que, sob o padrão JSON, podem ser armazenados off-chain usando o atributo 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>Nome do ativo.</p>", tooltip: "", icon: "" },
        id: 0,
      },
      {
        "1": { title: "<p><strong>symbol</strong></p>", tooltip: "", icon: "" },
        "2": { title: "<p>string</p>", tooltip: "", icon: "" },
        "3": { title: "<p>Símbolo do ativo.</p>", tooltip: "", icon: "" },
        id: 1,
      },
      {
        "1": { title: "<p><strong>description</strong></p>", tooltip: "", icon: "" },
        "2": { title: "<p>string</p>", tooltip: "", icon: "" },
        "3": { title: "<p>Descrição do ativo.</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 que aponta para o logo do ativo.</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 que aponta para a animação do ativo.</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 que aponta para uma URL externa que define o ativo — por exemplo, o site principal do jogo.</p>", tooltip: "", icon: "" },
        id: 5,
      },
      {
        "1": { title: "<p><strong>attributes</strong></p>", tooltip: "", icon: "" },
        "2": { title: "<p>array</p>", tooltip: "", icon: "" },
        "3": { title: "<p>Array de atributos que definem as características do ativo.</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>O tipo do atributo.</p>", tooltip: "", icon: "" },
        id: 7,
      },
      {
        "1": { title: "<p><strong>value</strong></p>", tooltip: "", icon: "" },
        "2": { title: "<p>string</p>", tooltip: "", icon: "" },
        "3": { title: "<p>O valor desse atributo.</p>", tooltip: "", icon: "" },
        id: 8,
      },
    ],
  }}
/>

<ImageBlock
  src="https://media.alchemy.com/1703699212-json-example-of-solana-sft-metadata.png"
  alt="Exemplo em JSON de metadata de SFT do Solana"
  width={1000}
  height={709}
  caption="Exemplo em JSON de metadata de SFT do Solana"
/>

## **Quais são as implicações dos SFTs para o futuro do Web3?**

A natureza híbrida dos SFTs abriu novas possibilidades para como os tokens podem ser usados para representar ativos digitais complexos em uma variedade de ambientes de forma econômica e altamente funcional.

Embora os casos de uso em jogos e metaverso sejam os mais populares para os SFTs, eles estão atraindo bastante atenção por sua flexibilidade aprimorada e pela oportunidade de reduzir custos armazenando dados off-chain.
