WEB3DEV

Cover image for Um Guia Passo a Passo Para Criar e Implantar um Contrato Inteligente NFT Não Transferível (Soulbound)
Panegali
Panegali

Posted on

Um Guia Passo a Passo Para Criar e Implantar um Contrato Inteligente NFT Não Transferível (Soulbound)

Elogiamos os NFTs por sua transferibilidade, mas a ideia estendida de Vitalik em uma postagem de blog intitulada "Soulbound", a longo prazo, está aparecendo literalmente em todas as conversas que acontecem sobre identidade, reputação e individuação na web3. Se você ainda não conferiu, corre lá para ler. Se você já o fez e precisa de uma atualização, aqui está um TLDR: ("muito longo; não li")

Tokens Soulbound (SBT) são apenas tokens não fungíveis (NFTs) que, "uma vez capturados, não podem ser transferidos ou vendidos a mais ninguém".

1

Nome provocante e travessuras do clã Kardashian à parte, existem (na vida real) algumas coisas que você simplesmente não pode vender. Pense em sua carteira de motorista, diploma universitário e identificação formal. E se tudo isso pudesse ser codificado na blockchain e verificado pelo token, cunhado como soulbound?

Soa interessante? Vamos FAZER um!

Construindo um NFT Soulbound

Neste tutorial, aprenderemos como:

  1. Criar um contrato inteligente NFT intransferível no Solidity
  2. Implantá-lo na Rede de Teste Rinkeby Ethereum
  3. e exibir o token Soulbound cunhado na Opensea

2

Se você seguiu o tutorial que publiquei sobre a construção de um contrato inteligente ERC721, já conhece a maior parte do código necessário para construí-los. Caso contrário, você sempre pode consultar esse vídeo para explorar mais. Então, vamos construir!

Etapa 1: Escrevendo o Contrato Inteligente NFT

Antes de implementarmos a lógica de não transferência em nosso contrato inteligente, precisaríamos de um código ERC-721 básico para NFTs. Para começar, vamos navegar até o OpenZeppelin Wizard, selecionar “ERC721” como nosso tipo de contrato e optar por alguns recursos como "Mintable", "Auto-increment IDs" e "Base URI" na barra lateral, conforme mostrado.

3

Etapa 2: Personalizando o código para torná-lo Soulbound

Agora que temos o código base pronto, vamos para o Compilador Solidity Remix clicando em "Open in Remix".

4

Quando estivermos no Remix, você poderá ver o seguinte código:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "@openzeppelin/[email protected]/token/ERC721/ERC721.sol";
import "@openzeppelin/[email protected]/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/[email protected]/access/Ownable.sol";
import "@openzeppelin/[email protected]/utils/Counters.sol"; 

contract SoulBoundTest is ERC721, ERC721URIStorage, Ownable {
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIdCounter;

    constructor() ERC721("SoulBoundTest", "SBT") {}

    function safeMint(address to, string memory uri) public onlyOwner {
        uint256 tokenId = _tokenIdCounter.current();
        _tokenIdCounter.increment();
        _safeMint(to, tokenId);
        _setTokenURI(tokenId, uri);
    }

    // As seguintes funções são substituições exigidas pela Solidity.

    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }
}
Enter fullscreen mode Exit fullscreen mode

Agora vamos adicionar um novo trecho de código ao contrato inteligente existente para bloquearmos a transferência do NFT e, eventualmente, torná-lo "Soulbound". Já existe uma API no contrato ERC721 do OpenZeppelin, usando-a podemos realmente controlar a transferibilidade de nossos tokens.

Se você navegar até OpenZeppelin API Docs, encontrará as seguintes funções:

  • _beforeTokenTransfer(address from, address to, uint256 tokenId)

Para bloquear transferências de token, adicione o seguinte ao seu código:

Arquivo: openzeppelin-contracts/contracts/token/ERC721/ERC721.sol

function _beforeTokenTransfer(
address from, 
address to, 
uint256 tokenId
) internal override virtual {
require(from == address(0), "Err: token transfer is BLOCKED");   
super._beforeTokenTransfer(from, to, tokenId);  
}
Enter fullscreen mode Exit fullscreen mode

Agora vamos entender a lógica por trás deste código.

Toda vez que esse código for executado, a declaração de exigência verificará: se o parâmetro from address na função está definido como zero. Se sim, permitirá que a ação aconteça e bloqueará todas as outras transferências para torná-lo um token intransferível.

Nota: Quando o address from == 0, significa que o token está sendo emitido ou cunhado e não transferido.

Etapa 3: Implantando o Contrato Inteligente NFT Soulbound

Para implantar o contrato inteligente diretamente do Remix, vá até a barra lateral e selecione " Deploy and Run Transaction " na guia. Em Environment defina como Injected Web3, selecione o contrato inteligente Soulbound que acabamos de criar no menu suspenso de contratos e clique em Deploy.

  • Provedor Injetado - Nome do Provedor: Para conectar o Remix a um provedor web3 injetado. O provedor injetado mais comum é a Metamask.

Certifique-se de que sua MetaMask esteja conectada à rede de teste Rinkeby Ethereum e que você tenha algum ether de teste para fazer as transações acontecerem.

5

Etapa 4: Adicionando ativos NFT ao IPFS via Pinata

Depois que o contrato for implantado com sucesso, a próxima coisa que precisaremos fazer é cunhar um NFT Soulbound. Para fazer isso, vamos primeiro definir o ativo NFT e os metadados usando o Pinata.

Se você não tiver uma conta Pinata, inscreva-se para uma conta gratuita aqui e conclua as etapas para verificar seu e-mail.

  • Depois de verificar sua conta no Pinata, navegue até a página "My Files" e clique no botão "Upload"
  • Carregue sua arte NFT e você verá seu arquivo de recurso de imagem sob a página Files junto com a coluna CID

6

Copie o CID clicando no botão copiar ao lado dele e use-o como um postfix (um agente de transferência de e-mails) para este URL " gateway.pinata.cloud/ipfs " para visualizar sua arte NFT.

Aqui está a imagem que usei.

7

Agora, vamos carregar mais um documento para o Pinata - metadados JSON. Para fazer isto, crie um arquivo JSON e adicione o seguinte código.

{
    "attributes" : [ {
      "trait_type" : "NFT",
      "value" : "Soulbound"
    }, {
      "trait_type" : "Asset",
      "value" : "Non-transferable Badge"
    }, {
        "trait_type" : "Badge",
        "value" : "Minting First Soulbound Token"
      }, {
        "trait_type" : "Type",
        "value" : "Demo"
      }   ],
    "description" : "This is a demo soulbound token mint",
    "image" : "https://gateway.pinata.cloud/ipfs/QmTY1jMAqabHUZFCj91ckwnCu3CPtJChpg345jdkxzj3ac",
    "name" : "Soulbound Token"
}
Enter fullscreen mode Exit fullscreen mode

Sinta-se à vontade para adicionar ou remover os atributos. Além disso, certifique-se de fornecer seu próprio URL de imagem IPFS!

Depois de terminar de editar o arquivo JSON, salve-o e faça o envio para o Pinata, seguindo os mesmos passos que seguimos para fazer o envio da imagem e copiar o CID para o arquivo JSON (vamos precisar disso na próxima etapa).

9

Etapa 5: Cunhando o NFT Soulbound

Nesta etapa, vamos finalmente cunhar o NFT e exibi-lo na Opensea. Para cunhar o NFT, volte para IDE do Remix, encontre o botão "Deployed Contracts" e clique na função "SafeMint".

10

Em SafeMint, insira o endereço da sua carteira em to, defina o URL do arquivo JSON em URI, seguindo o formato como "gateway.pinata.cloud/ipfs/CID_of_JSON_file". Aqui está o link IPFS para os metadados que carreguei no Pinata.

Uma vez que as configurações estejam definidas, clique em transact, confirme a transação e aguarde alguns segundos para que o NFT seja cunhado.

11

Agora, vamos para a Opensea (Rede de Teste) para ver o NFT Soulbound cunhado.

12

13

Como bloqueamos todas as ações de transferência, se você tentar enviar este NFT para outra carteira, será exibido um erro. Dessa forma, podemos confirmar que o NFT que acabamos de cunhar agora está vinculado às nossas almas (realisticamente, ao endereço da nossa carteira) e nunca pode ser transferido ou vendido para mais ninguém.

14

Repositório do código completo

Uau! Finalmente implantamos nosso primeiro NFT Soulbound na Rede de Teste Rinkeyby. Se você quiser dar uma olhada no código fonte completo, aqui está o repositório.


O que vem a seguir?

Um projeto divertido seria criar uma plataforma que permitisse aos criadores do curso emitir um NFT Soulbound como uma credencial para os alunos que concluírem o curso.


Artigo escrito por Krinza Momin e traduzido por Marcelo Panegali

Latest comments (0)