WEB3DEV

Cover image for Criando um NFT com o Stacks
Fatima Lima
Fatima Lima

Posted on • Atualizado em

Criando um NFT com o Stacks

Do que você vai precisar

Clarinet instalado na sua máquina (siga as instruções no link para instalá-lo)

IDE (Ambiente de Desenvolvimento Integrado) ou Editor de Texto (nós recomendamos o VSCode)

Carteira Hiro Web (saiba mais sobre a instalação aqui)

Tokens da Testnet STX (você pode conseguir alguns nesta faucet)

Visão Geral

O Stacks é uma blockchain de camada 1 que permite a execução de contratos inteligentes, mecanismo de consenso do Proof of Transfer (PoX - Prova de Transferência). O Stacks está associado ao ecossistema Bitcoin porque tem como objetivo aprimorar as potencialidades do Bitcoin, construindo em cima dele. O Stacks também é interessante porque suporta contratos inteligentes, para que os desenvolvedores possam construir dApps como exchanges descentralizadas, DAOs, mercados NFT, e muito mais!

Este guia demonstrará como criar e implantar o NFT na Testnet Stacks usando o Clarity. Clarity é uma linguagem de programação de contratos inteligentes que foi criada com o objetivo de escrever um código mais seguro e protegido.


Sumário

1 . Entendendo o Clarity

2 . Clarity vs padrões de NFT Solidity

3 . O que é o Clarinet

4 . Construindo um Contrato Inteligente NFT
..... . Configuração da Carteira Hiro Web
..... . O Básico do Clarity
..... . Criar e definir o Contrato Inteligente
..... . Implementando a lógica do contrato NFT
..... . Implantar o Contrato NFT para a Testnet Stacks
..... . Cunhar o NFT através do Sandbox Stacks


Entendendo o Clarity

Clarity é uma linguagem de contrato inteligente com um estilo Lisp criado para a blockchain Stacks. O Clarity é intencionalmente um Turing incompleto, pois evita "a complexidade do Turing". Isto permite uma análise estática completa de todo o gráfico de chamada de um determinado contrato inteligente. O que isto significa exatamente? Para que seu código de contrato Solidity seja compreensível pela EVM na maioria das cadeias baseadas em EVM, você deve compilá-lo em bytecode. Como você não precisa compilar seu código, a blockchain Stacks é única. Ao invés disso, o código executado pode ser facilmente auditado porque é legível por humanos. Outra vantagem que isto tem para os usuários é que, ao contrário das cadeias baseadas em EVM, o código fonte para um contrato inteligente é sempre acessível quando ele é implantado na blockchain Stacks. Finalmente, é possível analisar o código Clarity para custo de tempo de execução e uso de dados. Isto permite aos desenvolvedores prever o que um determinado programa Clarity fará, e quanto custará.

Clarity vs padrões de NFT Solidity

Uma comparação entre a característica do SIP-009 e o padrão análogo EIP 721 ajudará como um ponto de partida. O SIP-009 é o padrão Clarity para NFT e diz o seguinte;

(define-trait nft-trait

 (

   ;; ID do último token, limitado ao intervalo uint

   (get-last-token-id () (response uint uint))

   ;; URI para metadados associados ao token

   (get-token-uri (uint) (response (optional (string-ascii 256)) uint))

    ;; Detentor de um dado identificador de token

   (get-owner (uint) (response (optional principal) uint))

   ;; Transferência do remetente para um novo titular

   (transfer (uint principal principal) (response bool uint))

 )

)
Enter fullscreen mode Exit fullscreen mode

O fato de que o EIP 721 seja mais longo demonstra simplesmente uma parte que o aspecto do Clarity deixou de fora e enfatiza as diferenças entre os dois em termos de quem é capaz de transferir a propriedade de um NFT.

interface ERC721 /* is ERC165 */ {...

   function approve(address _approved, uint256 _tokenId) external payable;

   function setApprovalForAll(address _operator, bool _approved) external;

   function getApproved(uint256 _tokenId) external view returns (address);

   function isApprovedForAll(address _owner, address _operator) external view returns (bool)

}
Enter fullscreen mode Exit fullscreen mode

Você notará que o EIP 721 define a competência do proprietário do NFT para delegar, para um endereço aprovado, a capacidade de transferir o ativo em nome do proprietário.

No Clarity não há necessidade de um mecanismo de aprovação porque o Clarity deixa isso para o desenvolvedor do contrato inteligente. Embora isto seja ótimo para inovação e desenvolvimento rápido, é também uma preocupação do ponto de vista da segurança, pois significa que o criador do contrato pode inserir backdoors que permitem que qualquer NFT no contrato seja transferido para qualquer outra pessoa - sem o consentimento do proprietário.

O que é o Clarinet

Agora que você tem alguma familiaridade com o Stacks e o Clarity, vamos mergulhar na ferramenta que usaremos para construir nosso contrato inteligente, Clarinet. O Clarinet é uma ferramenta de linha de comando útil para o desenvolvimento eficiente de contratos inteligentes. Ela pode ser usada para desenvolver, testar, depurar e implantar seus contratos em ambientes locais e de produção. É semelhante a outras bibliotecas populares de contratos inteligentes da Web3, como o Hardhat.

O que é necessário

Para este tutorial, você deve ter uma instalação local do Clarinet. Consulte Instalando o Clarinet para instruções sobre como configurar seu ambiente local. Você também deve ter um editor de texto ou IDE para editar os contratos inteligentes do Clarity.

Se você estiver usando o Visual Studio Code, você pode instalar o plugin Visual Studio Code do Clarity.

Construindo um Contrato Inteligente NFT

Com essa descrição de alto nível do Clarity, vamos entrar em como realmente criar um contrato inteligente com ele.

Configuração da Carteira Hiro Web

A Carteira Hiro Web deve ser configurada para que possamos implantar nosso contrato inteligente para a Testnet Stacks. Você deve mudar a configuração da rede de sua carteira para Testnet uma vez que ela tenha sido configurada. Na página inicial da sua carteira, clique no botão ellipses ("..."), depois selecione Change Network (Mude a Rede).

A seguir, você precisará assegurar-se de ter alguns tokens da Testnet STX. Você pode solicitar alguns tokens na página Stacks Explorer Faucet. Basta conectar sua carteira, depois clicar no botão Request STX (Solicitar STX).

Sinta-se à vontade para continuar para a próxima seção depois de obter sua carteira e os tokens da Testnet STX!

O Básico do Clarity

A sintaxe do Clarity é semelhante à do LISP. Como resultado, haverá numerosos parênteses. Você pode descobrir outros parênteses, símbolos, sentenças, valores e muito mais dentro destes. As pessoas que são novas em linguagens semelhantes à LISP podem se sentir intimidadas por parecerem muito estranhas em comparação com as duas linguagens naturais, como muitas outras linguagens de programação.

Uma maneira de conceituar o código Clarity é pensar em listas dentro de listas. (O termo técnico para este tipo de expressões é "S-expression".) As expressões não fazem distinção entre dados e código, o que facilita um pouco as coisas! Aqui está um exemplo de uma expressão do Clarity.

Por exemplo, se escrevêssemos 4 + 5 no JS, obteríamos o resultado de 9.

A expressão idêntica seria representada como (+ 4 5) em Clarity.

Neste caso, estamos invocando a função +, que tem dois parâmetros: 4 e 5. Todas as funções Clarity funcionam desta forma, sendo tudo basicamente uma chamada de função com parâmetros passados.

Criar e configurar um projeto Clarinet

Abra uma janela do terminal e navegue até o diretório no qual você quer que este projeto fique. Então, execute o seguinte comando para criar um novo projeto clarinet e navegue dentro dele.


clarinet new nft-project && cd nft-project

Enter fullscreen mode Exit fullscreen mode

O comando clarinet acima cria um diretório de projetos boilerplate chamado nft-project que podemos usar para desenvolver contratos inteligentes rapidamente


clarinet contract new nft-trait; clarinet contract new nft-sample

Enter fullscreen mode Exit fullscreen mode

O comando acima cria dois arquivos .clar, que são o formato de arquivo Clarity. Um desses arquivos contém os metadados para nossos NFTs e o outro contém a lógica para nossos contratos NFT (por exemplo, nft-sample.clar) (por exemplo, nft-trait.clar). Dois arquivos de teste em formato TypeScript também serão produzidos em um diretório de teste.

Neste ponto, a configuração da pasta do seu projeto deve ser parecida com a seguinte:

├── Clarinet.toml

├── contracts

│ ├── nft-sample.clar

│ └── nft-trait.clar

├── settings

│ ├── Devnet.toml

│ ├── Mainnet.toml

│ └── Testnet.toml

└── tests

├── nft-sample_test.ts

└── nft-trait_test.ts

Na próxima seção, começaremos a configurar e implementar o contrato inteligente NFT.

Criar e definir o Contrato Inteligente

Implementando a Norma SIP-009

Para garantir que o contrato que estamos construindo esteja de acordo com a SIP-009, devemos configurar algumas dependências antes de começarmos a escrever o código do contrato inteligente. Abra o Clarinet.toml e edite a seção contratos.nft-sample (em torno da linha 11-12) para combinar com a seguinte configuração:


[contracts.nft-sample]

path = "contracts/nft-sample.clar"

depends_on = ["nft-trait"]
Enter fullscreen mode Exit fullscreen mode

Nosso contrato inteligente cumpre com as características necessárias especificadas na norma SIP-009, graças à configuração descrita acima. Se não implementarmos as características configuradas, nossa implantação para ambientes de teste e produção falhará.

Em seguida, abra o arquivo nft-trait.clar. Copie o seguinte código e substitua-o pelo conteúdo já existente no arquivo:


define-trait nft-trait

  (

    ;;  ID do último token, limitado ao intervalo uint

    (get-last-token-id () (response uint uint))

    ;; URI para metadados associados ao token

    (get-token-uri (uint) (response (optional (string-ascii 256)) uint))

     ;; Proprietário de um dado identificador de token

    (get-owner (uint) (response (optional principal) uint))

    ;; Transferência do remetente para um novo titular

    (transfer (uint principal principal) (response bool uint))

  )

)
Enter fullscreen mode Exit fullscreen mode

Então, salve o arquivo. O Código Clarity acima estabelece as funções que nosso contrato deve atender. Estas funções devem ser familiares a você, pois as discutimos na seção anterior.

Implementando a lógica do contrato NFT

Vamos agora atualizar o arquivo nft-sample.clar com a lógica de contrato inteligente NFT. Podemos cunhar NFTs usando o contrato na blockchain Stacks. Abra o arquivo e adicione o seguinte código ao conteúdo existente:


;; usando a interface da SIP009 (testnet)

;; característica configurada e implantada de ./settings/Devnet.toml

(impl-trait 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.nft-trait.nft-trait)

;; declarar um novo NFT

(define-non-fungible-token NFT-SAMPLE uint)

;; armazenar a última identificação do token emitido

(define-data-var last-id uint u0)

;; cunhar um novo NFT

(define-public (claim)

  (mint tx-sender))

;; SIP009: Transferir token para um determinado titular 

(define-public (transfer (token-id uint) (sender principal) (recipient principal))

  (begin

     (asserts! (is-eq tx-sender sender) (err u403))

     ;; Certifique-se de substituir o NFT-SAMPLE

     (nft-transfer? NFT-SAMPLE token-id sender recipient)))

(define-public (transfer-memo (token-id uint) (sender principal) (recipient principal) (memo (buff 34)))

  (begin

    (try! (transfer token-id sender recipient))

    (print memo)

    (ok true)))

;; SIP009: Obter o proprietário da ID de um determinado token

(define-read-only (get-owner (token-id uint))

  ;; Certifique-se de substituir o NFT-NAME

  (ok (nft-get-owner? NFT-SAMPLE token-id)))

;; SIP009: Obter a ID do último token

(define-read-only (get-last-token-id)

  (ok (var-get last-id)))

;; SIP009: Obter o URI do token. Você pode configurá-lo para qualquer outro URI

(define-read-only (get-token-uri (token-id uint))

  (ok (some "https://token.stacks.co/{id}.json")))

;; Internal - Cunhar o novo NFT

(define-private (mint (new-owner principal))

    (let ((next-id (+ u1 (var-get last-id))))

      (var-set last-id next-id)

      ;; Você pode substituir NFT-SAMPLE por outro nome, se desejar

      (nft-mint? NFT-SAMPLE next-id new-owner)))
Enter fullscreen mode Exit fullscreen mode

Na próxima seção, demonstraremos como verificar seus contratos para ter certeza de que eles são implantáveis.

Testando o Contrato Inteligente em um Ambiente Local

O Clarity é uma linguagem interpretada, o que significa que ele não compila código até um nível inferior antes da execução; em vez disso, o código é executado no mesmo formato no tempo de execução. Isto torna o código mais lento, mas mais transparente. Para verificar se nosso código do Clarity está sintaticamente correto, podemos executar a verificação do comando Clarinet a partir do diretório nft-project.

Image description

Você pode receber algumas advertências; no entanto, não se preocupe com essas advertências para o objetivo deste guia.

Antes de implantar a Testnet Stacks, é uma boa prática verificar algumas funções para ter certeza de que as respostas são as que esperamos. Podemos inicializar o console clarinet para fazer isto:


clarinet console

Enter fullscreen mode Exit fullscreen mode

Uma vez inicializado o console, você verá seu endereço de contrato e funções públicas disponíveis em seu contrato. Haverá também uma lista de contas de teste que estão associadas ao seu console local clarinet. Execute o comando abaixo para chamar a função de solicitação do nosso contrato inteligente, que irá cunhar um NFT em nosso ambiente local.


(contract-call? .nft-sample claim)

Enter fullscreen mode Exit fullscreen mode

Você verá uma resposta semelhante a esta:

Image description

Se tudo correr bem, passe para a próxima seção onde implantaremos nosso contrato NFT para a Testnet Stacks 👀

Implantar o Contrato NFT para a Testnet Stacks

Esta seção demonstrará como implantar seu contrato NFT para a Testnet Stacks usando o Sandbox do Stacks Explorer. Antes de começarmos, verifique se você já tem instalada e configurada a Carteira Hito. Além disso, certifique-se de ter alguns tokens de teste STX para taxas de gas (você pode obter algumas na faucet).

Assim que sua carteira estiver configurada, conecte-a ao Sandbox do Stacks Explorer e navegue até a página Write & Deploy. Copie e cole o código de seu arquivo nft-sample.clar e então preencha o nome do contrato (em nosso exemplo, é "nft-sample") se você não quiser que o nome gerado aleatoriamente seja fornecido a você.

A seguir, clique no botão deploy. Você deve obter um prompt da janela da carteira Hiro com informações sobre a transação. Verifique se a transação parece correta, depois clique em Confirm (Confirmar).

Image description

A mineração (transação/processo) pode continuar por um curto período de tempo.

Na página de transações do Stacks explorer ou na seção de atividades de sua carteira Hiro, você pode acompanhar a transação.

A homepage do nosso contrato pode ser acessada procurando o endereço do contrato ou selecionando a transação em nossa carteira uma vez que tenhamos verificado que o contrato foi minerado. A página do contrato exibirá o nome do contrato, endereço do implantador, taxas para implantar o contrato, o código fonte e o número do bloco em que foi minerado.

Onde está o NFT que você cunhou recentemente, você pode estar se perguntando? Tecnicamente falando, ainda não foi cunhado. Nós só desenvolvemos e implantamos o contrato NFT até agora. Nós o acompanharemos no processo de cunhagem na seção seguinte, onde você poderá ver seu NFT na carteira do Hiro e solicitá-lo. Para ter tempo e aprender mais sobre a página do explorador, sinta-se à vontade para fazê-lo e, em seguida, prossiga para a próxima seção quando estiver pronto.

Cunhar o NFT através do Sandbox Stacks

Este é o momento pelo qual você estava esperando! Está na hora de cunhar!

Para cunhar o NFT, precisaremos chamar a função de solicitação do nosso contrato NFT. Navegue até a página do contrato Call (o f na barra lateral esquerda), depois insira o endereço de seu contrato (ou seja, ST12KGMZCKXERR1VG1TFEQQZ3VQXSMVVC3J31S604.nft-sample) e a sandbox deve detectar o endereço e o nome. Clique no botão Get (Obter) contrato e você deve ver as funções que podem ser chamadas listadas na tabela assim:

Image description

Clique na função Claim e, em seguida, clique na função Call. Você terá um prompt em sua carteira Hiro. Verifique se a função de solicitação está sendo chamada e, em seguida, confirme a transação. Sua transação pode levar alguns minutos para ser confirmada. Esteja à vontade para fazer uma pausa rápida; ela deve estar confirmada assim que você retornar. Se ainda demorar um pouco, você pode clicar no ícone Increase fee* (Aumentar taxa) em sua transação dentro de sua aba de atividade da carteira Hiro.

Uma vez minerada a transação, você pode ver seu NFT dentro da aba Balances (Saldos) em sua carteira Hiro ou no explorador Stacks, indo à página de endereço de sua carteira pessoal e olhando para a aba Collectibles (Colecionáveis).

Image description

Um trabalho incrível! Você aprendeu como criar, implantar e executar um contrato NFT para a Blockchain Testnet Stacks.

Esse artigo foi escrito por Shabbir e traduzido por Fátima Lima. O original pode ser lido aqui.

Top comments (0)