Esse artigo é uma tradução do original (https://examples.near.org/NFT), traduzido por Marcelo Creimer
Este repositório inclui um exemplo de implementação de um contrato de non-fungible token que utiliza padrões de contrato da Near e testes de simulação.
Pré-requisitos
Se você estiver usando Gitpod, você pode pular este passo.
- Certifique-se de que o Rust está instalado de acordo com os pré-requisitos em near-sdk-rs.
- Certifique-se de que near-cli está instalado.
Explorando este contrato
O código fonte deste contrato está em nft/lib.rs
. Ele fornece métodos para gerenciar o acesso aos tokens, transferir tokens, checar o acesso, e obter o proprietário do token. Note, alguma exploração futura dentro das macros rust é necessária para ver como um contrato de NonFungibleToken é implementado.
Construindo este contrato
Execute o seguinte, e nós iremos construir nosso projeto rust via cargo. Isto irá gerar nossos binários WASM dentro do seu diretório res/
. Este é o smart contract com o qual iremos fazer o deploy no blockchain NEAR blockchain mais tarde.
./build.sh
Testando este contrato
Nós temos alguns testes que podem ser rodados. O seguinte irá apenas rodar nossos simples testes para confirmar que o código do nosso contrato está funcionando.
cargo test -- --nocapture
Os testes de simulação mais complexos não são rodados com este comando, mas nós podemos encontrá-los em tests/sim
.
Usando este contrato
O _deploy _mais rápido
Você pode construir e fazer o deploy deste smart contract em uma conta de desenvolvimento. Dev Accounts são contas geradas automaticamente para ajudar no desenvolvimento e teste dos smart contracts. Por favor, veja a seção Standard deploy para criar uma conta mais personalizada onde fazer o seu deploy.
near dev-deploy --wasmFile res/non_fungible_token.wasm --helperUrl https://near-contract-helper.onrender.com
Nos bastidores isto está criando uma conta e fazendo o deploy do contrato nela. No console, repare em uma mensagem como:
Done deploying to dev-1234567890123
Nesta instância, a conta é dev-1234567890123. Um arquivo foi criado contendo um par de chaves para a conta, localizado em neardev/dev-account. Para facilitar os próximos poucos passos, vamos configurar uma variável de ambiente contendo esta id de conta de desenvolvimento e usá-la quando fizer os comandos de copia/cola. Rode este comando para a variável de ambiente:
source neardev/dev-account.env
Você saberá se sua variável de ambiente está corretamente configurada se sua linha de comando retorna o nome da conta após este comando:
echo $CONTRACT_NAME
O próximo comando irá inicializar o contrato usando o método new:
near call $CONTRACT_NAME new_default_meta '{"owner_id": "'$CONTRACT_NAME'"}' --accountId $CONTRACT_NAME
Para ver o metadata do NFT:
near view $CONTRACT_NAME nft_metadata
Deploy padrão
Faremos o deploy deste smart contract na sua conta NEAR. Para este exemplo, por favor crie uma nova conta NEAR. O NEAR permite a habilidade de fazer upgrade em contratos da mesma conta, por isso funções de inicialização devem ser limpas. Se você quiser rodar este exemplo em uma conta NEAR que já teve contratos implantados, por favor use o comando do near-cli, near delete, e então recrie-o na Wallet. Para criar (ou recriar) uma conta, por favor siga as instruções em Test Wallet ou (NEAR Wallet se você estiver usando a mainnet).
Na raiz do projeto, faça log in na sua mais nova conta criada com o near-cli seguindo as instruções depois deste comando.
near login
Para tornar este tutorial mais fácil de copiar/colar, nós vamos configurar uma variável de ambiente para a nossa conta. No comando abaixo, substitua MY_ACCOUNT_NAME com o nome da conta com a qual nós acabamos de nos conectarmos, incluindo o .testnet (ou .near para a mainnet):
ID=MY_ACCOUNT_NAME
Nós podemos saber se a variável de ambiente está configurada corretamente se a nossa linha de comando retornar o nome da conta após este comando:
echo $ID
Agora nós podemos fazer o deploy do contrato compilado neste exemplo para a nossa conta:
near deploy --wasmFile res/non_fungible_token.wasm --accountId $ID
O contrato do NFT deve ser inicializado antes de usado. Mais informações sobre metadata em 'nomicon.io'. Mas por enquanto nós inicializaremos com o metadata default.
near call $ID new_default_meta '{"owner_id": "'$ID'"}' --accountId $ID
Nós seremos capazes de ver nosso metadata logo depois:
near view $ID nft_metadata
Então, vamos cunhar nosso primeiro token. Isso irá criar um NFT baseado em Olympus Mons onde somente uma cópia existe:
near call $ID nft_mint '{"token_id": "0", "receiver_id": "'$ID'", "token_metadata": { "title": "Olympus Mons", "description": "Tallest mountain in charted solar system", "media": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Olympus_Mons_alt.jpg/1024px-Olympus_Mons_alt.jpg", "copies": 1}}' --accountId $ID --deposit 10
Transferindo nosso NFT
Vamos configurar uma conta para onde transferir nosso recém cunhado token. Esta conta será uma subconta da conta NEAR (à qual) nós nos conectamos originalmente via near login.
near create-account alice.$ID --masterAccount $ID --initialBalance 10
Checando tokens na conta de Alice:
near view $ID nft_tokens_for_owner '{"account_id": "'alice.$ID'"}'
Então iremos transferir o NFT para a conta de Alice. Exatamente 1 yoctoNEAR de depósito deve ser anexado:
near call $ID nft_transfer '{"token_id": "0", "receiver_id": "alice.'$ID'", "memo": "transfer ownership"}' --accountId $ID --deposit 0.000000000000000000000001
Checando a conta de Alice novamente, vemos que ela tem o token Olympus Mons.
Notas
- O valor máximo de saldo é limitado por U128 (2**128 - 1).
- Chamadas JSON podem passar U128 como uma string base-10. Ex.: "100".
- Isto não inclui a funcionalidade de escrow, já que ft_transfer_call fornece uma abordagem superior. Um sistema escrow pode, claro, ser adicionado como um contrato separado ou funcionalidades adicionais dentro deste contrato.
AssemblyScript
Atualmente, AssemblyScript não é suportado neste exemplo. Uma versão antiga pode ser encontrada no exemplo NEP4 example, mas isto não é recomendado já que está desatualizado e não segue os padrões que o NEAR SDK usa atualmente.
Oldest comments (2)
Cara, gostei muito do seu conteúdo e a propriedade que você explixa... Gostaria de fazer umas proposta, onde podemos conversar?
Olá Yann,
Agradeço sua consideração!!
Estou começando um novo trabalho, então no momento não estou considerando propostas.
Boa sorte!
Abraço