以去中心化的方式鑄造NFT

鑄造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 查看更多精彩資訊

Total
0
Shares
Related Posts