Nós já vimos como podemos criar NFTs a partir do frontend usando APIs SHYFT com eficiência. Algumas vezes, podemos ter um cenário de caso de uso diferente onde temos todos os dados disponíveis no backend e temos que criar o NFT diretamente do backend. Este tutorial mostra um desses cenários de caso de uso onde criamos NFTs diretamente do backend usando APIs SHYFT.
Pré-requisitos
Autenticação: Obtendo sua chave API Shyft
x-api-key
é um parâmetro de autenticação, que lhe dá acesso às APIs SHYFT. Você pode obter sua própria chave API no SHYFT website. Basta se inscrever com seu ID de e-mail aqui e você pode obtê-lo gratuitamente.
Pacotes NPM Necessários
- path — Este pacote é usado para ler a imagem a partir de um caminho determinado.
- axios — Este pacote é usado para fazer a chamada da API. Você também pode usar qualquer outro método ou pacote de acordo com sua necessidade.
- @solana/web3.js e @metaplex/js — Estes são necessários para assinar a transação do backend do aplicativo que está solicitando a API.
A chamada da API
Para criar NFTs a partir do backend vamos usar a seguinte API :
POST https://api.shyft.to/sol/v1/nft/create
Essa API aceita os seguintes detalhes do NFT que deve ser criado no formato multipart/form-data
:
-
network
: Especifica a instância da rede Solana, que pode ser devnet, testnet ou mainnet-beta. -
wallet
: Aceita o endereço da carteira do criador do NFT. Essa carteira terá oupdate_authority
do NFT. -
name
: Nome do NFT a ser criado. -
symbol
: Símbolo do NFT a ser criado. -
description
: Uma pequena descrição sobre o NFT que estamos criando. -
attributes
: Aceita os atributos do NFT de acordo com seu tipo de característica e valor. Confira abaixo uma amostra para o formato. -
external_url
: qualquer URL externo associado ao NFT. -
max_supply
: Número de edições do NFT criado atualmente que podem ser cunhados. Se definido como0
, cria NFTs únicos. -
royalty
: Especifica o royalty do criador em porcentagem, sendo um valor entre 0 - 100. -
nft_receiver
: Especifica a carteira para a qual o NFT será cunhado. Se deixado em branco, será cunhado na carteira cujaprivate_key
tenha sido fornecida. -
service_charge
: Especifica um valor em SOL, que pode ser cobrado durante a criação dos NFTs. Este parâmetro é opcional.
Para mais detalhes sobre nossas APIs, consulte a Documentação da API SHYFT ou você também pode verificar nossa documentação aqui.
Supondo que tenhamos todos os dados disponíveis no backend, vamos criar um novo FormData object
e anexar todos os dados necessários para criar o NFT. (Usamos dados estáticos para fins de demonstração)
const data = new FormData();
data.append('network', 'devnet');
data.append('wallet', 'WALLET_ADDRESS_OF_NFT_CREATOR'); //carteira com cuja chave privada precisaremos para assinar a Txn
data.append('name', 'TrendySkeleton');
data.append('symbol', 'TSK');
data.append('description', 'hair on fire problem solving');
data.append('attributes', '[{"trait_type": "speed", "value": 100},\n{"trait_type": "aggression", "value": "crazy"},\n{"trait_type": "energy", "value": "very high"}]');
data.append('external_url', 'https://shyft.to/');
data.append('max_supply', '1');
data.append('royalty', '10');
data.append('file', fs.createReadStream(path.resolve(__dirname, './images/index.png')));
data.append('receiver', 'B6CxZxad7JLKE5QvQo3D6Pc3qox3UyhRy5bu97HgKN9N');
Enviando Dados da Imagem
Observe que usamos a função createReadStream
com o caminho da imagem para abrir e ler os dados no arquivo/stream. A função path.resolve()
foi usada para resolver o caminho relativo fornecido para a imagem. Alternativamente, para usar caminhos absolutos como 'D:/index.png’, teremos que usar a função path.join()
.
data.append('file', fs.createReadStream(path.join('D:/index.png')));
Também podemos obter os dados da imagem em um formato de fluxo legível de um URI externo, mas, para isso, precisaríamos de alguns passos extras. Primeiro, teremos que buscar os dados da imagem em um formato de fluxo legível. Algo assim:
const imgData = await axios.get('https://www.arweave.net/GZtct3fpYUlB9ZT92SMkVEp7TUvLlFV-kke4f5I5D9E?ext=jpg', { responseType: 'stream' });
Uma vez que essa solicitação tenha sido executada com sucesso, prosseguimos e anexamos o imgData.data
para o objeto FormData, para que possa ser repassado como um parâmetro para fazer a chamada da API do NFT criado.
data.append('file', imgData.data, 'test.jpg');
Feito isso, agora estamos prontos para fazer a chamada da API. Usamos o pacote axios
para fazer a chamada da API, mas você pode usar qualquer outro método conforme sua necessidade. Além disso, observe que temos que definir o Content_type
para multipart/form-data
no cabeçalho e temos que aprovar a x-api-key
obtida no SHYFT website.
Aqui está a chamada da API:
const response = await axios.post('<https://api.shyft.to/sol/v1/nft/create>', data, { headers: {
'Content-Type': 'multipart/form-data',
'x-api-key': YOUR_API_KEY,
} });
console.log('data', response.data); // exibindo a resposta
Uma vez executado com sucesso, deve retornar uma resposta um tanto semelhante a esta. A mint
retornada na resposta é o endereço do NFT que será criado. A função retorna uma encoded_transaction
que precisa de uma assinatura da carteira do criador para ser executada com sucesso.
data {
success: true,
message: 'NFT mint request generated successfully',
result: {
encoded_transaction: 'AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC27JVbuNHIOEULfw1sgRQuvvJQ0IUXS/YSIqY9xmKYvrLePqCGb1KyFnPAILISfg5azLgpYsfD99Q5jCspVP8MAgAFCpXqS1o4B7cm8SUpVIGtSepqRLjd4BxsljsfhTo2dtWZxNJgpx/pX0uOUYLw72dzlimFx29mhXDNLSkv2td91yiIHz20cJSaZwOfQ8MQeB4U9MctSSdHEoMhEPzRhjgDrJYDGATvNDyoI/kL4kcQhLPqeWdwwmPzTIDLQtI2QfVmyheA5Q4iB7L3q6RRFUrXtLhJMGZ74uk9Lu7OAVAlCJ8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIyXJY9OJInxuz0QKRSODYMLWhOZ2v8QhASOe9jb6fhZC3BlsePRfEU4nVJ/awTDzVi4bHMaoP21SbbRvAP4KUYGp9UXGSxcUSGMyUw9SvF/WNruCJuh/UTj29mKAAAAAAbd9uHXZaGT2cvhRs7reawctIXtX1s3kTqM9YV+/wCpfqIKPSLEnjgG9GkYttVKxRMSaOeF5IYaiSXPga0YgOcGBQIAATQAAAAAYE0WAAAAAABSAAAAAAAAAAbd9uHXZaGT2cvhRs7reawctIXtX1s3kTqM9YV+/wCpCQIBCEMAAJXqS1o4B7cm8SUpVIGtSepqRLjd4BxsljsfhTo2dtWZAZXqS1o4B7cm8SUpVIGtSepqRLjd4BxsljsfhTo2dtWZBgcABAABBQkIAAkDAQQACQcBAAAAAAAAAAcHAgEAAAAFCKIBEA4AAABUcmVuZHlTa2VsZXRvbgMAAABUU0tYAAAAaHR0cHM6Ly9uZnRzdG9yYWdlLmxpbmsvaXBmcy9iYWZrcmVpZ2syY2hncmRpc2E3YXB0dGNsZHl3bm1mNHM1azJrY2lpZHc1eHlnMnl4bTJ4NGhtYTU2NOgDAQEAAACV6ktaOAe3JvElKVSBrUnqakS43eAcbJY7H4U6NnbVmQFkAAABBwkDAQAAAAIJBQgKEQEBAAAAAAAAAA==',
mint: 'EFJy8TKnbn7UXKK5YUacrb38KuyLB7m8mWnZ9nr9RQSb'
}
}
Assinando a transação
Essa encoded_transaction recebida pode ser assinada usando esta função
async function confirmTransactionFromBackend(network, encodedTransaction, privateKey) {
const connection = new Connection(clusterApiUrl(network), 'confirmed');
const feePayer = Keypair.fromSecretKey(decode(privateKey));
const wallet = new NodeWallet(feePayer);
const recoveredTransaction = Transaction.from(
Buffer.from(encodedTransaction, 'base64')
);
const signedTx = await wallet.signTransaction(recoveredTransaction);
const confirmTransaction = await connection.sendRawTransaction(
signedTx.serialize()
);
return confirmTransaction;
}
Esta função obtém na rede (devnet, testnet ou mainnet-beta), a chave privada da carteira da entidade e a encoded_transaction
e assina a transação usando a chave privada. Você pode ler mais sobre a assinatura de transações em nosso guia de desenvolvedores aqui. Você também pode encontrar todas as funções relacionadas à assinatura de transações no GitHub aqui. Uma vez assinada com sucesso, o NFT será criado.
Isso é praticamente tudo sobre este tutorial. Se você seguir este tutorial passo a passo, poderá criar um novo NFT com sucesso a partir do backend.
Se você gostou deste tutorial, fique à vontade para consultar nossos tutoriais de API em Building your first NFT dApp (como criar seu primeiro dApp de NFT) ou Building your own NFT marketplace (como criar seu próprio mercado de NFT).
Fontes
SHYFT API Documentation (Documentação SHYFT API)
Get API Key (Obtenha a Chave API)
Junte-se a nosso Discord
Espero que você se divirta criando aplicativos com APIs SHYFT. Feliz Hacking!! 😇
Esse artigo foi escrito pelo Team Shyft e traduzido por Fátima Lima. O original pode ser lido aqui.
Latest comments (0)