WEB3DEV

Cover image for Escrever contratos NEP-171 NFT em Rust
Diogo Jorge
Diogo Jorge

Posted on • Atualizado em

Escrever contratos NEP-171 NFT em Rust

Aprenda a usar o padrão de token NEP-171 atualizado no NEAR

Introdução

Tokens não fungíveis são registros exclusivos de propriedade no blockchain. Normalmente, um NFT está vinculado a algo interessante e raro, como uma obra de arte, um ingresso para um show, um gato colecionável, um nome de domínio ou um objeto físico real. Os NFTs podem ser comprados, vendidos, doados e podem até ser cunhados ou destruídos, dependendo das regras do contrato. Cryptokitties, Super rare e Bored Ape Yacht Club são apenas alguns exemplos populares de projetos NFT baseados em Ethereum. Podemos implementar NFTs com a mesma facilidade na NEAR.

Neste tutorial, criaremos uma arte NFT colecionável simples chamada Flarn, que consiste em um nome, uma descrição e uma imagem JPEG. Nosso contrato inteligente permitirá que os Flarns sejam criados, coletados e negociados na blockchain NEAR.

Pré-requisitos

Requisitos

OBSERVAÇÃO PARA USUÁRIOS DE MAC M1: O repositório de exemplos NFT usado por este tutorial atualmente não pode ser compilado em produtos Apple com um chip M1. Se você não tiver acesso a um Mac baseado em Intel, poderá fazer este tutorial no GitPod. Abra este link em uma guia separada, então pule para a próxima seção: Conhecendo o contrato NFT.

Sobre os padrões NFT

Existem muitos padrões para NFTs! No entanto, o mais amplamente utilizado é de longe o ERC721 da Ethereum padrão, que define como os NFTs podem ser criados e transferidos entre outras coisas. Esse padrão funciona bem, mas como todos os padrões ERC, ele é definido apenas para a blockchain Ethereum. Os recentes altos preços de gás na Ethereum geraram muito interesse em alternativas mais acessíveis, como o NEAR.

Para apoiar o desenvolvimento NFT na NEAR, os principais desenvolvedores e partes interessadas do mercado propuseram o novo padrão NEP-171. O NEP-171 tenta lidar com todos os mesmos casos de uso de NFT que o ERC721, bem como suporte opcional para vários recursos avançados para mercados de NFT. Por exemplo, os NFTs NEP-171 podem ser oferecidos para venda em vários mercados ao mesmo tempo, e distribuições complexas de royalties estão integradas. Além disso, NFTs podem ser anexados diretamente a contratos inteligentes, como uma forma de pagamento ou como uma parte de projetos de trocas mais complexos.

Configurando o projeto

Instale o alvo WebAssembly usando rustup:

NEAR usa WebAssembly como sua máquina virtual. Muitas linguagens podem compilar para WebAssembly, mas os desenvolvedores NEAR core recomendam que todos os contratos inteligentes financeiros sejam escritos na linguagem Rust. Antes de começarmos a trabalhar no contrato Rust, precisamos instalar as ferramentas de compilação cruzada que compilam um contrato inteligente Rust no WebAssembly, usando Rustup. Execute este comando:

rustup target add wasm32-unknown-unknown
Enter fullscreen mode Exit fullscreen mode

Saída de exemplo:

**info:** downloading component 'rust-std' for 'wasm32-unknown-unknown'
**info:** installing component 'rust-std' for 'wasm32-unknown-unknown'
15.6 MiB /  15.6 MiB (100 %) 8.7 MiB/s in  1s ETA:  0s
Enter fullscreen mode Exit fullscreen mode

Clone o repositório NEAR NFT

Neste tutorial, modificaremos o código de exemplo NFT-171 da NEAR do repositório NEAR no Github. No Linux, Unix ou macOS, execute esses comandos no bash (ou zsh) shell para clonar esse repositório e instalar seus requisitos:

git clone https://github.com/near-examples/NFT
Enter fullscreen mode Exit fullscreen mode

Saída de exemplo:

Cloning into 'NFT'...
remote: Enumerating objects: 1334, done.
remote: Counting objects: 100% (456/456), done.
remote: Compressing objects: 100% (90/90), done.
remote: Total 1334 (delta 397), reused 398 (delta 363), pack-reused 878
Receiving objects: 100% (1334/1334), 1.41 MiB | 2.40 MiB/s, done.
Resolving deltas: 100% (642/642), done.
Enter fullscreen mode Exit fullscreen mode

Para construir o exemplo, insira este comando no shell:

CD NFT
./build.sh
Enter fullscreen mode Exit fullscreen mode

Como esta é nossa primeira compilação, Cargo e Rust farão o download e criarão todas as dependências. Isto pode levar algum tempo. Quando terminar, você deve ver algo assim no final da saída:

Compiling near-sdk v3.1.0
Compiling near-contract-standards v3.2.0
Compiling approval-receiver v0.0.1 (/Users/mykle/Documents/near/flarns2.0/NFT/test-approval-receiver)
Compiling token-receiver v0.0.1 (/Users/mykle/Documents/near/flarns2.0/NFT/test-token-receiver)
Compiling non-fungible-token v1.1.0 (/Users/mykle/Documents/near/flarns2.0/NFT/nft)
Finished release [optimized] target(s) in 2m 07s
Enter fullscreen mode Exit fullscreen mode

Também podemos executar todos os testes de unidade incluídos com este comando:

cargo test -- --nocapture
Enter fullscreen mode Exit fullscreen mode

A saída do teste de unidade é confusa, mas no final você verá um resumo dos resultados.

test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Enter fullscreen mode Exit fullscreen mode

Se você ver test result: ok, tudo está bem.

NOTA: No momento em que este livro foi escrito, esses testes falharam em Macs baseados em M1, com um erro sobre get_fault_info. Recomendamos que os usuários do M1 usem o Gitpod para concluir este tutorial.

Conhecendo o Contrato NFT

O contrato inteligente Rust que modificaremos está em nft/src/lib.rs. Abra esse arquivo em seu editor. Faremos algumas alterações simples.

Se você navegar neste contrato, verá que ele implementa apenas três métodos: novo e new_default_meta para inicializar um novo contrato, e nft_as para cunhar um novo NFT. Mas o contrato também importa símbolos, métodos e outros recursos de um grupo de pacotes relacionados que juntos fornecem todos os recursos principais e opcionais do padrão NEP-171. Observe também que um amplo conjunto de testes de unidade compõe mais da metade do arquivo de contrato. Também há muitos testes nos módulos importados. Faremos todos os testes depois de modificar o contrato, para ter certeza de que não quebramos nada.

Personalize o contrato

A NEP-171 exige que nosso contrato tenha um nome legível por humanos e um símbolo abreviado para uso em mercados e carteiras. Estes são definidos no new_default_meta função que começa na linha 52.

Vamos modificar essa função para usar nosso próprio nome e símbolo. Mude o nome para "CryptoFlarns" e o símbolo para "FLARN". (Altere também o campo "base_uri" conforme mostrado; explicaremos o motivo em breve.) Quando terminar, o método deve ficar assim:



///Inicializa os contrato de propriedade de 'owner_id' com
/// metadados padrão (apenas para fins de exemplo)  
    #[init]
    pub fn new_default_meta(owner_id: ValidAccountId) ->  Self {
        Self::new(
            owner_id,
            NFTContractMetadata {
                spec: NFT_METADATA_SPEC.to_string(),
                name: "CryptoFlarns".to_string(),
                symbol: "FLARN".to_string(),
                icon: Some(DATA_IMAGE_SVG_NEAR_ICON.to_string()),
                base_uri: Some("https://nft.storage/".to_string()),
                reference: None,
                reference_hash: None,
            },
        )
    }
Enter fullscreen mode Exit fullscreen mode

Os contratos NEP-171 também podem ter um ícone opcional, que é mostrado na carteira NEAR e usado por marketplaces e outros aplicativos NFT. Seu contrato não precisa ter um ícone, mas como este exemplo de contrato define um, vamos alterá-lo para algo mais colorido.

A NEP-171 informa que o campo ícone deve ser codificado em formato de data URI , para compatibilidade máxima com navegadores da web. O ícone no contrato de exemplo é um arquivo SVG simples, URI de dados codificado de acordo com este guia de Jenny Knuth. Outros formatos de arquivo de imagem, como GIF e PNG, também podem ser codificados por URI de dados, mas os SVGs são bons porque podem ser bem pequenos.

Aqui está o nosso ícone de exemplo muito simples:

Image description

O ícone é definido na linha 39 do contrato de exemplo, como uma longa string de texto. Em seu editor, altere essa linha muito longa para esta linha ainda mais longa:

const DATA_IMAGE_SVG_NEAR_ICON: &str  =  "data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%2764%27%20height%3D%2764%27%20xml%3Aspace%3D%27preserve%27%3E%3Crect%20width%3D%27100%25%27%20height%3D%27100%25%27%20fill%3D%27transparent%27%2F%3E%3Crect%20style%3D%27stroke%3Anone%3Bstroke-width%3A1%3Bstroke-dasharray%3Anone%3Bstroke-linecap%3Abutt%3Bstroke-dashoffset%3A0%3Bstroke-linejoin%3Amiter%3Bstroke-miterlimit%3A4%3Bfill%3A%23ffec20%3Bfill-rule%3Anonzero%3Bopacity%3A1%27%20vector-effect%3D%27non-scaling-stroke%27%20x%3D%27-32%27%20y%3D%27-32%27%20rx%3D%270%27%20ry%3D%270%27%20width%3D%2764%27%20height%3D%2764%27%20transform%3D%27translate%2832%2032%29%27%2F%3E%3Ccircle%20style%3D%27stroke%3A%23000%3Bstroke-width%3A0%3Bstroke-dasharray%3Anone%3Bstroke-linecap%3Abutt%3Bstroke-dashoffset%3A0%3Bstroke-linejoin%3Amiter%3Bstroke-miterlimit%3A4%3Bfill%3A%2370ff10%3Bfill-rule%3Anonzero%3Bopacity%3A1%27%20vector-effect%3D%27non-scaling-stroke%27%20r%3D%2735%27%20transform%3D%27matrix%28.37%200%200%20.37%2032%2032%29%27%2F%3E%3C%2Fsvg%3E";
Enter fullscreen mode Exit fullscreen mode

Agora construa e teste o contrato novamente, para confirmar que não há erros de digitação:

./build.sh
cargo test -- --nocapture
Enter fullscreen mode Exit fullscreen mode

Procurar Finalizado após a construção e test result: ok após os testes.

Projetando nosso primeiro NFT

Para este exemplo, vamos criar um novo tipo de arte NFT digital colecionável chamada Flarn. Cada NEP-171 Flarn terá um Token ID exclusivo, um Owner ID para registrar a propriedade e três partes de metadados: um nome, uma descrição e uma imagem JPEG.

Definir Metadados NFT

Na verdade, o NEP-171 não exige que os NFTs tenham nenhum metadado; você ainda pode cunhar e negociar registros de propriedade completamente em branco, se é isso que você gosta. Mas sem metadados, os NFTs seriam muito chatos! Aqui estão os tipos de metadados NFT suportados pelo padrão:

  • título: O nome desse token específico.
  • descrição: Uma descrição mais longa do token.
  • media: URL para mídia associada.
  • media_hash: o hash sha256 codificado em base64 do conteúdo referenciado pelo campo media. Isso é para proteger contra adulteração fora da cadeia.
  • cópias: quantas cópias deste token específico existem
  • emitido_em: Carimbo de data e hora em que o token foi emitido ou cunhado
  • expira_em: carimbo de data/hora quando o token expira
  • começa em: Carimbo de data/hora quando o token começa a ser válido
  • atualizado_em: carimbo de data/hora quando o token foi atualizado pela última vez
  • extra: qualquer coisa extra que o NFT deseja armazenar na cadeia. Pode ser JSON em string.
  • referência: URL para um arquivo JSON off-chain com mais informações.
  • referência_hash: hash sha256 codificado em Base64 de JSON do campo de referência. Necessário se referência está incluído.

Para o nosso exemplo, usaremos título, descrição e media, e vamos ignorar o resto. Uma vez que nós usamos media, somos obrigados a usar também media_hash. podemos sair cópias em branco para dizer que nossos flarns são únicos; O número de cópias será 1 por default, se não for especificado.

Os campos de metadados integrados do NEP-171 destinam-se a cobrir as principais necessidades da maioria dos projetos NFT. Se algum projeto NFT futuro exigir outros campos de metadados que não estejam nesta lista, o NEP-171 oferece duas opções. Você pode codificá-lo como uma string JSON no campo extra , ou colocá-lo fora da cadeia e armazenar um link para ele na referência campo. (Mas se você usar referência, você também precisa armazenar um hash dos dados no campo referência_hash , para evitar adulterações.)

Crie sua obra-prima

Você pode inventar seus próprios metadados neste ponto ou pode usar estes dados de exemplo:

  • título: Alice
  • descrição: Alice é excepcionalmente adorável e adora longas caminhadas na praia.
  • media: \

Image description

Incluir dados fora da cadeia

Devido ao alto custo de armazenamento da Ethereum, a maioria dos Ethereum NFTs de mídia digital não armazena a mídia na blockchain. O armazenamento on-chain é muito mais barato na NEAR, mas como os arquivos de mídia são grandes, ainda será econômico armazenar nossa imagem Flarn em outro lugar. O campo media de nosso registro on-chain conterá uma URL apontando para nossa imagem off-chain. Poderíamos hospedar essa imagem em qualquer lugar da Web que escolhermos, mas seria bom colocá-la em algum lugar sempre online, descentralizado e gratuito.

Carregue a imagem para o armazenamento NFT

Para este exemplo, usaremos o NFT.Storage, serviço livre construído especificamente para armazenar dados NFT fora da cadeia. O NFT.Storage oferece armazenamento descentralizado gratuito e largura de banda para NFTs em IPFS e Filecoin.

Passos:

  1. Registre uma conta e faça login em nft.storage.
  2. Vou à seção Files e clique no botão Upload para carregar sua imagem Flarn.

Image description

  1. Depois de fazer o upload do arquivo, selecione Action -> View URL para ver seu upload em uma nova guia do navegador. Em seguida, copie a URL dessa guia. Essa é a URL do seu conteúdo, com base em uma string IPFS Content-ID. Deve ser algo como isto:
https://ipfs.io/ipfs/bafkreic2y4z2hvfkzalogw3yeh5hntbvr4op4a5ccjo5zfhouss4mozlnm
Enter fullscreen mode Exit fullscreen mode

Image description

  1. NEP-171 requer o campo base_uri do contrato para apontar para um site que terá acesso confiável aos URLs nos campos media e referência . É por isso que definimos base_uri para https://nft.storage/ quando customizamos o contrato. Como nossa mídia é armazenada com NFT.Storage, podemos usar sua URL para este campo.

Gere o media_hash

A totalidade dos nossos arquivos de mídia armazenados no media_hash campo, deve ser um hash SHA256 codificado em Base64 dos dados originais, para provar que o arquivo não foi adulterado. NEP-171 requer codificação Base64 do hash para portabilidade máxima entre plataformas. No entanto, a maioria das ferramentas SHA256 on-line e de linha de comando geram hashes como Hexadecimal+Unicode, portanto, também precisaremos converter isso para Base64.

Existem algumas maneiras diferentes de fazer isso. Em um sistema baseado em UNIX, use este comando:

gato flarn.jpg | shasum -a 256 | xxd -r -p | base64
Enter fullscreen mode Exit fullscreen mode

Na web, você pode gerar o hash de mídia em duas etapas.

1: Envie seu arquivo para esta calculadora online SHA256 para gerar um hash SHA256 em formato hexadecimal.

https://learn.figment.io/https://raw.githubusercontent.com/figment-networks/learn-tutorials/master/assets/nep171/sha256.png

2: Copie a string hexadecimal dessa ferramenta e cole-a neste conversor online Hex-Base64:

Image description

NOTA: não faça upload de dados confidenciais ou privados para esses serviços da web! Use os comandos UNIX acima se a privacidade for importante.

Se você usou nosso exemplo de imagem Flarn, as strings devem corresponder às capturas de tela. Se você estiver usando sua própria imagem, as strings serão diferentes.

Monte as peças

Agora que escolhemos nossos metadados, armazenamos nossa mídia fora da cadeia e geramos o URL de mídia e o hash de mídia, podemos construir nosso registro NFT Token. Use seu editor para criar um arquivo no diretório atual chamado token.json, contendo um único objeto de metadados JSON. Você pode começar colando neste texto:

{
    "title": "Alice",
    "description": "Alice is uniquely adorable & loves long walks on the beach.",
    "media": "https://bafyreiabag3ztnhe5pg7js4bj6sxuvkz3sdf76cjvcuqjoidvnfjz7vwrq.ipfs.dweb.link/",
    "media_hash": "e8MzVN0Pq1ztofypQoperJC8gWo2xfs8f9few+SwHes="
}
Enter fullscreen mode Exit fullscreen mode

Agora edite os seguintes valores:

  • Use a URL obtida em NFT.storage como o valor de "media".
  • Use o hash base64 sha256 que você gerou para "media_hash", se estiver usando um arquivo de imagem diferente do nosso exemplo.
  • Use seu próprio NEAR testnet id para "receiver_id", para que você seja o proprietário do NFT recém-criado.
  • Mudar título e descrição para o que você quiser, ou deixe-os como estão.

Salve o arquivo e verifique-o em JSONLint.

Image description

Implantando e usando o contrato

Podemos usar o NEAR CLI para implantar esse contrato e testar se está funcionando. Se você configurou seu ambiente nos Tutoriais 1 e 2, a CLI se conectará à rede de teste de alta disponibilidade do DataHub. Se você não tiver acesso ao DataHub, ainda poderá executar a CLI com seus padrões, mas o nó testnet padrão pode ser mais lento para responder.

Conecte-se

Faça login na sua conta testnet com quase-cli executando o seguinte comando em seu terminal.

near login
Enter fullscreen mode Exit fullscreen mode

Isso abrirá sua carteira testnet NEAR em um navegador da Web, para que você possa autorizar o NEAR CLI com sua conta testnet. Feito isso, você deve ver algo como esta saída no terminal:

Logged in as [ **accountname.testnet** ] with public key [ **ed25519:BDGh7Q...** ] successfully
Enter fullscreen mode Exit fullscreen mode

Para tornar este tutorial mais fácil de copiar/colar, vamos definir uma variável de ambiente com o ID da sua conta testnet. Execute o comando abaixo, substituindo accountname.testnet com o campo Account ID gerado pornear de login

export ID=accountname.testnet
Enter fullscreen mode Exit fullscreen mode

Teste se a variável de ambiente está definida corretamente executando:

echo $ID
Enter fullscreen mode Exit fullscreen mode

Verifique se o ID da conta correto está impresso no terminal. Se tudo estiver correto, agora você pode implantar seu contrato.

Implante o contrato

Execute este comando para implantar o contrato em sua conta testnet:

near deploy --wasmFile res/non_fungible_token.wasm --accountId $ID
Enter fullscreen mode Exit fullscreen mode

Se você já implantou um contrato nesta conta, será perguntado se deseja substituí-lo. Responder e aqui:

This account already has a deployed contract [G6TEwD4VXXYaUjgMmTw7y41R4x2DyDjcbXdX4xkESnXX]. Do you want to proceed? (y/n)
Enter fullscreen mode Exit fullscreen mode

Saída de exemplo:

Starting deployment. Account id: accountname.testnet, node: https://rpc.testnet.near.org, helper: https://helper.testnet.near.org, file: res/non_fungible_token.wasm
Transaction Id F9p9s7DKNkekZYeBcSiYt2ZMzwpuVsugDDVGcDizxBNN
To see the transaction in the transaction explorer, please open this url in your browser
https://explorer.testnet.near.org/transactions/F9p9s7DKNkekZYeBcSiYt2ZMzwpuVsugDDVGcDizxBNN
Done deploying to accountname.testnet
Enter fullscreen mode Exit fullscreen mode

O link fornecido dará detalhes completos sobre a implantação no NEAR Explorer.

Image description

Inicialize o contrato

Um contrato inteligente pode definir um método de inicialização que pode ser usado para definir o estado inicial do contrato. Este contrato de exemplo NFT deve ser inicializado antes do uso. Execute este comando para inicializá-lo com os metadados padrão e defina o proprietário para sua conta de desenvolvedor:

near call $ID new_default_meta '{"owner_id": "'$ID'"}' --accountId $ID
Enter fullscreen mode Exit fullscreen mode

Você pode visualizar os metadados do contrato executando a chamada view:

near view $ID nft_metadata
Enter fullscreen mode Exit fullscreen mode

Exemplo de resposta:

View call: accountname.testnet.nft_metadata()
{
    spec: 'nft-1.0.0',
    name: 'CryptoFlarns',
    symbol: 'FLARN',
    icon: "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 288 288'%3E%3Cg id='l' data-name='l'%3E%3Cpath d='M187.58,79.81l-30.1,44.69a3.2,3.2,0,0,0,4.75,4.2L191.86,103a1.2,1.2,0,0,1,2,.91v80.46a1.2,1.2,0,0,1-2.12.77L102.18,77.93A15.35,15.35,0,0,0,90.47,72.5H87.34A15.34,15.34,0,0,0,72,87.84V201.16A15.34,15.34,0,0,0,87.34,216.5h0a15.35,15.35,0,0,0,13.08-7.31l30.1-44.69a3.2,3.2,0,0,0-4.75-4.2L96.14,186a1.2,1.2,0,0,1-2-.91V104.61a1.2,1.2,0,0,1,2.12-.77l89.55,107.23a15.35,15.35,0,0,0,11.71,5.43h3.13A15.34,15.34,0,0,0,216,201.16V87.84A15.34,15.34,0,0,0,200.66,72.5h0A15.35,15.35,0,0,0,187.58,79.81Z'/%3E%3C/g%3E%3C/svg%3E",
    base_uri: null,
    reference: null,
    reference_hash: null
}
Enter fullscreen mode Exit fullscreen mode

Cunhe um NFT!

Agora vamos cunhar nosso primeiro token! Execute o seguinte comando para criar uma cópia do seu NFT, usando os metadados em token.json:

near call $ID nft_mint '{"token_id": "0", "receiver_id": "'$ID'", "token_metadata": '"`cat token.json`}" --accountId $ID --deposit 0.1
Enter fullscreen mode Exit fullscreen mode

Exemplo de resposta:

Scheduling a call: accountname.testnet.nft_mint({"token_id": "2", "receiver_id": "accountname.testnet", "token_metadata": {
            "title": "Alice",
            "description": "Alice is uniquely adorable & loves long walks on the beach.",
            "media": "https://bafyreiabag3ztnhe5pg7js4bj6sxuvkz3sdf76cjvcuqjoidvnfjz7vwrq.ipfs.dweb.link/",
            "media_hash": "e8MzVN0Pq1ztofypQoperJC8gWo2xfs8f9few+SwHes="
}}) with attached 0.1 NEAR
Doing account.functionCall()
Transaction Id HQtMD9M4WnjJ4bJ8xz2A82pBMDNgMthkaegbNb4GsP7f
To see the transaction in the transaction explorer, please open this url in your browser
https://explorer.testnet.near.org/transactions/HQtMD9M4WnjJ4bJ8xz2A82pBMDNgMthkaegbNb4GsP7f
{
    token_id: '2',
    owner_id: 'accountname.testnet',
    metadata: {
        title: 'Alice',
        description: 'Alice is uniquely adorable & loves long walks on the beach.',
        media: 'https://bafyreiabag3ztnhe5pg7js4bj6sxuvkz3sdf76cjvcuqjoidvnfjz7vwrq.ipfs.dweb.link/',
        media_hash: 'e8MzVN0Pq1ztofypQoperJC8gWo2xfs8f9few+SwHes=',
        copies: null,
        issued_at: null,
        expires_at: null,
        starts_at: null,
        updated_at: null,
        extra: null,
        reference: null,
        reference_hash: null
    },
    approved_account_ids: {}
}
Enter fullscreen mode Exit fullscreen mode

O contrato cunhou nosso NFT. O valor de retorno da chamada do contrato é o próprio registro NFT. São praticamente os mesmos dados que enviamos, mostrados como armazenados na blockchain.

  • Notar que receiver_id tornou-se owner_id.
  • Todos os campos de metadados opcionais que não especificamos são definidos como null.
  • O campo approved_account_id listaria quaisquer outros usuários NEAR autorizados a manipular este NFT, mas nós não autorizamos ninguém, então essa lista está vazia.

Para ver todos os flarns que você possui, você pode chamar o contrato NFT com o seguinte comando near-cli:

near view $ID nft_tokens_for_owner '{"account_id": "'$ID'"}'
Enter fullscreen mode Exit fullscreen mode

Como este é o seu único Flarn até agora, o resultado será um array JSON contendo apenas o NFT que você já viu:

[
  {
    token_id: '0',
    owner_id: 'accountname.testnet',
    metadata: {
        title: 'Alice',
        description: 'Alice is uniquely adorable & loves long walks on the beach.',
        media: 'https://bafyreiabag3ztnhe5pg7js4bj6sxuvkz3sdf76cjvcuqjoidvnfjz7vwrq.ipfs.dweb.link/',
        media_hash: 'e8MzVN0Pq1ztofypQoperJC8gWo2xfs8f9few+SwHes=',
        copies: null,
        issued_at: null,
        expires_at: null,
        starts_at: null,
        updated_at: null,
        extra: null,
        reference: null,
        reference_hash: null
    },
    approved_account_ids: {}
  }
]
Enter fullscreen mode Exit fullscreen mode

Além disso, a carteira NEAR verificará automaticamente toda a rede em busca de NFTs que você possui, para que você possa ver seu novo Flarn em sua carteira, na guia Colecionáveis: Flarn NFT na carteira

Conclusão

Agora você implantou um contrato inteligente NFT-171 na rede de teste NEAR e cunhou um CryptoFlarn NFT. A partir daqui, você pode usar a CLI ou o NEAR Javascript SDK para transferir a propriedade desse token ou para criar mais tokens. Se seu próximo projeto NFT precisar de metadados mais complexos, você viu como isso pode ser adicionado.

Quando estiver pronto para divulgar seu novo contrato NFT, você pode facilmente indicar NEAR CLI na rede principal e implementar as mesmas etapas.

O código completo para este tutorial pode ser encontrado em GithubGenericName.

Próximos passos

A partir daqui você pode implementar uma interface web para mostrar seus NFTs, usando near-api-js para buscar os metadados das NFTs do seu contrato. Em seguida, você pode explorar outros subpadrões opcionais do NEP-171, como o Gerenciamento de Aprovação padrão (NEP-178) que permite autorizar marketplaces a negociar sua NFT em seu nome, ou o Royalties e Pagamentos padrão (NEP-199) que permite especificar como o produto de uma venda NFT deve ser distribuído.

Sobre o autor

Este tutorial foi criado por Mykle Hansen, colaborador do projeto Plantar que permite aos usuários cultivar e colher NFTs de plantas no NEAR.

Este artigo foi traduzido por Diogo Jorge. O artigo original pode ser encontrado aqui.


Image description

Top comments (0)