鑄造NFT就像是將我們的數字資產放到區塊鏈上。
鑄造NFT就像是將我們的數字資產放到區塊鏈上,這樣它們就可以在NFT交易市場上進行交易。
NFT鑄造體系結構看起來如何?
NFT 架構
Alchemy
Alchemy是一個中間件,它使開發人員可以更容易地進行區塊鏈通信。
在Alchemy https://www.alchemy.com/上創建一個免費帳戶,並使用他們的開發平台和API來請求區塊鏈。
Alchemy帳戶設置
Alchemy 註冊或登錄
通過選擇所需的區塊鍊網絡在Alchemy上創建一個新應用程序。
在Alchemy上創建一個新的應用程序
複製HTTP URL,因為我們需要它連接到區塊鍊網絡。
在Alchemy 上查看應用程序密鑰詳細信息
現在,我們需要將Polygon Mumbai 測試網添加到我們的metamask 帳戶。
將Alchemy URL 添加為RPC URL,並將鏈ID 設置為80001。可以在https://chainlist.org/中驗證鏈ID 。 MATIC 是Polygon 區塊鏈中處理的代幣。
Ethers.js
Ethers.js 是一個允許我們與以太坊區塊鏈交互的庫。
安裝ethers.js 如下所示:
npm install –save ethers
如何以去中心化的方式創建NFT?——使用IPFS,一個去中心化的存儲平台,我們將在其中存儲NFT 元數據。
IPFS & Pinata
IPFS是一個點對點協議,就像torrent一樣。
它去中心化了整個文件託管過程。當我們將一個文件上傳到IPFS時,它會分佈在每個節點上,然後這些節點就變成了一個服務器,這樣就沒有人可以刪除文件了。我們將NFT元數據託管在IPFS上。
Pinata是IPFS的一個接口,它使在IPFS上託管文件變得更容易。
我們可以上傳圖像文件和JSON元數據到Pinata。
在Pinata上創建一個免費帳戶:https://app.pinata.cloud/signin。
Pinata註冊或登錄
創建新的API密鑰來訪問它。我們將獲得一個API密鑰和一個密鑰。
在Pinata上創建API密鑰
現在讓我們深入研究NFT鑄造!
第一步:獲取一些假MATIC
由於區塊鏈交易是與gas費是綁定的,我們需要收集一些假的MATIC來鑄造我們的NFT。
從這裡得到一些假的MATIC: https://faucet.polygon.technology/。
其他可用的MATIC“水龍頭”:
https://faucet.pearzap.com/
https://matic.supply/
https://www.coinclarified.com/tools/faucets/polygon
https://faucet.firebird.finance/
第二步:創建一個.env 文件
.env 文件應包含以下詳細信息:
API_URL = “your alchemy URL”
PRIVATE_KEY = “metamask private key”
PUBLIC_KEY = “your metamask wallet address”
CONTRACT_ADDRESS =”deployed contract address”
PINATA_API_KEY = “pinata api key”
PINATA_SECRET_KEY = “pinata secret key”
第三步:創建您的nft.js 文件
將以下內容複製到文件中。
require(“dotenv”).config();
const fs = require(“fs”);
const FormData = require(“form-data”);
const axios = require(“axios”);
const { ethers } = require(“ethers”);//Grab the contract ABI
const contract = require(“../artifacts/contracts/ArGram.sol/ArGram.json”);const {
PINATA_API_KEY,
PINATA_SECRET_KEY,
API_URL,
PRIVATE_KEY,
PUBLIC_KEY,
CONTRACT_ADDRESS
} = process.env;
首先,確保我們已經成功地驗證了Pinata API。
const authResponse = await
axios.get(“https://api.pinata.cloud/data/testAuthentication”, {
headers: {
pinata_api_key: PINATA_API_KEY,
pinata_secret_api_key: PINATA_SECRET_KEY, },
});
我們的authResponse應該包含“恭喜! 你正在與Pinata API通信!”
現在,從本地系統讀取圖像文件。
const stream = fs.createReadStream(req.file.path);
const data = new FormData();
data.append(“file”, stream);
使用pinFile API將圖像文件上傳到IPFS。如果成功,它將返回一個哈希碼。
const fileResponse = await axios.post(“https://api.pinata.cloud/pinning/pinFileToIPFS”, data, {
headers: {
“Content-Type”: multipart/form-data; boundary= ${data._boundary},
pinata_api_key: PINATA_API_KEY,
pinata_secret_api_key: PINATA_SECRET_KEY,
},
});
const { data: fileData = {} } = fileResponse;
const { IpfsHash } = fileData;
const fileIPFS= https://gateway.pinata.cloud/ipfs/${IpfsHash};
我們的fileIPFS應該類似於https://gateway.pinata.cloud/ipfs/
例如:https://gateway.pinata.cloud/ipfs/QmeK8t9Lom2AcH8s7gLpuZordcxisegwkcSJpqL46S87uC。
現在我們可以使用pinJSON API將JSON元數據上傳到IPFS。如果成功,它將返回一個哈希碼,我們將使用該哈希碼作為token URI進行鑄造。
//Create NFT metadata JSON
const metadata = {
image: https://gateway.pinata.cloud/ipfs/QmeK8t9Lom2AcH8s7gLpuZordcxisegwkcSJpqL46S87uC”,
name: “MyArGramNFT”,
description: “MyArGramNFT Description”,
attributes: [
{ “trait_type”: “color”, “value”: “brown”},
{ “trait_type”: “background”, “value”: “white”}
]
}const pinataJSONBody = {
pinataContent: metadata
};
const jsonResponse = await axios.post(“https://api.pinata.cloud/pinning/pinJSONToIPFS”, pinataJSONBody, {
headers: {
“Content-Type”: `application/json`,
pinata_api_key: PINATA_API_KEY,
pinata_secret_api_key: PINATA_SECRET_KEY,
},
});
const { data: jsonData = {} } = jsonResponse;
const { IpfsHash } = jsonData;
const tokenURI = `https://gateway.pinata.cloud/ipfs/${IpfsHash}`;
我們的tokenURI應該類似於https://gateway.pinata.cloud/ipfs/
例如:https://gateway.pinata.cloud/ipfs/QmammqqQDpmk4oAuyfgJA9Ni7ChEzxEkmzQLLhjbGAKHax。
最後,我們可以創建我們從IPFS json上傳獲得的tokenURI。調用我們在智能合約中編寫的mintNFT方法。參考以下智能合約:
使用我們的私鑰簽署交易。
const provider = new ethers.providers.JsonRpcProvider(API_URL);
const wallet = new ethers.Wallet(PRIVATE_KEY, provider);
const etherInterface = new ethers.utils.Interface(contract.abi);// Get latest nonce
const nonce = await provider.getTransactionCount(PUBLIC_KEY, “latest”);// Get gas price
const gasPrice = await provider.getGasPrice();// Get network
const network = await provider.getNetwork();
const { chainId } = network;//Transaction object
const transaction = {
from: PUBLIC_KEY,
to: CONTRACT_ADDRESS,
nonce,
chainId,
gasPrice,
data: etherInterface.encodeFunctionData(“mintNFT”,
[ PUBLIC_KEY, tokenURI ])
};//Estimate gas limit
const estimatedGas = await provider.estimateGas(transaction);
transaction[“gasLimit”] = estimatedGas;//Sign & Send transaction
const signedTx = await wallet.signTransaction(transaction);
const transactionReceipt = await provider.sendTransaction(signedTx);
await transactionReceipt.wait();
const hash = transactionReceipt.hash;
console.log(“Your Transaction Hash is:”, hash);// Get transaction receipt
const receipt = await provider.getTransactionReceipt(hash);
const { logs } = receipt;// Get token ID
const tokenInBigNumber = ethers.BigNumber.from(logs[0].topics[3]);
const tokenId = tokenInBigNumber.toNumber();
console.log(“Token ID minted:”, tokenId);
我們會得到這樣的回复:
YourTransactionHashis:0x9732ca53cfb6b8e29e13873b51407f431bc798cbe3abe82ea110c0e5924506c8 Token ID minted: 1
Source:https://medium.com/coinmonks/mint-an-nft-in-a-decentralized-manner-using-alchemy-ethers-js-pinata-apis-da69a3b83d84
展開全文打開碳鏈價值APP 查看更多精彩資訊