以去中心化的方式铸造 NFT——使用 Alchemy、Ethers.js 和 Pinata API

铸造NFT就像是将我们的数字资产放到区块链上,这样它们就可以在NFT交易市场上进行交易。

铸造NFT就像是将我们的数字资产放到区块链上,这样它们就可以在NFT交易市场上进行交易。

NFT铸造体系结构看起来如何?

1.png

​ NFT 架构

Alchemy

Alchemy是一个中间件,它使开发人员可以更容易地进行区块链通信。

在Alchemy https://www.alchemy.com/上创建一个免费帐户,并使用他们的开发平台和API来请求区块链

Alchemy帐户设置

2.png

​ Alchemy 注册或登录

通过选择所需的区块链网络在 Alchemy上创建一个新应用程序。

3.png

​ 在Alchemy上创建一个新的应用程序

复制HTTP URL,因为我们需要它连接到区块链网络。

4.png

​ 在 Alchemy 上查看应用程序密钥详细信息

现在,我们需要将 Polygon Mumbai 测试网添加到我们的 metamask 帐户。

将 Alchemy URL添加为RPC URL,并将链 ID设置为80001。可以在https://chainlist.org/中验证链ID。MATIC是Polygon区块链中处理的代币。

5.png

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

6.png

​ Pinata注册或登录

创建新的API密钥来访问它。我们将获得一个API密钥和一个密钥。

7.png

​ 在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

关于

ChinaDeFi - ChinaDeFi.com 是一个研究驱动的DeFi创新组织,同时我们也是区块链开发团队。每天从全球超过500个优质信息源的近900篇内容中,寻找思考更具深度、梳理更为系统的内容,以最快的速度同步到中国市场提供决策辅助材料。

本文首发于:https://mp.weixin.qq.com/s/5ARtPgLMDZeK_tmV1Tttew

点赞 3
收藏 4
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

1 条评论

请先 登录 后评论
ChinaDeFi 去中心化金融社区
ChinaDeFi 去中心化金融社区
ChinaDeFi.com 是一个研究驱动的DeFi创新组织,同时我们也是区块链开发团队。每天从全球超过500个优质信息源的近900篇内容中,寻找思考更具深度、梳理更为系统的内容,以最快的速度同步到中国市场提供决策辅助材料。